iOS 13適配

9月20號iOS 13 已正式發(fā)布围橡,第一時間更新了最新系統(tǒng)蠢络,網(wǎng)上對其用戶體驗上的新特性的描述也很多社裆,而對于開發(fā)者來說,更需要關(guān)注的是新系統(tǒng)在 API 層面做了哪些改動双仍,對我們現(xiàn)有的代碼產(chǎn)生什么影響枢希,需要做什么樣的適配。
本文主要列舉了一些需要開發(fā)者注意的地方殊校,不一定項目中都有涉及到相關(guān)發(fā)生變化的東西晴玖,但仍需注意。

一为流、 iOS 13 支持的機(jī)型

?iPhone X呕屎、iPhone XR、iPhone XS敬察、iPhone XS Max
?iPhone 8秀睛、iPhone 8 Plus
?iPhone 7、iPhone 7 Plus
?iPhone 6s莲祸、iPhone 6s Plus
?iPhone SE
?iPod touch (第七代)

二蹂安、 適配要求

Starting April, 2020, all iOS apps submitted to the App Store will need to be built with the iOS 13 SDK or later. They must also support the all-screen design of iPhone XS Max or the 12.9-inch iPad Pro (3rd generation), or later.

根據(jù)官網(wǎng)的說法椭迎,2020年4月之后所有提交到 App Store 的應(yīng)用必須使用 iOS 13 以上的 SDK 進(jìn)行編譯,并要求屏幕尺寸支持 iPhone Xs Max 和 12.9 寸 iPad Pro田盈。

三畜号、具體適配清單

1、 Dark Mode

Dark Mode(暗黑模式)是蘋果在iOS13推出的新特性允瞧。使用iOS13及更高版本的系統(tǒng)的iOS 設(shè)備简软,可以使用暗黑模式。在暗黑模式下述暂,系統(tǒng)會采用較暗的視圖控件痹升。開發(fā)者在開發(fā)過程中需要對視圖控件進(jìn)行相應(yīng)暗模式的適配。

適配原理:
1.將同一個資源畦韭,創(chuàng)建出兩種模式的樣式疼蛾。系統(tǒng)根據(jù)當(dāng)前選擇的樣式,自動獲取該樣式的資源
2.每次系統(tǒng)更新樣式時艺配,應(yīng)用會調(diào)用當(dāng)前所有存在的元素調(diào)用對應(yīng)的一些重新方法察郁,進(jìn)行重繪視圖,可以在對應(yīng)的方法做相應(yīng)的改動

如果不打算適配 Dark Mode转唉,可以強(qiáng)行關(guān)閉暗黑模式

if(@available(iOS 13.0, *)){
    [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleLight];
}

不過即使設(shè)置了顏色方案绳锅,系統(tǒng)自帶的申請各個權(quán)限的彈窗還是會依據(jù)系統(tǒng)的顏色進(jìn)行顯示,自己創(chuàng)建的提示彈窗 UIAlertController則不會酝掩。

對于暗黑模式,如果項目中重新對各個控件設(shè)置過背景色眷柔,那么即使開啟暗黑模式期虾,也不會對控件的背景色有影響;如果未重新設(shè)置過背景色驯嘱,那么APP里的控件就會根據(jù)系統(tǒng)的顯示模式而顯示相應(yīng)的顏色镶苞,此時需要適配暗黑模式,否則有些控件顯示就會異常鞠评。

2茂蚓、Sign In with Apple

在 iOS 13 中蘋果推出一種在 App 和網(wǎng)站上快速、便捷登錄的方式: Sign In With Apple剃幌。這是 iOS 13 新增的功能聋涨,因此需要使用 Xcode 11 進(jìn)行開發(fā)。關(guān)于應(yīng)用是否要求接入此登錄方式负乡,蘋果在 App Store 應(yīng)用審核指南 中提到:

Apps that exclusively use a third-party or social login service (such as Facebook Login, Google Sign-In, Sign in with Twitter, Sign In with LinkedIn, Login with Amazon, or WeChat Login) to set up or authenticate the user’s primary account with the app must also offer Sign in with Apple as an equivalent option.

如果應(yīng)用使用了第三方或社交賬號登錄服務(wù)(如Facebook牍白、Google、Twitter抖棘、LinkedIn茂腥、Amazon狸涌、微信等)來設(shè)置或驗證用戶的主賬號,就必須把 Sign In With Apple 作為同等的選項添加到應(yīng)用上最岗。

如果是下面這些類型的應(yīng)用則不需要添加:
?僅僅使用公司內(nèi)部賬號來注冊和登錄的應(yīng)用帕胆;
?要求用戶使用現(xiàn)有的教育或企業(yè)賬號進(jìn)行登錄的教育、企業(yè)或商務(wù)類型的應(yīng)用般渡;
?使用政府或業(yè)界支持的公民身份識別系統(tǒng)或電子標(biāo)識對用戶進(jìn)行身份驗證的應(yīng)用懒豹;
?特定第三方服務(wù)的應(yīng)用,用戶需要直接登錄其郵箱诊杆、社交媒體或其他第三方帳戶才能訪問其內(nèi)容歼捐。

另外需要注意,關(guān)于何時要求接入 Sign In With Apple晨汹,蘋果在 News and Updates 中提到:

Starting today, new apps submitted to the App Store must follow these guidelines. Existing apps and app updates must follow them by April 2020.

現(xiàn)有應(yīng)用和應(yīng)用更新須在 2020 年 4 月前完成接入豹储。

這部分目前還未看到有APP做這一條的適配,對于我們自己自身的APP我覺得暫時也不急于做淘这,可以先看看其他APP具體如何做剥扣,然后參考參考,再制定具體的方案铝穷。

3钠怯、模態(tài)彈出視圖的顯示問題

一般打開新頁面會采用push的方式,某些臨時頁面會采用模態(tài)視圖present的方式曙聂,iOS13后模態(tài)出新頁面的時候會出現(xiàn)頁面從導(dǎo)航欄下開始顯示的情況晦炊,主要是因為之前對UIViewController里面的一個屬性,即modalPresentationStyle(該屬性是控制器在模態(tài)視圖時將要使用的樣式)沒有設(shè)置需要的類型宁脊。

在iOS13中modalPresentationStyle的默認(rèn)改為UIModalPresentationAutomatic,而在之前默認(rèn)是UIModalPresentationFullScreen断国。所以如果想顯示樣式和以前的保持一致,需要手動設(shè)置modalPresentationStyle為UIModalPresentationFullScreen

這個屬性不受Xcode版本的影響榆苞,只要是iOS13系統(tǒng)稳衬,采用present的方式打開頁面卻沒有設(shè)置modalPresentationStyle為UIModalPresentationFullScreen的話,就會有這個顯示問題

4坐漏、不允許使用KVC進(jìn)行對私有屬性進(jìn)行獲取或者修改

iOS13中通過KVC方式來獲取私有屬性,有Carsh風(fēng)險,盡量避免使用.比如我們常用的UITextFiled和UISearchController等薄疚。盡量不要使用valueForKey、setValue: forKeyPath: 等方法獲取或設(shè)置私有屬性赊琳,雖然編譯可以通過街夭,但是在運行時會直接崩潰。比如訪問 UISearchBar 的 _searchField:

UITextField *textField = [searchBar valueForKey:@"_searchField"];//崩潰
[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];//崩潰

5慨畸、推送的 deviceToken 獲取到的格式發(fā)生變化

系統(tǒng)返回deviceToken的方法是- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
由此可見莱坎,返回的是NSData類型的deviceToken。如果需要把NSData類型的deviceToken轉(zhuǎn)換成字符串類型寸士,原本只需要用系統(tǒng)方法轉(zhuǎn)換檐什,然后替換掉多余的符號即可:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token = [deviceToken description];
for (NSString *symbol in @[@" ", @"<", @">", @"-"]) {
    token = [token stringByReplacingOccurrencesOfString:symbol withString:@""];
}
NSLog(@"deviceToken:%@", token);
}

但在 iOS 13 中碴卧,這種方法已經(jīng)失效,NSData類型的 deviceToken 轉(zhuǎn)換成的字符串變成了:

{length = 32, bytes = 0xd7f9fe34 69be14d1 fa51be22 329ac80d … 5ad13017 b8ad0736 } `

解決方案:

需要進(jìn)行一次數(shù)據(jù)格式處理,獲取方式如下:

#include <arpa/inet.h>
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
if (![deviceToken isKindOfClass:[NSData class]]) return;
const unsigned *tokenBytes = [deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                      ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                      ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                      ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
NSLog(@"deviceToken:%@", hexToken);
}

項目中用到deviceToken的場景是注冊極光推送乃正,而極光推送注冊的API使用的是NSData類型的deviceToken住册,所以并不需要客戶端做類型轉(zhuǎn)換處理,目前相關(guān)的推送SDK也未有iOS13兼容的更新提示瓮具,后續(xù)是否需要升級推送SDK荧飞,還需繼續(xù)關(guān)注。

6名党、 iOS13以后將不再繼續(xù)支持UIWebView

UIKIT_EXTERN API_DEPRECATED("No longer supported; please adopt WKWebView.", ios(2.0, 12.0)) API_UNAVAILABLE(tvos, macos) @interface UIWebView : UIView <NSCoding, UIScrollViewDelegate>
1
在 iOS 13 后叹阔,官方將UIWebView的支持的系統(tǒng)范圍定格在了iOS 2.0 ~ iOS 12.0,建議開發(fā)者用WKWebView對UIWebView進(jìn)行適配传睹。目前耳幢,網(wǎng)上有人提到,如果開發(fā)者將包含 UIWebView api 的應(yīng)用更新上傳到 App Store 審核后欧啤,其將會收到包含 ITMS-90809 信息的回復(fù)郵件睛藻,提示你在下一次提交時將應(yīng)用中 UIWebView 的 api 移除。但是并不會影響當(dāng)次的審核邢隧,下次再提交如果還是有UIWebView還是會繼續(xù)發(fā)郵件提醒你更換成WKWebView店印。

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… 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替代UIWebView,確保所有 UIWebView 的 api 都要移除倒慧,如果需要適配 iOS 7 的可以通過 openURL 的方式在 Safari 打開按摘。

7、UISearchDisplayController被廢棄

在iOS 8 之前纫谅,在 UITableView 上添加搜索框可以采用 UISearchBar + UISearchDisplayController的組合方式院峡,而在 iOS 8 之后,蘋果就已經(jīng)推出了 UISearchController 來代替這個組合方式系宜。在 iOS 13 中已經(jīng)不支持UISearchDisplayController,如果還繼續(xù)使用 UISearchDisplayController 會直接導(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.'
1
解決方案

使用UISearchController替換 UISearchBar + UISearchDisplayController 的組合方案盹牧。

8、 MPMoviePlayerController 被棄用

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

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

使用AVFoundation 里的AVPlayer 作為視頻播放控件苹粟。

9有滑、藍(lán)牙權(quán)限字段更新導(dǎo)致審核失敗

For apps with a deployment target of iOS 13 and later, use NSBluetoothAlwaysUsageDescription instead.
1
在 iOS 13 中,蘋果將原來藍(lán)牙申請權(quán)限用的 NSBluetoothPeripheralUsageDescription字段嵌削,替換為 NSBluetoothAlwaysUsageDescription 字段毛好。

如果還是以舊的字段提交審核望艺,將會收到包含 ITMS-90683 的郵件

解決方案
官方文檔提到:

For deployment targets earlier than iOS 13, add both NSBluetoothAlwaysUsageDescription and NSBluetoothPeripheralUsageDescription to your app’s Information Property List file.
1
所以只要在Info.plist 中把兩個字段都加上即可。

10肌访、 LaunchImage 被棄用

iOS 有兩種設(shè)置啟動圖的方式找默,一種是LaunchImage,一種是LaunchScreen吼驶。采用LaunchImage設(shè)置啟動圖的話需要根據(jù)不同的機(jī)型設(shè)計相應(yīng)尺寸的啟動圖惩激,隨著蘋果設(shè)備屏幕尺寸越多,所需要的啟動圖就越多蟹演,這種啟動圖的設(shè)置方式就會顯得不夠智能风钻;LaunchScreen只要一張圖片,系統(tǒng)會自動適配酒请,其采用的是AutoLayout+SizeClass的方式骡技,可以自動適配各種屏幕。

蘋果在 Modernizing Your UI for iOS 13 section 中提到 蚌父,從2020年4月開始哮兰,所有支持 iOS 13 的 App 必須提供LaunchScreen.storyboard,否則將無法提交到 App Store 進(jìn)行審核苟弛。

11喝滞、 UISegmentedControl 默認(rèn)樣式改變

默認(rèn)樣式變?yōu)榘椎缀谧郑绻O(shè)置修改過顏色的話膏秫,頁面需要修改右遭。

原本設(shè)置選中顏色的tintColor 已經(jīng)失效,新增了selectedSegmentTintColor 屬性用以修改選中的顏色缤削。

12窘哈、 Xcode 11 創(chuàng)建的工程在低版本設(shè)備上運行黑屏

使用 Xcode 11 創(chuàng)建的工程,運行設(shè)備選擇 iOS 13.0 以下的設(shè)備亭敢,運行應(yīng)用時會出現(xiàn)黑屏滚婉。這是因為 Xcode 11 默認(rèn)是會創(chuàng)建通過UIScene管理多個 UIWindow 的應(yīng)用,工程中除了AppDelegate外會多一個SceneDelegate,
SceneDelegate是為了 iPadOS 的多進(jìn)程準(zhǔn)備的帅刀,但是舊版本根本沒有UIScene让腹。

解決方案

在 AppDelegate 的頭文件加上:
@property (strong, nonatomic) UIWindow *window;

13、 StatusBar 與之前版本不同

目前狀態(tài)欄也增加了一種模式扣溺,由之前的兩種骇窍,變成了三種, 其中default由之前的黑色內(nèi)容,變成了會根據(jù)系統(tǒng)模式锥余,自動選擇當(dāng)前展示lightContent還是darkContent

14腹纳、 TabBar 選中文字顏色變成系統(tǒng)默認(rèn)藍(lán)色

在iOS13系統(tǒng)中,跳轉(zhuǎn)到二級頁面再返回一級頁面時,TabBar的選中項的文字顏色會變成系統(tǒng)默認(rèn)的藍(lán)色嘲恍。主要是由于tincolor影響了 足画,通過重新設(shè)置默認(rèn)顏色即可

if (@available(iOS 13.0, *)) {
       self.tabBar.unselectedItemTintColor = THEMEBLUECOLOR;
   } else {
   // Fallback on earlier versions
   }

以上是綜合各個資料及項目中遇到的整理的iOS13適配點,從20號發(fā)布iOS13.0正式版到現(xiàn)在蛔钙,截止目前已經(jīng)推出了iOS13.1.3版本锌云,關(guān)于iOS13的適配仍需持續(xù)關(guān)注。
————————————————
版權(quán)聲明:本文為CSDN博主「WScarlett」的原創(chuàng)文章吁脱,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議桑涎,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/fhsahfihf/article/details/102592861

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兼贡,一起剝皮案震驚了整個濱河市攻冷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遍希,老刑警劉巖等曼,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凿蒜,居然都是意外死亡禁谦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門废封,熙熙樓的掌柜王于貴愁眉苦臉地迎上來州泊,“玉大人,你說我怎么就攤上這事漂洋∫T恚” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵刽漂,是天一觀的道長演训。 經(jīng)常有香客問我,道長贝咙,這世上最難降的妖魔是什么样悟? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮庭猩,結(jié)果婚禮上乌奇,老公的妹妹穿的比我還像新娘。我一直安慰自己眯娱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布爬凑。 她就那樣靜靜地躺著徙缴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上于样,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天疏叨,我揣著相機(jī)與錄音,去河邊找鬼穿剖。 笑死蚤蔓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的糊余。 我是一名探鬼主播秀又,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贬芥!你這毒婦竟也來了吐辙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蘸劈,失蹤者是張志新(化名)和其女友劉穎昏苏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體威沫,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡贤惯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了棒掠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孵构。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖句柠,靈堂內(nèi)的尸體忽然破棺而出浦译,到底是詐尸還是另有隱情,我是刑警寧澤溯职,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布精盅,位于F島的核電站,受9級特大地震影響谜酒,放射性物質(zhì)發(fā)生泄漏叹俏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一僻族、第九天 我趴在偏房一處隱蔽的房頂上張望粘驰。 院中可真熱鬧,春花似錦述么、人聲如沸蝌数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顶伞。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唆貌,已是汗流浹背滑潘。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留锨咙,地道東北人语卤。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像酪刀,于是被迫代替她去往敵國和親粹舵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

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