iOS 13适配

一、适配详点

  1. 在App内禁用深色模式: 可以在Info.plist(全局) 中,设置 User Interface Style 为 Light。

  2. 跳转AppStore的地址,域名由itunes.apple.com改为apps.apple.com,如果未改动,之前的域名也会重定向至apps.apple.com,建议更换:
    之前为:https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=xxxxxx
    更改为:https://apps.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=xxxxxx

  3. 如果项目使用蓝牙,需要添加两个Key值:

NSBluetoothPeripheralUsageDescription

NSBluetoothAlwaysUsageDescription

Tips:即使原生项目没用到蓝牙权限,但第三方库用到了,仍然需要添加这两个Key值。

  1. 2020年4月份开始,苹果要求所有提交的App默认启动页LaunchImage必须更换为LaunchScreen.storyboard。

  2. KeyWindow在iOS13之后会被废弃,建议更换:
    之前为:UIApplication.shared.keyWindow
    更改为:UIApplication.shared.windows.first

  3. KVC限制,检查项目里用到KVC场景,尽量更换。

  4. 推送DeviceToken获取方式发生改变,用到第三方推送的一般没什么影响,自行更新SDK即可,但原生获取DeviceToken的方法需要检查确认。

  5. 模态弹出交互方式发生改变,iOS13开始新增一种模态弹出动画,如果布局从全屏开始计算,需要充分自测。

  6. 深色模式适配:深色模式下,系统自带的控件,如:Tabbar、NavigationBar等会自己适配,但如果用到自定义颜色或图片,则需要手动适配。

  • 颜色适配(将该方法拷贝至通用文件下,确保项目里的任何场景均能调用,这里是Swift5.0版本):
/// 根据不同场景适应不同自定义颜色值,注意,:该方法返回 UIColor
public func adaptColor(with light: UIColor, dark: UIColor) -> UIColor {
    if #available(iOS 13.0, *) {
        let resultColor = UIColor(dynamicProvider: { (traitCollection) -> UIColor in
            if traitCollection.userInterfaceStyle == .dark {
                return dark
            } else {
                return light
            }
        })
        return resultColor
    }
    return light
}

// 调用举例:
tableView.backgroundColor = adaptColor(with: UIColor.white, dark: UIColor.black)

Tips:如果项目里面自定义颜色控件较多,建议封装一个父类去管理能有效减少代码量。
  • 图片适配:开发工具Xcode升级至Xcode11之后,Assets(管理本地图片)里面提供了自动适配图片的方式:


    image

    只需要切出深色模式下的本地图片,在图片的Appearance里选择Any,Dark,添加上即可,加载的时候系统会根据当前的模式加载对应图片。

// 调用举例
let currentImage = UIImage(named: "backImage_black")
  1. iOS13之后,UIWebView成为废弃API,需要更换为WKWebView,欢迎参考个人文章:
    iOS WKWebView探究

二、采坑记录

  1. ControllerA和ControllerB,iOS13上ControllerA模态弹出ControllerB,如果用新的弹出动画,会导致当前ControllerB dismiss之后,前一个ControllerA无法执行viewWillAppear、viewDidAppear等生命周期方法。

解决方案:

  • 方案1:将模态动画统一为全屏模式。iOS13之前,Present动画默认为fullScreen,但iOS13之后,动画默认为automatic。只需要在present的地方设置:
    controller.modalPresentationStyle = .fullScreen
  • 方案2:系统判断,iOS13系统上,在ControllerB dismiss之后,加事件回调至ControllerA,使其执行viewWillAppear或者viewDidAppear里面实现的方法。
  1. 在iOS13深色模式下,唤起自定义数字键盘,应用切换至后台再切回,键盘背景自动变为浅色模式。

解决方案:深色模式下,应用从后台切回前台之后,需要重新调用下键盘背景渲染方法。

  1. 微信SDK升级至最新版之后,iOS13上调用微信分享,跳转至微信之后,一直显示“正在连接”。

解决方案:微信最新版SDK要求,微信开发者后台需要配置Universal Link地址,然后App注册WXSDK的方法用到的Universal Link需要与管理后台保持一致。另外,上传服务器的apple-app-site-association文件里的paths需要加上通配符”*”

你可能感兴趣的:(iOS 13适配)