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, UIKit
fornece novas cores de sistema e API para se adaptar a diferentes modos de cor e xcassets
ajusta 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 valueForKey
ou 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 NSData
tipo direto deviceToken
convertido em NSString
uma 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 NSData
a 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 UISearchBarBackground
em layer.contents
que 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 UITableView
a necessidade de usar uma caixa de pesquisa UISearchBar
+ UISearchDisplayController
combinação, mas depois do iOS 8, a Apple lançou em UISearchController
vez da combinação. No iOS 13, se você continuar a usar UISearchDisplayController
levará 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 UIModalPresentationStyle
definiçã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 presentViewController
efeito 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 viewWillDisappear
e viewDidDisappear
. Quando a página for descartada, aparecerá que ele é o ViewController viewWillAppear
e viewDidAppear
será 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 tintColor
expirada, 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.framework
na 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 AVFoundation
dentro AVPlayer
.
6. LaunchImage está obsoleto
Antes do iOS 8, estávamos LaunchImage
configurando 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.storyboard
Ele 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 UIScene
para gerenciar vários UIWindow
aplicativos, além de projetar AppDelegate
fora será mais um SceneDelegate
:
UIScene
Isso é para preparar um iPadOS multi-processo, que UIWindow
não está mais UIApplication
em gerenciamento. Mas a versão antiga não UIScene
, então a solução está no AppDelegate
arquivo de cabeçalho adicionar:
@property (strong, nonatomic) UIWindow *window;
Adaptação SDK
1. @available
causar versões mais antigas do erro do compilador Xcode.
No código de projeto Xcode SDK que usa 11 @available
para 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, é __isPlatformVersionAtLeast
o método sem implementação específica, mas não há projeto neste método. O teste real, sempre que usar @available
e 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 @available
implementaçã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