iOS 13適配

9月20號(hào)iOS 13 已正式發(fā)布,第一時(shí)間更新了最新系統(tǒng),網(wǎng)上對(duì)其用戶體驗(yàn)上的新特性的描述也很多,而對(duì)于開發(fā)者來說,更需要關(guān)注的是新系統(tǒng)在 API 層面做了哪些改動(dòng),對(duì)我們現(xiàn)有的代碼產(chǎn)生什么影響,需要做什么樣的適配。
本文主要列舉了一些需要開發(fā)者注意的地方,不一定項(xiàng)目中都有涉及到相關(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)會(huì)采用較暗的視圖控件。開發(fā)者在開發(fā)過程中需要對(duì)視圖控件進(jìn)行相應(yīng)暗模式的適配。

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

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

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

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

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

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)用使用了第三方或社交賬號(hào)登錄服務(wù)(如Facebook、Google、Twitter、LinkedIn、Amazon、微信等)來設(shè)置或驗(yàn)證用戶的主賬號(hào),就必須把 Sign In With Apple 作為同等的選項(xiàng)添加到應(yīng)用上。

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

另外需要注意,關(guān)于何時(shí)要求接入 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做這一條的適配,對(duì)于我們自己自身的APP我覺得暫時(shí)也不急于做,可以先看看其他APP具體如何做,然后參考參考,再制定具體的方案。

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

一般打開新頁面會(huì)采用push的方式,某些臨時(shí)頁面會(huì)采用模態(tài)視圖present的方式,iOS13后模態(tài)出新頁面的時(shí)候會(huì)出現(xiàn)頁面從導(dǎo)航欄下開始顯示的情況,主要是因?yàn)橹皩?duì)UIViewController里面的一個(gè)屬性,即modalPresentationStyle(該屬性是控制器在模態(tài)視圖時(shí)將要使用的樣式)沒有設(shè)置需要的類型。

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

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

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

iOS13中通過KVC方式來獲取私有屬性,有Carsh風(fēng)險(xiǎn),盡量避免使用.比如我們常用的UITextFiled和UISearchController等。盡量不要使用valueForKey、setValue: forKeyPath: 等方法獲取或設(shè)置私有屬性,雖然編譯可以通過,但是在運(yùn)行時(shí)會(huì)直接崩潰。比如訪問 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)換,然后替換掉多余的符號(hào)即可:

- (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);
}

項(xiàng)目中用到deviceToken的場(chǎng)景是注冊(cè)極光推送,而極光推送注冊(cè)的API使用的是NSData類型的deviceToken,所以并不需要客戶端做類型轉(zhuǎn)換處理,目前相關(guān)的推送SDK也未有iOS13兼容的更新提示,后續(xù)是否需要升級(jí)推送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對(duì)UIWebView進(jìn)行適配。目前,網(wǎng)上有人提到,如果開發(fā)者將包含 UIWebView api 的應(yīng)用更新上傳到 App Store 審核后,其將會(huì)收到包含 ITMS-90809 信息的回復(fù)郵件,提示你在下一次提交時(shí)將應(yīng)用中 UIWebView 的 api 移除。但是并不會(huì)影響當(dāng)次的審核,下次再提交如果還是有UIWebView還是會(huì)繼續(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 來代替這個(gè)組合方式。在 iOS 13 中已經(jīng)不支持UISearchDisplayController,如果還繼續(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.'
1
解決方案

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

8、 MPMoviePlayerController 被棄用

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

*** 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)牙申請(qǐng)權(quán)限用的 NSBluetoothPeripheralUsageDescription字段,替換為 NSBluetoothAlwaysUsageDescription 字段。

如果還是以舊的字段提交審核,將會(huì)收到包含 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 中把兩個(gè)字段都加上即可。

10、 LaunchImage 被棄用

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

蘋果在 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)榘椎缀谧?,如果設(shè)置修改過顏色的話,頁面需要修改。

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

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

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

解決方案

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

13、 StatusBar 與之前版本不同

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

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

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

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

以上是綜合各個(gè)資料及項(xiàng)目中遇到的整理的iOS13適配點(diǎn),從20號(hào)發(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)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/fhsahfihf/article/details/102592861

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS 13 支持適配的機(jī)型 iPhone X、iPhone XR、iPhone XS、iPhone XS Max...
    你買票嗎閱讀 8,313評(píng)論 2 18
  • iOS 13 支持適配的機(jī)型 iPhone X、iPhone XR、iPhone XS、iPhone XS Max...
    不成活不瘋魔閱讀 44,725評(píng)論 22 131
  • 推薦文章 iOS Swift 自定義導(dǎo)航欄 FLNavigationBar 解決所有問題 WWDC 2019 Xc...
    松花蛋蘸醋閱讀 3,043評(píng)論 1 9
  • iOS 13 如期而至,適配工作可以開展起來啦。在適配 iOS 13 過程中,遇到了如下一些問題。 1. UITe...
    前行哲閱讀 20,555評(píng)論 48 136
  • ??????????????????????????? ?????????? ???????????????? ?...
    吐蕃的男孩閱讀 441評(píng)論 0 0

友情鏈接更多精彩內(nèi)容