Resumen de los puntos de adaptación de iOS 13

iOS 13 admite modelos compatibles

  • 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 (séptima generación)

Adaptación de nuevas funciones

1. Modo oscuro

iOS 13 introduce el modo oscuro, UIKitproporciona nuevos colores del sistema y api para adaptarse a diferentes modos de color y xcassetsajusta la adaptación del material. Para una adaptación específica, consulte: Implementación del modo oscuro en iOS
.

2. Iniciar sesión con Apple

Iniciar sesión con Apple estará disponible para pruebas beta este verano. Será necesario como una opción para los usuarios de aplicaciones que admitan el inicio de sesión de terceros cuando esté disponible comercialmente a finales de este año.

Si su aplicación admite el inicio de sesión de terceros, debe agregar el nuevo método de inicio de sesión de Apple:
Introducción a Iniciar sesión con Apple . En la actualidad, Apple solo menciona que debe agregarse cuando se publique oficialmente en Noticias y actualizaciones . El tiempo de lanzamiento específico aún no se ha determinado.

Adaptación API

1. No se permite el método privado KVC

En iOS 13 ya no está permitido usar valueForKeyu setValue:forKey:otros métodos para obtener o establecer propiedades privadas. Aunque la compilación puede pasar, se bloqueará directamente en tiempo de ejecución y solicitará la información del bloqueo:

// 使用的私有方法
[_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' 

La solución solo puede ser utilizar otros métodos:

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

2. El formato obtenido por el deviceToken enviado ha cambiado

Podría tener el NSDatatipo directo deviceTokense convierte en NSStringuna cadena, y luego reemplazar los símbolos sobrantes:

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

En iOS 13, este método ya no es válido y NSDatala cadena convertida del tipo deviceToken se convierte en:

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

La necesidad de un formato de procesamiento de datos, prácticas de referencia de League of Friends , sistemas antiguos y nuevos se pueden adaptar para obtener lo siguiente:

#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);
}

Adaptación de ingeniería

1. El procesamiento de línea negra de UISearchBar provoca un bloqueo

En el pasado, para tratar el problema de la línea negra del cuadro de búsqueda, las subViews de la barra de búsqueda generalmente se atravesaban, se encontraban y se UISearchBarBackgroundeliminaban. Al hacerlo en iOS13, la representación de la interfaz de usuario fallaba y luego se bloqueaba directamente. La información de falla es la siguiente:

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

La solución es conjunto UISearchBarBackgrounden layer.contentscomo nil:

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

2. El uso de UISearchDisplayController provoca un bloqueo

Antes de iOS 8, teníamos UITableViewla necesidad de usar un cuadro de búsqueda UISearchBar+ UISearchDisplayControllercombinación, pero después de iOS 8, Apple se lanzó en UISearchControllerlugar de la combinación. En iOS 13, si continúa UISearchDisplayControllerusándolo conducirá directamente al colapso, la información del bloqueo es la siguiente:

*** 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.' 

Además, en iOS 13 finalmente puede obtener el cuadro de texto para acceder directamente a la búsqueda:

_searchBar.searchTextField.text = @"search";

3. Cambio de interacción predeterminado de la ventana emergente modal

En UIModalPresentationStylela definición de la enumeración de iOS 13 , Apple agregó un nuevo valor de enumeración:

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

En este valor de enumeración, iOS 13 se convierte directamente en la ventana emergente modal predeterminada, por lo que el presentViewControllerefecto de paralaje de la vista abierta es el siguiente, el valor predeterminado es devolver la disminución.

present.gif

 

La parte de la barra de navegación de la página que aparece en modal está cortada, y también puede ver en el guión gráfico que el contenido de la barra de navegación se oscurecerá.

guion gráfico

Si necesita crear una interfaz de pantalla completa, debe configurar manualmente el estilo de la ventana emergente:

- (UIModalPresentationStyle)modalPresentationStyle {
    return UIModalPresentationFullScreen;
} 

Una cosa a tener en cuenta es que teníamos una página emergente de estilo de pantalla completa, esta página aparecerá que a su vez llamará a ViewController viewWillDisappeary viewDidDisappear. Cuando se cierra la página, aparecerá una ventana emergente que indica que es ViewController viewWillAppeary viewDidAppearse llamará en secuencia. Sin embargo, cuando se usa el efecto de paralaje predeterminado para mostrar la página, el ViewController que lo hizo no llama a estos métodos. El código escrito originalmente en estas cuatro funciones puede tener problemas en el futuro.

4. Cambio de estilo predeterminado de UISegmentedControl

El estilo predeterminado se vuelve negro sobre un fondo blanco. Si se cambia el color, la página debe modificarse.

segmento.png


Configurado originalmente para seleccionar el color tintColorha expirado, se agregó el atributo selectedSegmentTintColor para modificar el color seleccionado.

 

5. MPMoviePlayerController está obsoleto

Play video se puede usar antes de iOS 9 MediaPlayer.frameworken la clase MPMoviePlayerController para completar, admite video local y reproducción de video en red. Sin embargo, ha quedado obsoleto desde iOS 9. Si continúa utilizándose en iOS 13, se lanzará una excepción directamente:

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

La solución es usar en el AVFoundationinterior AVPlayer.

6. LaunchImage está obsoleta

Antes de iOS 8, estábamos LaunchImageconfigurando el mapa de lanzamiento, pero con el tamaño cada vez mayor de los dispositivos Apple, necesitamos poner todos los tamaños de mapas de lanzamiento en los conjuntos correspondientes, lo cual es un paso muy tedioso. Por lo tanto, fue introducido por Apple en iOS 8. LaunchScreen.storyboardEs compatible con AutoLayout+ para el diseño de la interfaz SizeClass, que se puede adaptar fácilmente a varias pantallas.

pantalla de inicio

Cabe señalar que Apple mencionó en la sección Modernización de su interfaz de usuario para iOS 13 que a
partir de abril de 2020, se deben proporcionar todas las aplicaciones que admitan iOS 13 LaunchScreen.storyboard; de lo contrario, no se enviarán a la App Store para su aprobación.

7. El proyecto creado por Xcode 11 se ejecuta con una pantalla negra en los dispositivos de versiones inferiores.

Usando el proyecto creado por Xcode 11, seleccione el dispositivo debajo de iOS 13.0 como el dispositivo en ejecución, y aparecerá una pantalla negra al ejecutar la aplicación. Esto se debe a que Xcode 11 está creado por defecto UIScenepara gestionar múltiples UIWindowaplicaciones, además de que el proyecto AppDelegateexterior será uno más SceneDelegate:

UIScene


Esto es para preparar un iPadOS multiproceso, que UIWindowya no está UIApplicationen administración. Pero la versión anterior no lo hizo UIScene, por lo que la solución está en el AppDelegatearchivo de encabezado agregar:

 

@property (strong, nonatomic) UIWindow *window;

Adaptación SDK

1. @availablecausa el error del compilador de versiones anteriores de Xcode.

En el código del proyecto Xcode SDK que usa 11 @availablepara determinar la versión actual del sistema, que se reproduce en el compilador Xcode 10, un error será sobre:

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

Mensaje de error desde el punto de vista, es __isPlatformVersionAtLeastel método sin implementación específica, pero no hay proyecto en este método. La prueba real donde sea que se use @available, y use el Xcode 11 empaquetado en una biblioteca DLL o estática, agregue la biblioteca empaquetada al compilador de Xcode 10 con este error, se puede juzgar iOS 13 de la @availableimplementación utilizada en la nueva api. Si su SDK necesita adaptarse a la versión anterior de Xcode, debe evitar este método y juzgar obteniendo la versión del sistema:

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

Además, abrir el proyecto SDK en Xcode 10 también debería poder compilar normalmente, lo que requiere la adición de macros de compilación para su procesamiento:

#ifndef __IPHONE_13_0
#define __IPHONE_13_0 130000
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
...
#endif

referencias

Este artículo combina el contenido de los siguientes documentos y problemas personales para resumir problemas de adaptación comunes.

Supongo que te gusta

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