iOS開發(fā)之iOS10適配

公司的項目埂奈,臨上線之前做了一下iOS10的適配铅祸,發(fā)現(xiàn)一大堆的坑嗦玖,瞬間覺得蘋果不友好了。
一妈经、證書問題
打開xcode8.0時編譯運行時出現(xiàn)下面問題:

Paste_Image.png

這個問題剛開始估計大家都會碰到也是第一個要解決的問題這個問題就是一個證書的設(shè)置問題淮野,下面看兩張圖正常我們會在BuildeSettings中設(shè)置證書:

Paste_Image.png

但是在xcode8.0中我們看到下面的新特性:

Paste_Image.png

相信大家都能看到在Genreal下面會有Siging,沒錯這就是新特性吹泡,為了方便用戶來管理骤星,大家可以選擇Automatically manage signing。需要輸入開發(fā)者賬號荞胡!如果沒有賬號也沒關(guān)系妈踊,在下面也可以選擇Debug、Realease泪漂、inHouse模式下對應(yīng)的證書也可以廊营!
但是 但是 但是 如果你的證書如果是通配符類型的,但是你的app包含了比如推送萝勤、apple pay露筒、他會報錯提示你未報含xx.id的manteid等等。所以你要生成針對你app的bundleid對應(yīng)的證書敌卓!

二慎式、系統(tǒng)判斷方法失效
在你的項目中,當(dāng)需要判斷系統(tǒng)版本的話,不要使用下面的方法:

#define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10)

它會永遠(yuǎn)返回NO,substringToIndex:1在iOS 10 會被檢測成iOS 1了,應(yīng)該使用下面的這些方法:
Objective-C 中這樣寫:

#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

或者使用:

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_9_0) {
 // do stuff for iOS 9 and newer
} else {
 // do stuff for older versions than iOS 9
}

ps:
有時候會缺少一些常量,NSFoundationVersionNumber是在NSObjCRuntime.h中定義的,作為Xcode7.3.1的一部分,我們設(shè)定常熟范圍從iPhone OS 2到#define NSFoundationVersionNumber_iOS_8_4 1144.17,在iOS 10(Xcode 8)中,蘋果補(bǔ)充了缺少的數(shù)字,設(shè)置有未來的版本.

#define NSFoundationVersionNumber_iOS_9_0 1240.1
#define NSFoundationVersionNumber_iOS_9_1 1241.14
#define NSFoundationVersionNumber_iOS_9_2 1242.12
#define NSFoundationVersionNumber_iOS_9_3 1242.12
#define NSFoundationVersionNumber_iOS_9_4 1280.25
#define NSFoundationVersionNumber_iOS_9_x_Max 1299

三、隱私數(shù)據(jù)訪問問題
你的項目中訪問了隱私數(shù)據(jù),比如:相機(jī),相冊,聯(lián)系人等,在Xcode8中打開編譯的話,統(tǒng)統(tǒng)會crash,控制臺會輸出下面這樣的日志:

122816-135f4a89ba4b0ee5.png

這是因為iOS對用戶的安全和隱私的增強(qiáng),在申請很多私有權(quán)限的時候都需要添加描述,但是,在使用Xcode 8之前的Xcode還是使用系統(tǒng)的權(quán)限通知框.
要想解決這個問題,只需要在info.plist添加NSContactsUsageDescription的key, value自己隨意填寫就可以,這里列舉出對應(yīng)的key(Source Code模式下):

Paste_Image.png
<!-- 相冊 --> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>app需要您的同意,才能訪問相冊</string>
<!-- 相機(jī) --> 
<key>NSCameraUsageDescription</key> 
<string>app需要您的同意,才能訪問相機(jī)</string> 
<!-- 麥克風(fēng) --> 
<key>NSMicrophoneUsageDescription</key> 
<string>app需要您的同意,才能訪問麥克風(fēng)</string> 
<!-- 位置 --> 
<key>NSLocationUsageDescription</key> 
<string>app需要您的同意,才能訪問位置</string> 
<!-- 在使用期間訪問位置 --> <key>NSLocationWhenInUseUsageDescription</key> 
<string>app需要您的同意,才能在使用期間訪問位置</string> 
<!-- 始終訪問位置 --> 
<key>NSLocationAlwaysUsageDescription</key> 
<string>app需要您的同意,才能始終訪問位置</string> 
<!-- 日歷 --> 
<key>NSCalendarsUsageDescription</key> 
<string>app需要您的同意,才能訪問日歷</string> 
<!-- 提醒事項 --> 
<key>NSRemindersUsageDescription</key> 
<string>app需要您的同意,才能訪問提醒事項</string> 
<!-- 運動與健身 --> 
<key>NSMotionUsageDescription</key> 
<string>app需要您的同意,才能訪問運動與健身</string> 
<!-- 健康更新 --> 
<key>NSHealthUpdateUsageDescription</key> 
<string>app需要您的同意,才能訪問健康更新 </string> 
<!-- 健康分享 --> 
<key>NSHealthShareUsageDescription</key> 
<string>app需要您的同意,才能訪問健康分享</string> 
<!-- 藍(lán)牙 --> 
<key>NSBluetoothPeripheralUsageDescription</key> 
<string>app需要您的同意,才能訪問藍(lán)牙</string> 
<!-- 媒體資料庫 --> 
<key>NSAppleMusicUsageDescription</key> 
<string>app需要您的同意,才能訪問媒體資料庫</string>

四趟径、UIColor的問題

官方文檔中說:大多數(shù)core開頭的圖形框架和AVFoundation都提高了對擴(kuò)展像素和寬色域色彩空間的支持.通過圖形堆棧擴(kuò)展這種方式比以往支持廣色域的顯示設(shè)備更加容易”窭簦現(xiàn)在對UIKit擴(kuò)展可以在sRGB的色彩空間下工作,性能更好,也可以在更廣泛的色域來搭配sRGB顏色.

如果你的項目中是通過低級別的api自己實現(xiàn)圖形處理的,建議使用sRGB,也就是說在項目中使用了RGB轉(zhuǎn)化顏色的建議轉(zhuǎn)換為使用sRGB,在UIColor
類中新增了兩個api:

- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

五蜗巧、真彩色的顯示
真彩色的顯示會根據(jù)光感應(yīng)器來自動的調(diào)節(jié)達(dá)到特定環(huán)境下顯示與性能的平衡效果,如果需要這個功能的話,可以在info.plist里配置(在Source Code模式下):

<key>UIWhitePointAdaptivityStyle</key>

它有五種取值,分別是:

<string>UIWhitePointAdaptivityStyleStandard</string> // 標(biāo)準(zhǔn)模式<string>UIWhitePointAdaptivityStyleReading</string> // 閱讀模式<string>UIWhitePointAdaptivityStylePhoto</string> // 圖片模式<string>UIWhitePointAdaptivityStyleVideo</string> // 視頻模式<string>UIWhitePointAdaptivityStyleStandard</string> // 游戲模式

也就是說如果你的項目是閱讀類的,就選擇UIWhitePointAdaptivityStyleReading
這個模式,五種模式的顯示效果是從上往下遞減,也就是說如果你的項目是圖片處理類的,你選擇的是閱讀模式,給選擇太好的效果會影響性能.

六掌眠、ATS的問題
WWDC 15 提出的 ATS (App Transport Security) 是 Apple 在推進(jìn)網(wǎng)絡(luò)通訊安全的一個重要方式。在 iOS 9 和 OS X 10.11 中幕屹,默認(rèn)情況下非 HTTPS 的網(wǎng)絡(luò)訪問是被禁止的蓝丙。當(dāng)然级遭,因為這樣的推進(jìn)影響面非常廣,作為緩沖渺尘,我們可以在 Info.plist 中添加 NSAppTransportSecurity字典并且將 NSAllowsArbitraryLoads設(shè)置為YES來禁用 ATS挫鸽。
不過,WWDC 16 中鸥跟,Apple 表示將繼續(xù)在 iOS 10 和 macOS 10.12 里收緊對普通 HTTP 的訪問限制丢郊。從 2017 年 1 月 1 日起,所有的新提交 app 默認(rèn)是不允許使用 NSAllowsArbitraryLoads來繞過 ATS 限制的医咨,也就是說蚂夕,我們最好保證 app 的所有網(wǎng)絡(luò)請求都是 HTTPS 加密的,否則可能會在應(yīng)用審核時遇到麻煩腋逆。
但是我們可以選擇使用NSExceptionDomains設(shè)置白名單的方式對特定的域名開放HTTP內(nèi)容來通過審核,比如說你的應(yīng)用集成了第三方的登錄分享SDK,可以通過這種方式來做,下面以新浪SDK作為示范(Source Code 模式下):

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>sina.cn</key>
        <dict>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

ps:
一般不建議這么做,對于 API 請求侈贷,基本上是必須使用 HTTPS 的惩歉,可能需要后端的同學(xué)盡快升級到 HTTPS,只有這樣俏蛮,才能確保數(shù)據(jù)在傳輸時的安全撑蚌,同時也避免了應(yīng)用審核時遇到麻煩。

七搏屑、Xcode 8 運行一堆沒用的logs解決辦法

0df03d78258a14cca2d455c62e845700.png

上圖我們看到争涌,自己新建的一個工程啥也沒干就打印一堆爛七八糟的東西,我覺得這個應(yīng)該是Xcode 8的問題辣恋,具體也沒細(xì)研究亮垫,解決辦法是設(shè)置OS_ACTIVITY_MODE : disable
如下圖:


b91b77d46c86330cb36fb219749414a1.png

從網(wǎng)上找到的答案:
Try this:
1- From Xcode menu open: Product > Scheme > Edit Scheme
2- On your Environment Variables set OS_ACTIVITY_MODE = disable

八、推送

自從Notification被引入之后伟骨,蘋果就不斷的更新優(yōu)化饮潦,但這些更新優(yōu)化只是小打小鬧,直至現(xiàn)在iOS 10開始真正的進(jìn)行大改重構(gòu)携狭,這讓開發(fā)者也體會到UserNotifications的易用继蜡,功能也變得非常強(qiáng)大。

九逛腿、字體變化
蘋果的默認(rèn)字體會隨著iOS系統(tǒng)版本的不同而不同稀并,iOS10中字體變大了。導(dǎo)致了原來的顯示有問題单默,會造成...的出現(xiàn)碘举。暫時沒有好的解決辦法,需要自己在一個個適配一下雕凹!

十殴俱、UIStatusBar的問題
在你的viewController重寫我們還沒用的新的方法

- (BOOL)prefersStatusBarHidden{ 
    return YES;
}
- (UIStatusBarStyle)preferredStatusBarStyle{
   return UIStatusBarStyleDefault;
}

ps:
上面這個新方法在UIViewController.h文件中政冻,這說明什么?當(dāng)然說明這是viewController的屬性和方法了线欲,只需要在viewController里調(diào)用修改即可
UIStatusBarStyle 和 prefersStatusBarHidden這兩個屬性是readonly readonly readonly也就是說我們?nèi)绻{(diào)用下面 肯定是報錯的:

self.preferredStatusBarStyle = UIStatusBarStyleDefault;
和
self.prefersStatusBarHidden = YES;

這么寫是錯誤的明场。

這是我在項目中遇到的問題,如果你還遇到其他的問題李丰,請評論我苦锨,咱們一起完善。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趴泌,一起剝皮案震驚了整個濱河市舟舒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗜憔,老刑警劉巖秃励,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吉捶,居然都是意外死亡夺鲜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門呐舔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來币励,“玉大人,你說我怎么就攤上這事珊拼∈成耄” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵澎现,是天一觀的道長仅胞。 經(jīng)常有香客問我,道長剑辫,這世上最難降的妖魔是什么饼问? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮揭斧,結(jié)果婚禮上莱革,老公的妹妹穿的比我還像新娘。我一直安慰自己讹开,他們只是感情好盅视,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旦万,像睡著了一般闹击。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上成艘,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天赏半,我揣著相機(jī)與錄音贺归,去河邊找鬼。 笑死断箫,一個胖子當(dāng)著我的面吹牛拂酣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仲义,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婶熬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了埃撵?” 一聲冷哼從身側(cè)響起赵颅,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暂刘,沒想到半個月后饺谬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡谣拣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年商蕴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芝发。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苛谷,靈堂內(nèi)的尸體忽然破棺而出辅鲸,到底是詐尸還是另有隱情,我是刑警寧澤腹殿,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布独悴,位于F島的核電站,受9級特大地震影響锣尉,放射性物質(zhì)發(fā)生泄漏刻炒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一自沧、第九天 我趴在偏房一處隱蔽的房頂上張望坟奥。 院中可真熱鬧,春花似錦拇厢、人聲如沸爱谁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽访敌。三九已至,卻和暖如春衣盾,著一層夾襖步出監(jiān)牢的瞬間寺旺,已是汗流浹背爷抓。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留阻塑,地道東北人蓝撇。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像叮姑,于是被迫代替她去往敵國和親唉地。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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