- Acessando Propriedades Privadas via KVC
No Xcode 11, a utilização do método setValue:forKeyPath: para acessar propriedades privadas pode causar falhas em tempo de compilação. Um exemplo comum é:
[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"]; // Falha
[textField setValue:[UIFont systemFontOfSize:14] forKeyPath:@"_placeholderLabel.font"]; // Falha
No entanto, o método setValue:forKey: continua a funcionar normalmente:
[self setValue:baseTabBar forKey:@"tabBar"]; // Funciona
- Descontinuação do LaunchImage
Com a crescente diversidade de dispositivos Apple, o uso do LaunchImage para definir a imagem de inicialização tornou-se inadequado. A abordagem recomendada é utilizar o LaunchScreen, introduzido no iOS 8. O LaunchScreen suporta AutoLayout e Size Classes, tornando sua implementação mais flexível e eficiente. Espera-se que, a partir de abril do próximo ano, todos os aplicativos sejam obrigados a fornecer um LaunchScreen.
- Abandono Completo do UIWebView
A partir do iOS 13, o UIWebView não é mais suportado. Anteriormente, o UIWebView já era desaconselhado pela Apple devido a problemas de vazamento de memória, com o WKWebView sendo a alternativa recomendada. Agora, seu uso resultará em notificações da App Store sobre a obsolescência das APIs. É crucial migrar para o WKWebView.
- Comportamento do PresentViewController
No iOS 13, o presentViewController introduziu um efeito de paralaxe padrão, permitindo que as apresentações modais sejam descartadas deslizando para baixo. Páginas que exigem confirmação para serem dispensadas precisam de adaptação. Se a altura de uma página programada for igual à altura da tela, a altura adicional da barra de navegação pode causar problemas. Para mitigarr isso, defina manualmente o estilo de apresentação:
self.modalPresentationStyle = UIModalPresentationFullScreen;
- Adaptação ao Modo Escuro
O iOS 13 introduziu o modo escuro, exigindo esforço adicional dos desenvolvedores para adaptar seus aplicativos, especialmente os de grande porte. Caso a adaptação completa não seja viável no momento, é possível desabilitar globalmente o modo escuro configurando o arquivo Info.plist. Adicione a chave UIUserInterfaceStyle com o valor Light.
- Solicitação de Permissão de Bluetooth
Anteriormente ao iOS 13, o uso do Bluetooth não exigia uma solicitação de permissão explícita. No iOS 13, é necessário adicionar a descrição da permissão no arquivo Info.plist:
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Precisamos acessar seu Bluetooth</string>
- Obtenção do DeviceToken
O formato do DeviceToken obtido sofreu alterações. O código a seguir demonstra como processar o NSData para obter uma representação hexadecimal:
#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(@"Device token: %@", hexToken);
}
- Descontinuação do MPMoviePlayerController
O MPMoviePlayerController foi descontinuado a partir do iOS 9 e seu uso no iOS 13 resultará em uma exceção.
- Descontinuação do UISearchDisplayController
Antes do iOS 8, a funcionalidade de busca em UITableView era implementada com a combinação de UISearchBar e UISearchDisplayController. O iOS 8 introduziu o UISearchController como substituto. Utilizar o UISearchDisplayController no iOS 13 levará a um erro de terminação com a seguinte mensagem: "UISearchDisplayController is no longer supported when linking against this version of iOS. Please migrate your application to UISearchController." A solução é migrar para o UISearchController.
- Descontinuação da API [UIApplication sharedApplication].keyWindow
A propriedade keyWindow da instância sharedApplication foi marcada como obsoelta para aplicativos que suportam múltiplas cenas. A Apple recomenda utilizar o seguinte código para obter a janela principal:
[[[UIApplication sharedApplication] windows] objectAtIndex:0]