记录现有iOS项目对iOS13的适配

近日,网上疯传微信若不支持苹果暗黑模式,即将面临下架处理。有人辟谣,有人疯传,不管真假,微信这么强大的团队,想要做个苹果暗黑模式的兼容应该也不是什么问题,但是对于一些小公司的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的兼容性适配,能正常运行,满足需求就行。

你可能感兴趣的:(记录现有iOS项目对iOS13的适配)