iOS16 Xcode14 適配

語言: CN / TW / HK

highlight: a11y-dark

1、橫豎屏切換

[UIDevice currentDevice] 使用setValue:forKey:的方式在iOS16上面已經不可用,繼而要使用UIWindowScene裡面的函式請求

``` if (@available(iOS 16.0, )) {     UIWindowScene windowScene = (UIWindowScene )[[[UIApplication sharedApplication] connectedScenes] allObjects].firstObject;     UIWindowSceneGeometryPreferencesIOS perference = [[UIWindowSceneGeometryPreferencesIOS alloc] init];     perference.interfaceOrientations = 1 << deviceOrientation;     [windowScene requestGeometryUpdateWithPreferences:perference errorHandler:^(NSError * _Nonnull error) {         NSLog(@"error--%@", error);     }]; } else {         [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:deviceOrientation] forKey:@"orientation"];         [UIViewController attemptRotationToDeviceOrientation]; }

```

1.1、螢幕旋轉通知在iOS16無法處觸發

需要重寫UIViewController的viewWillTransitionToSize:withTransitionCoordinator:,在此函式裡面處理UI。

1.2、iOS16 使用過YYTextView之後無法旋轉螢幕

使用過UITextView之後,再呼叫函式 requestGeometryUpdateWithPreferences:geometryPreferences errorHandler: 請求無效,無法旋轉螢幕

分析: 列印所有的connectedScenes

使用YYTextView之前 image.png

使用YYTextView之後 image.png

問題是當前的UIWindowScene裡面多了一層YYTextView新增的YYTextEffectWindow,去掉這一層window就可以了。

2、xcode14 UIViewController在dealloc時發生崩潰

iOS16除錯的時候報錯

Application circumvented objective-c runtime dealloc initiation for <%s> object並崩潰

原因是: IOS16 蘋果不允許重寫系統控制元件分類(Categroy)中重寫 + (void)initialize方法

3、使用xcode14打出來的包,在iOS12.2以下的系統發生崩潰

使用otool工具檢視二進位制檔案發現

image.png

二進位制裡面多了一個 /usr/lib/swift/libswiftCoreGraphics.dylib (compatibility version 1.0.0, current version 120.100.0)

解決方法:

Build Phases -> Link Binary With Librarires 裡面新增libswiftCoreGraphics.tbd

「其他文章」