Resumo dos pontos de adaptação do iOS 13

iOS 13 suporta modelos compatíveis

  • iPhone X 、 iPhone XR 、 iPhone XS 、 iPhone XS Max
  • iPhone 8 、 iPhone 8 Plus
  • iPhone 7 、 iPhone 7 Plus
  • iPhone 6s 、 iPhone 6s Plus
  • iPhone SE
  • iPod touch (7ª geração)

Adaptação de novo recurso

1. Modo escuro

O iOS 13 introduz o modo escuro, UIKitfornece novas cores de sistema e API para se adaptar a diferentes modos de cor e xcassetsajusta a adaptação do material. Para adaptação específica, consulte: Implementando o modo escuro no iOS
.

2. Faça login com a Apple

O Sign In with Apple estará disponível para testes beta neste verão. Será necessário como uma opção para usuários em aplicativos que suportam login de terceiros quando estiver disponível comercialmente ainda este ano.

Se o seu aplicativo suportar o uso de login de terceiros, você deverá adicionar o novo método de login da Apple:
Apresentando o Login com a Apple . No momento, a Apple apenas menciona que ele deve ser adicionado quando for oficialmente lançado em Notícias e Atualizações , e o tempo de lançamento específico ainda não foi determinado.

Adaptação API

1. O método privado KVC não é permitido

No iOS 13, não é mais permitido usar valueForKeyou setValue:forKey:outros métodos para obter ou definir propriedades privadas. Embora a compilação possa passar, ela travará diretamente no tempo de execução e exibirá as informações de travamento:

// 使用的私有方法
[_textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];

// 崩溃提示信息
*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug' 

A solução só pode ser usar outros métodos:

// 替换的方案
_textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"输入"attributes:@{NSForegroundColorAttributeName: [UIColor redColor]}]; 

2. O formato obtido pelo dispositivo pushToken foi alterado

Poderia ter o NSDatatipo direto deviceTokenconvertido em NSStringuma string e, em seguida, substituir os símbolos em excesso:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [deviceToken description];
    for (NSString *symbol in @[@" ", @"<", @">", @"-"]) {
        token = [token stringByReplacingOccurrencesOfString:symbol withString:@""];
    }
    NSLog(@"deviceToken:%@", token);
}

No iOS 13, esse método não é mais válido e NSDataa string convertida do tipo deviceToken torna-se:

{length = 32, bytes = 0xd7f9fe34 69be14d1 fa51be22 329ac80d ... 5ad13017 b8ad0736 } 

A necessidade de um formato de processamento de dados, práticas de referência da Liga de Amigos , sistemas antigos e novos podem ser adaptados para obter o seguinte:

#include <arpa/inet.h>
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    if (![deviceToken isKindOfClass:[NSData class]]) return;
    const unsigned *tokenBytes = [deviceToken bytes];
    NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                          ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                          ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                          ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
    NSLog(@"deviceToken:%@", hexToken);
}

Adaptação de engenharia

1. O processamento da linha preta UISearchBar causa um travamento

Para lidar com o problema da linha preta da caixa de pesquisa, ela geralmente atravessa as subViews da searchBar, encontra e exclui UISearchBarBackground. Fazer isso no iOS13 fará com que a renderização da IU falhe e, em seguida, trave diretamente. As informações de falha são as seguintes:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Missing or detached view for search bar layout'

A solução é de conjunto UISearchBarBackgroundem layer.contentsque nil:

for (UIView *view in _searchBar.subviews.lastObject.subviews) {
    if ([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        // [view removeFromSuperview];
        view.layer.contents = nil;
        break;
    }
} 

2. Usar UISearchDisplayController causa um travamento

Antes do iOS 8, tínhamos UITableViewa necessidade de usar uma caixa de pesquisa UISearchBar+ UISearchDisplayControllercombinação, mas depois do iOS 8, a Apple lançou em UISearchControllervez da combinação. No iOS 13, se você continuar a usar UISearchDisplayControllerlevará diretamente ao colapso, as informações de falha são as seguintes:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'UISearchDisplayController is no longer supported when linking against this version of iOS. Please migrate your application to UISearchController.' 

Além disso, no iOS 13 você pode finalmente obter a caixa de texto para acesso direto à pesquisa:

_searchBar.searchTextField.text = @"search";

3. Alteração da interação padrão do pop-up modal

Na UIModalPresentationStyledefinição da enumeração do iOS 13 , a Apple adicionou um novo valor de enumeração:

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
    ...
    UIModalPresentationAutomatic API_AVAILABLE(ios(13.0)) = -2,
}; 

Nesse valor de enumeração, o iOS 13 se torna diretamente o padrão pop-up modal, portanto, o presentViewControllerefeito de paralaxe da visualização aberta é o seguinte, o padrão é retornar declínio.

present.gif

 

A parte da barra de navegação da página que aparece modal é cortada, e você também pode ver no storyboard que o conteúdo da barra de navegação será obscurecido.

storyboard

Se você precisar fazer uma interface de exibição de tela inteira, precisará definir manualmente o estilo de pop-up:

- (UIModalPresentationStyle)modalPresentationStyle {
    return UIModalPresentationFullScreen;
} 

Uma coisa a notar é que tínhamos uma página pop-up em estilo de tela inteira, essa página irá aparecer e, por sua vez, chamará ViewController viewWillDisappeare viewDidDisappear. Quando a página for descartada, aparecerá que ele é o ViewController viewWillAppeare viewDidAppearserá chamado em sequência. No entanto, ao usar o efeito de paralaxe padrão para abrir a página, o ViewController que a abriu não chama esses métodos.O código originalmente escrito nessas quatro funções pode ter problemas no futuro.

4. Mudança de estilo padrão UISegmentedControl

O estilo padrão torna-se preto em um fundo branco. Se a cor for alterada, a página precisa ser modificada.

segment.png


Originalmente configurado para selecionar a cor tintColorexpirada, foi adicionado o atributo selectedSegmentTintColor para modificar a cor selecionada.

 

5. MPMoviePlayerController está obsoleto

Reproduzir vídeo pode ser usado antes do iOS 9 MediaPlayer.frameworkna classe MPMoviePlayerController para ser concluído, ele suporta vídeo local e reprodução de vídeo em rede. No entanto, ele está obsoleto desde o iOS 9. Se continuar a ser usado no iOS 13, uma exceção será lançada diretamente:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'MPMoviePlayerController is no longer available. Use AVPlayerViewController in AVKit.'

A solução é usar AVFoundationdentro AVPlayer.

6. LaunchImage está obsoleto

Antes do iOS 8, estávamos LaunchImageconfigurando o mapa de lançamento, mas com o aumento do tamanho dos dispositivos Apple, precisamos colocar todos os tamanhos de mapas de lançamento nos aseets correspondentes, o que é uma etapa muito tediosa. Portanto, foi introduzido pela Apple no iOS 8. LaunchScreen.storyboardEle suporta AutoLayout+ para layout de interface SizeClass, que pode ser facilmente adaptado para várias telas.

tela de lançamento

Deve-se observar que a Apple mencionou na seção Modernizando sua IU para iOS 13 que, a
partir de abril de 2020, todos os aplicativos que suportam iOS 13 devem ser fornecidos LaunchScreen.storyboard, caso contrário, eles não serão enviados à App Store para aprovação.

7. O projeto criado pelo Xcode 11 é executado com uma tela preta em dispositivos de versão inferior

Usando o projeto criado pelo Xcode 11, selecione o dispositivo abaixo do iOS 13.0 como o dispositivo em execução e uma tela preta aparecerá ao executar o aplicativo. Isso ocorre porque o Xcode 11 é criado por padrão UIScenepara gerenciar vários UIWindowaplicativos, além de projetar AppDelegatefora será mais um SceneDelegate:

UIScene


Isso é para preparar um iPadOS multi-processo, que UIWindownão está mais UIApplicationem gerenciamento. Mas a versão antiga não UIScene, então a solução está no AppDelegatearquivo de cabeçalho adicionar:

 

@property (strong, nonatomic) UIWindow *window;

Adaptação SDK

1. @availablecausar versões mais antigas do erro do compilador Xcode.

No código de projeto Xcode SDK que usa 11 @availablepara determinar a versão atual do sistema, jogando fora do saco no compilador Xcode 10, um erro será sobre:

Undefine symbols for architecture i386:
    "__isPlatformVersionAtLeast", referenced from:
        ...
ld: symbol(s) not found for architecture i386

Mensagem de erro do ponto de vista, é __isPlatformVersionAtLeasto método sem implementação específica, mas não há projeto neste método. O teste real, sempre que usar @availablee usar o Xcode 11 empacotado em uma DLL ou biblioteca estática, adicione a biblioteca empacotada ao compilador Xcode 10 com este erro, pode ser julgado iOS 13 de @availableimplementação usado na nova API. Se o seu SDK precisa se adaptar à versão antiga do Xcode, você precisa evitar esse método e julgar obtendo a versão do sistema:

if ([UIDevice currentDevice].systemVersion.floatValue >= 13.0) {
    ...
}

Além disso, abrir o projeto SDK no Xcode 10 também deve ser capaz de compilar normalmente, o que requer a adição de macros de compilação para processamento:

#ifndef __IPHONE_13_0
#define __IPHONE_13_0 130000
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
...
#endif

referências

Este artigo combina o conteúdo dos seguintes documentos e problemas pessoais para resumir problemas de adaptação comuns

Acho que você gosta

Origin blog.csdn.net/wangletiancsdn/article/details/101284170
Recomendado
Clasificación