iOS13 新API和出现的问题(持续更新...)

前言:

iOS13的API的变动和适配问题,在一段时间内可能会有不同的问题和方式出现,会持续更新,如果您有好的建议和方法,欢迎加QQ群:457236811,我们一起来探讨,完善。。。

一、目录

  • 修改的API
  • 被禁止的KVC方式
  • 关于暗黑模式和切换

二、修改的API

1. UIColor动态属性

在iOS13之前,UIColor指标是一种颜色。
在iOS13,UIColor拥有了动态属性。它可以在 LightMode 和 DarkMode 拥有不同的颜色。
以下是iOS13最新系统提供的颜色的方法

extension UIColor {

    @available(iOS 13.0, *)
    public init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)

    /* Resolve any color to its most fundamental form (a non-dynamic color) for a specific trait collection.
     */
    @available(iOS 13.0, *)
    open func resolvedColor(with traitCollection: UITraitCollection) -> UIColor
}

系统颜色的动态切换是怎么做的,你是否很好奇,其实是做了不同的状态下设置颜色,在切换的时候就取了相应的颜色。下面来看看:

@available(iOS 12.0, *)
public enum UIUserInterfaceStyle : Int {
    case unspecified 
    case light
    case dark
}

 //利用上面iOS13的 init方法
  let color = UIColor{ (traitCollection) -> UIColor in
            if traitCollection.userInterfaceStyle == .light {
                return .orange
            } else if traitCollection.userInterfaceStyle == .dark {
                return .white
            } else  { //traitCollection.userInterfaceStyle == .unspecified
                return .green
            }
        }

新增的一些颜色,那你可以直接点进去看看。这里举例部分:

/* Foreground colors for static text and related elements.
     */
    @available(iOS 13.0, *)
    open class var label: UIColor { get }

    @available(iOS 13.0, *)
    open class var secondaryLabel: UIColor { get }

    @available(iOS 13.0, *)
    open class var tertiaryLabel: UIColor { get }

    @available(iOS 13.0, *)
    open class var quaternaryLabel: UIColor { get }

    
    /* Foreground color for standard system links.
     */
    @available(iOS 13.0, *)
    open class var link: UIColor { get }

    
    /* Foreground color for placeholder text in controls or text fields or text views.
     */
    @available(iOS 13.0, *)
    open class var placeholderText: UIColor { get }

    
  @available(iOS 13.0, *)
    open class var separator: UIColor { get }

    @available(iOS 13.0, *)
    open class var opaqueSeparator: UIColor { get }

   ...

2. Status Bar更新

在iOS13之前有两种状态,defaultlightContent
在iOS13 有三种状态,default, darkContentlightContent

  • 现在的 darkContent 对应之前的 default
  • 现在的 default 会根据情况自动选择 darkContent 和 lightContent
3. UIActivityIndicatorView加载视图菊花
  • iOS13之前有三种样式:
    UIActivityIndicatorViewStyleGray 灰色
    UIActivityIndicatorViewStyleWhite 白色
    UIActivityIndicatorViewStyleWhiteLarge 白色(大型)

  • iOS13废弃了以上三种样式,而用以下两种样式代替:
    UIActivityIndicatorViewStyleLarge (大型)
    UIActivityIndicatorViewStyleMedium (中型)

  • iOS13通过color属性设置其颜色

4. 获取WindowkeyWindow
 @available(iOS, introduced: 2.0, deprecated: 13.0, message: "Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes")
    open var keyWindow: UIWindow? { get }
    open var windows: [UIWindow] { get }

iOS13之前

let window = UIApplication.shared.keyWindow

现在可以使用

let window = UIApplication.shared.windows[0]
5. MPMoviePlayerController 被弃用

在 iOS 9 之前播放视频可以使用 MediaPlayer.framework 中的MPMoviePlayerController类来完成,它支持本地视频和网络视频播放。但是在 iOS 9 开始被弃用,如果在 iOS 13 中继续使用的话会直接抛出异常:

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

解决办法: Use AVPlayerViewController in AVKit,即使用 AVPlayer 作为视频播放控件

6.使用 UISearchDisplayController 导致崩溃

在 iOS 8 之前,我们在 UITableView 上添加搜索框需要使用 UISearchBar + UISearchDisplayController 的组合方式,
在 iOS 8 之后,苹果就已经推出了 UISearchController 来代替这个组合方式。在 iOS 13 中,如果还继续使用 UISearchDisplayController会直接导致崩溃,崩溃信息如下:

 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.' 
  • 解决办法: Please migrate your application to UISearchController.', 也就是用UISearchController代替
7. 模态弹出默认样式改变

在 iOS 13,使用 presentViewController 方式打开视图,会跟导航栏有部分视觉差,这里就不上图了,可以自行试一下。
原因是:苹果将 UIViewControllermodalPresentationStyle 属性的默认值改成了新加的一个枚举值 UIModalPresentationAutomatic,对于多数 UIViewController,此值会映射成 UIModalPresentationPageSheet

  • 解决办法: 可以在vcpresent之前设置modalPresentationStyle 为 UIModalPresentationFullScreen

  • 另外,present的vc用户下拉可以dissmiss控制器,如果不想要这效果,可以这样设置

/*当该属性为 false 时,用户下拉可以 dismiss 控制器,为 true 时,下拉不可以 dismiss控制器*/
  swift代码:
  xxVC.isModalInPresentation = true
  OC代码
  xxVC..modalInPresentation = YES;
  • 还有一点需要注意,原来以UIModalPresentationFullScreen样式弹出页面,那么这个页面弹出 ViewController 会依次调viewWillDisappearviewDidDisappear。然后在这个页面被 dismiss 的时候,将他弹出的那个 ViewControllerviewWillAppearviewDidAppear会被依次调用。然而使用默认的视差效果弹出页面,将他弹出的那个 ViewController 并不会调用这些方法,原先写在这四个函数中的代码以后都有可能会存在问题。
8. 蓝牙权限更新

在 iOS 13 中,苹果将原来蓝牙申请权限用的 NSBluetoothPeripheralUsageDescription 字段,替换为 NSBluetoothAlwaysUsageDescription 字段。

For apps with a deployment target of iOS 13 and later, use NSBluetoothAlwaysUsageDescription instead.
9.废弃UIWebview 改用 WKWebView
@available(iOS, introduced: 2.0, deprecated: 12.0, message: "No longer supported; please adopt WKWebView.")

iOS13 开始苹果将 UIWebview 列为过期API(支持iOS2.0-iOS12)。 目前提交苹果应用市场(App Store)会发送邮件提示你在下一次提交时将应用中UIWebView 的 api 移除。邮件内容:

Dear Developer,

We identified one or more issues with a recent delivery for your app, "xxx". Your delivery was successful, but you may wish to correct the following issues in your next delivery:

ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs . See [developer.apple.com/documentati…]([https://developer.apple.com/documentation/uikit/uiwebview](https://developer.apple.com/documentation/uikit/uiwebview)
) for more information.

After you’ve corrected the issues, you can use Xcode or Application Loader to upload a new binary to App Store Connect.

Best regards,

The App Store Team

  • 暂时没有强制使用WKWebView,但是在iOS13开始UIWebView已是废弃的API,以后更高的版本中防止出现问题,尽早移除是上上之策。

  • 目前我所用到的最新版本微信支付sdk(1.8.6版),已将UIWebView替换成了WKWebView.

  • 这个来自别人的文章,可以查看哪些sdk使用了UIWebView(我没有试过):

find . -type f | grep -e ".a" -e ".framework" | xargs grep -s UIWebView

10.UISegmentedControl 默认样式改变,默认样式变为 白底黑字,如果设置修改过颜色的话,页面需要修改
11.Sign In with Apple

在 iOS 13 中苹果推出一种在 App 和网站上便捷登录的方式: Sign In With Apple,这是 iOS 13 新增的功能,因此需要使用 Xcode 11 进行开发。请在 App Store 应用审核指南 中查看具体要求

12.LaunchImage (iOS 7.0–13.0)

目前我的项目中也是使用 LaunchImage来设置启动图。但是在iOS13开始苹果建议使用 Launch Screen.

UILaunchImages has been deprecated; use Xcode launch storyboards instead. For more information on how to construct and format your launch storyboard, seeLaunch Screen

  • 从2020年4月开始,所有支持 iOS 13 的 App 必须提供 LaunchScreen.storyboard,否则将无法提交到 App Store 进行审批。
13. Xcode 11下获取App名称CFBundleDisplayName返回nil

解决办法: 在info.plist里面添加 Bundle display name

5F522EF2-9855-485D-A624-BDCE75C0091F.png

14 网友补充:

2020年4月26@S型身材的猪

1、添加在keywindow上的视图,会被present出来的页面遮盖,之前不会遮盖
2、发送邮件的时候,发送成功之前会有“咻”地一声,iOS13之后去除了这个声音

2020.12.26 17:29@阿兹尔

'scanHexInt32' was deprecated in iOS 13.0

三、 被禁止的kvc

1.UITextFiled 修改根据kvc提示文字的大小和颜色,在iOS13会直接崩溃,报错信息如下
EDBC5958753BDCD3E7B5BC62A2A9251A.jpg

修改办法

if #available(iOS 13.0, *) {
    let arrStr = NSMutableAttributedString(string: field.placeholder!, attributes: [NSAttributedString.Key.foregroundColor: UIColor.systemGray3, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15)])
 field.attributedPlaceholder = arrStr
} else {
    field.setValue(UIColor.systemGray3, forKeyPath: "_placeholderLabel.textColor")
    field.setValue(UIFont.systemFont(ofSize: 15), forKeyPath:"_placeholderLabel.font")
}

2. 获取UISearchBar的textField

在iOS13之前,我们通过"_searchField"来获取UISearchTextField来修改一些属性。

        let searchTextField = searchBar.value(forKey: "_searchField")

在iOS13中,继续这样会崩溃,如下图。

B7701395-8B0B-4690-8A40-A6C2B6D658CC.png

系统提供可以直接获取到的方法

//系统提供的方法
extension UISearchBar {
    open var searchTextField: UISearchTextField { get }
}

在使用的过程中需要判断处理

if #available(iOS 13.0, *) {
      let searchTextField =  searchBar.searchTextField
} else {
      let searchTextField = searchBar.value(forKey: "_searchField")
}
3.UISearchBar 黑线处理导致崩溃

iOS13之前为了处理搜索框的黑线问题,通常会遍历 searchBar 的 subViews,找到并删除 UISearchBarBackground
在 iOS13 中这么做会导致 UI 渲染失败,然后直接崩溃,崩溃信息如下:

 Terminating app due to uncaught exception'NSInternalInconsistencyException', reason: 'Missing or detached view for search bar layout'
  • 解决办法 设置 UISearchBarBackground 的 layer.contents 为 nil:
for (UIView *view in _searchBar.subviews.lastObject.subviews) {
    if ([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        view.layer.contents = nil;
        break;
    }
} 
4. 设置UISearchBar 的searchTextField.attributedPlaceholder无效问题

在 iOS13中需要把设置的代码写在viewDidAppear,亲测可以

var lglSearchBar: UISearchBar!
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let attributeDict = [NSAttributedString.Key.foregroundColor: UIColor.green, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20)]
        lglSearchBar.searchTextField.attributedPlaceholder =  NSMutableAttributedString(string: "阿开始节点那里开始去上课技能点", attributes: attributeDict)
    }

5获取状态栏视图
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];

四、关于暗黑模式和切换

1. 暗黑模式是iOS13的一大亮点,下面来看看模式切换的设置。
  • 切换 修改当前 UIViewControllerUIView的模式。只要设置了控制器为暗黑模式,那么它子view也会对应的修改
    即:只会影响当前的视图,不会影响前面的 controller 和后续 present 的 controller。

但是当我们在 window 上设置 overrideUserInterfaceStyle 的时候,就会影响 window 下所有的 controller, view,包括后续推出的 controller。

self.overrideUserInterfaceStyle = .dark // .light
  • 获取当前的模式
  if self.traitCollection.userInterfaceStyle == .dark {
            // Dark
            print("是dark模式、。。。")
        } else  if self.traitCollection.userInterfaceStyle == .light {
            // Light
            print("是light模式、。。。")
        } else {
            //unspecified
            print("是unspecified模式、。。。")
        }
  • 监听模式的变化
///监听模式的变化
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
            //模式发生变化会回调这里
        }
    }
2. 图片简单适配

需要在xcode11上处理,如下图

23FD3972F22F1619BE03CBC460420297.jpg

选择后出现下图所示的,可以防止Dark模式下图片的地方
26C21F72C4FAF9045A57539D0FF0094B.jpg

这样还是比较快捷的,例外如果切图是有背景色的估计会有点麻烦,可能会需要重新切,具体看适配情况。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容