iOS13 新API和出現(xiàn)的問(wèn)題(持續(xù)更新...)

前言:

iOS13的API的變動(dòng)和適配問(wèn)題,在一段時(shí)間內(nèi)可能會(huì)有不同的問(wèn)題和方式出現(xiàn),會(huì)持續(xù)更新塔嬉,如果您有好的建議和方法,歡迎加QQ群:457236811租悄,我們一起來(lái)探討谨究,完善。泣棋。胶哲。

一、目錄

  • 修改的API
  • 被禁止的KVC方式
  • 關(guān)于暗黑模式和切換

二潭辈、修改的API

1. UIColor動(dòng)態(tài)屬性

在iOS13之前纪吮,UIColor指標(biāo)是一種顏色。
在iOS13萎胰,UIColor擁有了動(dòng)態(tài)屬性。它可以在 LightMode 和 DarkMode 擁有不同的顏色棚辽。
以下是iOS13最新系統(tǒng)提供的顏色的方法

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
}

系統(tǒng)顏色的動(dòng)態(tài)切換是怎么做的技竟,你是否很好奇,其實(shí)是做了不同的狀態(tài)下設(shè)置顏色屈藐,在切換的時(shí)候就取了相應(yīng)的顏色榔组。下面來(lái)看看:

@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
            }
        }

新增的一些顏色熙尉,那你可以直接點(diǎn)進(jìn)去看看。這里舉例部分:

/* 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之前有兩種狀態(tài)搓扯,defaultlightContent
在iOS13 有三種狀態(tài)检痰,default, darkContentlightContent

  • 現(xiàn)在的 darkContent 對(duì)應(yīng)之前的 default
  • 現(xiàn)在的 default 會(huì)根據(jù)情況自動(dòng)選擇 darkContent 和 lightContent
3. UIActivityIndicatorView加載視圖菊花
  • iOS13之前有三種樣式:
    UIActivityIndicatorViewStyleGray 灰色
    UIActivityIndicatorViewStyleWhite 白色
    UIActivityIndicatorViewStyleWhiteLarge 白色(大型)

  • iOS13廢棄了以上三種樣式锨推,而用以下兩種樣式代替:
    UIActivityIndicatorViewStyleLarge (大型)
    UIActivityIndicatorViewStyleMedium (中型)

  • iOS13通過(guò)color屬性設(shè)置其顏色

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

現(xiàn)在可以使用

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

在 iOS 9 之前播放視頻可以使用 MediaPlayer.framework 中的MPMoviePlayerController類來(lái)完成铅歼,它支持本地視頻和網(wǎng)絡(luò)視頻播放。但是在 iOS 9 開(kāi)始被棄用换可,如果在 iOS 13 中繼續(xù)使用的話會(huì)直接拋出異常:

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

解決辦法: Use AVPlayerViewController in AVKit,即使用 AVPlayer 作為視頻播放控件

6.使用 UISearchDisplayController 導(dǎo)致崩潰

在 iOS 8 之前椎椰,我們?cè)?UITableView 上添加搜索框需要使用 UISearchBar + UISearchDisplayController 的組合方式,
在 iOS 8 之后沾鳄,蘋(píng)果就已經(jīng)推出了 UISearchController 來(lái)代替這個(gè)組合方式慨飘。在 iOS 13 中,如果還繼續(xù)使用 UISearchDisplayController會(huì)直接導(dǎo)致崩潰译荞,崩潰信息如下:

 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. 模態(tài)彈出默認(rèn)樣式改變

在 iOS 13瓤的,使用 presentViewController 方式打開(kāi)視圖,會(huì)跟導(dǎo)航欄有部分視覺(jué)差吞歼,這里就不上圖了圈膏,可以自行試一下。
原因是:蘋(píng)果將 UIViewControllermodalPresentationStyle 屬性的默認(rèn)值改成了新加的一個(gè)枚舉值 UIModalPresentationAutomatic浆熔,對(duì)于多數(shù) UIViewController本辐,此值會(huì)映射成 UIModalPresentationPageSheet

  • 解決辦法: 可以在vcpresent之前設(shè)置modalPresentationStyle 為 UIModalPresentationFullScreen

  • 另外医增,present的vc用戶下拉可以dissmiss控制器慎皱,如果不想要這效果,可以這樣設(shè)置

/*當(dāng)該屬性為 false 時(shí)叶骨,用戶下拉可以 dismiss 控制器茫多,為 true 時(shí),下拉不可以 dismiss控制器*/
  swift代碼:
  xxVC.isModalInPresentation = true
  OC代碼
  xxVC..modalInPresentation = YES;
  • 還有一點(diǎn)需要注意忽刽,原來(lái)以UIModalPresentationFullScreen樣式彈出頁(yè)面天揖,那么這個(gè)頁(yè)面彈出 ViewController 會(huì)依次調(diào)viewWillDisappearviewDidDisappear。然后在這個(gè)頁(yè)面被 dismiss 的時(shí)候跪帝,將他彈出的那個(gè) ViewControllerviewWillAppearviewDidAppear會(huì)被依次調(diào)用今膊。然而使用默認(rèn)的視差效果彈出頁(yè)面,將他彈出的那個(gè) ViewController 并不會(huì)調(diào)用這些方法伞剑,原先寫(xiě)在這四個(gè)函數(shù)中的代碼以后都有可能會(huì)存在問(wèn)題斑唬。
8. 藍(lán)牙權(quán)限更新

在 iOS 13 中,蘋(píng)果將原來(lái)藍(lán)牙申請(qǐng)權(quán)限用的 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 開(kāi)始蘋(píng)果將 UIWebview 列為過(guò)期API(支持iOS2.0-iOS12)缤谎。 目前提交蘋(píng)果應(yīng)用市場(chǎng)(App Store)會(huì)發(fā)送郵件提示你在下一次提交時(shí)將應(yīng)用中UIWebView 的 api 移除。郵件內(nèi)容:

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

  • 暫時(shí)沒(méi)有強(qiáng)制使用WKWebView褐着,但是在iOS13開(kāi)始UIWebView已是廢棄的API坷澡,以后更高的版本中防止出現(xiàn)問(wèn)題,盡早移除是上上之策含蓉。

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

  • 這個(gè)來(lái)自別人的文章,可以查看哪些sdk使用了UIWebView(我沒(méi)有試過(guò)):

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

10.UISegmentedControl 默認(rèn)樣式改變,默認(rèn)樣式變?yōu)?白底黑字谴餐,如果設(shè)置修改過(guò)顏色的話姻政,頁(yè)面需要修改
11.Sign In with Apple

在 iOS 13 中蘋(píng)果推出一種在 App 和網(wǎng)站上便捷登錄的方式: Sign In With Apple,這是 iOS 13 新增的功能,因此需要使用 Xcode 11 進(jìn)行開(kāi)發(fā)岂嗓。請(qǐng)?jiān)?App Store 應(yīng)用審核指南 中查看具體要求

12.LaunchImage (iOS 7.0–13.0)

目前我的項(xiàng)目中也是使用 LaunchImage來(lái)設(shè)置啟動(dòng)圖汁展。但是在iOS13開(kāi)始蘋(píng)果建議使用 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月開(kāi)始,所有支持 iOS 13 的 App 必須提供 LaunchScreen.storyboard厌殉,否則將無(wú)法提交到 App Store 進(jìn)行審批食绿。
13. Xcode 11下獲取App名稱CFBundleDisplayName返回nil

解決辦法: 在info.plist里面添加 Bundle display name

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

14 網(wǎng)友補(bǔ)充:

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

1、添加在keywindow上的視圖公罕,會(huì)被present出來(lái)的頁(yè)面遮蓋器紧,之前不會(huì)遮蓋
2、發(fā)送郵件的時(shí)候楼眷,發(fā)送成功之前會(huì)有“咻”地一聲铲汪,iOS13之后去除了這個(gè)聲音

2020.12.26 17:29@阿茲爾

'scanHexInt32' was deprecated in iOS 13.0

三、 被禁止的kvc

1.UITextFiled 修改根據(jù)kvc提示文字的大小和顏色罐柳,在iOS13會(huì)直接崩潰掌腰,報(bào)錯(cuò)信息如下
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之前,我們通過(guò)"_searchField"來(lái)獲取UISearchTextField來(lái)修改一些屬性张吉。

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

在iOS13中,繼續(xù)這樣會(huì)崩潰齿梁,如下圖。

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

系統(tǒng)提供可以直接獲取到的方法

//系統(tǒng)提供的方法
extension UISearchBar {
    open var searchTextField: UISearchTextField { get }
}

在使用的過(guò)程中需要判斷處理

if #available(iOS 13.0, *) {
      let searchTextField =  searchBar.searchTextField
} else {
      let searchTextField = searchBar.value(forKey: "_searchField")
}
3.UISearchBar 黑線處理導(dǎo)致崩潰

iOS13之前為了處理搜索框的黑線問(wèn)題肮蛹,通常會(huì)遍歷 searchBar 的 subViews勺择,找到并刪除 UISearchBarBackground
在 iOS13 中這么做會(huì)導(dǎo)致 UI 渲染失敗伦忠,然后直接崩潰省核,崩潰信息如下:

 Terminating app due to uncaught exception'NSInternalInconsistencyException', reason: 'Missing or detached view for search bar layout'
  • 解決辦法 設(shè)置 UISearchBarBackground 的 layer.contents 為 nil:
for (UIView *view in _searchBar.subviews.lastObject.subviews) {
    if ([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        view.layer.contents = nil;
        break;
    }
} 
4. 設(shè)置UISearchBar 的searchTextField.attributedPlaceholder無(wú)效問(wèn)題

在 iOS13中需要把設(shè)置的代碼寫(xiě)在viewDidAppear,親測(cè)可以

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: "阿開(kāi)始節(jié)點(diǎn)那里開(kāi)始去上課技能點(diǎn)", attributes: attributeDict)
    }

5獲取狀態(tài)欄視圖
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];

四、關(guān)于暗黑模式和切換

1. 暗黑模式是iOS13的一大亮點(diǎn)昆码,下面來(lái)看看模式切換的設(shè)置芳撒。
  • 切換 修改當(dāng)前 UIViewControllerUIView的模式邓深。只要設(shè)置了控制器為暗黑模式,那么它子view也會(huì)對(duì)應(yīng)的修改笔刹。
    即:只會(huì)影響當(dāng)前的視圖,不會(huì)影響前面的 controller 和后續(xù) present 的 controller冬耿。

但是當(dāng)我們?cè)?window 上設(shè)置 overrideUserInterfaceStyle 的時(shí)候舌菜,就會(huì)影響 window 下所有的 controller, view,包括后續(xù)推出的 controller亦镶。

self.overrideUserInterfaceStyle = .dark // .light
  • 獲取當(dāng)前的模式
  if self.traitCollection.userInterfaceStyle == .dark {
            // Dark
            print("是dark模式日月、。缤骨。爱咬。")
        } else  if self.traitCollection.userInterfaceStyle == .light {
            // Light
            print("是light模式、绊起。精拟。。")
        } else {
            //unspecified
            print("是unspecified模式虱歪、蜂绎。。笋鄙。")
        }
  • 監(jiān)聽(tīng)模式的變化
///監(jiān)聽(tīng)模式的變化
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
            //模式發(fā)生變化會(huì)回調(diào)這里
        }
    }
2. 圖片簡(jiǎn)單適配

需要在xcode11上處理师枣,如下圖

23FD3972F22F1619BE03CBC460420297.jpg

選擇后出現(xiàn)下圖所示的,可以防止Dark模式下圖片的地方
26C21F72C4FAF9045A57539D0FF0094B.jpg

這樣還是比較快捷的萧落,例外如果切圖是有背景色的估計(jì)會(huì)有點(diǎn)麻煩践美,可能會(huì)需要重新切,具體看適配情況找岖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陨倡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宣增,更是在濱河造成了極大的恐慌玫膀,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爹脾,死亡現(xiàn)場(chǎng)離奇詭異帖旨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)灵妨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)解阅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人泌霍,你說(shuō)我怎么就攤上這事货抄∈稣伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵蟹地,是天一觀的道長(zhǎng)积暖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)怪与,這世上最難降的妖魔是什么夺刑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮分别,結(jié)果婚禮上遍愿,老公的妹妹穿的比我還像新娘。我一直安慰自己耘斩,他們只是感情好沼填,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著括授,像睡著了一般坞笙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刽脖,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天羞海,我揣著相機(jī)與錄音,去河邊找鬼曲管。 笑死却邓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的院水。 我是一名探鬼主播腊徙,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼檬某!你這毒婦竟也來(lái)了撬腾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恢恼,失蹤者是張志新(化名)和其女友劉穎民傻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體场斑,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漓踢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漏隐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喧半。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖青责,靈堂內(nèi)的尸體忽然破棺而出挺据,到底是詐尸還是另有隱情取具,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布扁耐,位于F島的核電站暇检,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏做葵。R本人自食惡果不足惜占哟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酿矢。 院中可真熱鬧,春花似錦怎燥、人聲如沸瘫筐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)策肝。三九已至,卻和暖如春隐绵,著一層夾襖步出監(jiān)牢的瞬間之众,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工依许, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棺禾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓峭跳,卻偏偏與公主長(zhǎng)得像膘婶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛀醉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容