公司的項目埂奈,臨上線之前做了一下iOS10的適配铅祸,發(fā)現(xiàn)一大堆的坑嗦玖,瞬間覺得蘋果不友好了。
一妈经、證書問題
打開xcode8.0時編譯運行時出現(xiàn)下面問題:
這個問題剛開始估計大家都會碰到也是第一個要解決的問題這個問題就是一個證書的設(shè)置問題淮野,下面看兩張圖正常我們會在BuildeSettings中設(shè)置證書:
但是在xcode8.0中我們看到下面的新特性:
相信大家都能看到在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,控制臺會輸出下面這樣的日志:
這是因為iOS對用戶的安全和隱私的增強(qiáng),在申請很多私有權(quán)限的時候都需要添加描述,但是,在使用Xcode 8之前的Xcode還是使用系統(tǒng)的權(quán)限通知框.
要想解決這個問題,只需要在info.plist添加NSContactsUsageDescription的key, value自己隨意填寫就可以,這里列舉出對應(yīng)的key(Source Code模式下):
<!-- 相冊 -->
<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解決辦法
上圖我們看到争涌,自己新建的一個工程啥也沒干就打印一堆爛七八糟的東西,我覺得這個應(yīng)該是Xcode 8的問題辣恋,具體也沒細(xì)研究亮垫,解決辦法是設(shè)置OS_ACTIVITY_MODE : disable
如下圖:
從網(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;
這么寫是錯誤的明场。
這是我在項目中遇到的問題,如果你還遇到其他的問題李丰,請評論我苦锨,咱們一起完善。