近日,网上疯传微信若不支持苹果暗黑模式,即将面临下架处理。有人辟谣,有人疯传,不管真假,微信这么强大的团队,想要做个苹果暗黑模式的兼容应该也不是什么问题,但是对于一些小公司的App,还是要简单的做一下iOS13的兼容性的,之前因为某第三方SDk的兼容性问题,一直用的是iOS12 的SDK打包上传appStore,但是苹果要求从 4 月 30 日起,所有提交到 App Store 的 iOS 应用都需要使用 iOS 13 SDK 或更高版本构建,所以,所以使用iOS13SDK势在必行,顺便使用暗黑模式测试了一下应用,还是发现有些问题需要处理的。
1.如果App不做暗黑模式的兼容,需要在Info.plist中添加User Interface Style 并设置值为Light,这样App里还是跟原来的的样式,如果不添加,很多白色(浅色)的页面会被系统渲染成暗黑色。
2.状态栏的兼容性设置,iOS13新增一个UIStatusBarStyleDarkContent,如下:
typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
UIStatusBarStyleDefault = 0, // Automatically chooses light or dark content based on the user interface style
UIStatusBarStyleLightContent API_AVAILABLE(ios(7.0)) = 1, // Light content, for use on dark backgrounds
UIStatusBarStyleDarkContent API_AVAILABLE(ios(13.0)) = 3, // Dark content, for use on light backgrounds
UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
UIStatusBarStyleBlackOpaque NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
} API_UNAVAILABLE(tvos);
所以需要设置iOS13状态栏为黑色,需要加一个判断:
if (@available(iOS 13.0, *)) {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDarkContent;
} else {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
// Fallback on earlier versions
}
3.在iOS13上使用presentViewController进行页面跳转,不会再是全屏的,需要手设置vc.modalPresentationStyle = 0或者vc.modalPresentationStyle = UIModalPresentationFullScreen;
typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
UIModalPresentationFullScreen = 0,
UIModalPresentationPageSheet API_AVAILABLE(ios(3.2)) API_UNAVAILABLE(tvos),
UIModalPresentationFormSheet API_AVAILABLE(ios(3.2)) API_UNAVAILABLE(tvos),
UIModalPresentationCurrentContext API_AVAILABLE(ios(3.2)),
UIModalPresentationCustom API_AVAILABLE(ios(7.0)),
UIModalPresentationOverFullScreen API_AVAILABLE(ios(8.0)),
UIModalPresentationOverCurrentContext API_AVAILABLE(ios(8.0)),
UIModalPresentationPopover API_AVAILABLE(ios(8.0)) API_UNAVAILABLE(tvos),
UIModalPresentationBlurOverFullScreen API_AVAILABLE(tvos(11.0)) API_UNAVAILABLE(ios) API_UNAVAILABLE(watchos),
UIModalPresentationNone API_AVAILABLE(ios(7.0)) = -1,
UIModalPresentationAutomatic API_AVAILABLE(ios(13.0)) = -2,
};
4.[UIApplication sharedApplication].keyWindow 被弃用,但是目前在xcode11中还是可以使用的,没有给出任何警告,App也能正常运行
@property(nullable, nonatomic,readonly) UIWindow *keyWindow API_DEPRECATED("Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes", ios(2.0, 13.0));
但还是用官方建议的方法来访问比较好:
[[[UIApplication sharedApplication] windows] objectAtIndex:0]
5.iOS13中禁止通过KVC方式来获取私有属性,会造成crash,其实在iOS13之前使用 [xxx setValue:xxx forKeyPath xxx],经常会出现crash,所以尽量避免使用KVC来访问私有属性,对于有些控件可以自定义重写,或者通过tuntime添加自己想要的属性来满足需求。
6.即将废弃的 LaunchImage
从2020年4月开始,所有使⽤ iOS13 SDK的 App将必须提供 LaunchScreen,LaunchImage即将退出历史舞台。可以使用Launch Storyboards来进行解决。
当然iOS13还有很多新的改动,网上很多大神都列的很详细,我这里只简单记录下对自家App的兼容性适配,能正常运行,满足需求就行。