新版本發(fā)布總會有很多坑,也會有很多改動萧恕。
一個一個填吧刚梭。档悠。。
一望浩、遇到的問題
1、權(quán)限以及相關(guān)設(shè)置
iOS10系統(tǒng)下調(diào)用系統(tǒng)相冊惰说、相機(jī)功能磨德,或者蘋果健康都會遇到閃退的情況,
調(diào)用系統(tǒng)相冊報錯描述如下:
This app has crashed because it attempted to access privacy-sensitive data without a usage description.The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data
解決辦法(fix method):
在info.plist —Source Code中添加
UsageDescription相關(guān)的key, 描述字符串自己隨意填寫就可以,但是一定要填寫吆视,不然會引發(fā)包無效的問題典挑,導(dǎo)致上傳打包后構(gòu)建版本一直不顯示。
<!-- 相冊 -->
<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>
<!-- 提醒事項(xiàng) -->
<key>NSRemindersUsageDescription</key>
<string>App需要您的同意,才能訪問提醒事項(xiàng)</string>
<!-- 運(yùn)動與健身 -->
<key>NSMotionUsageDescription</key> <string>App需要您的同意,才能訪問運(yùn)動與健身</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>
如果不起作用,可以請求后臺權(quán)限,類似于這樣:
<key>UIBackgroundModes</key>
<array>
<!-- 在這里寫上你在后臺模式下要使用權(quán)限對應(yīng)的key -->
<string>location</string>
...
</array>
或者在info.plist—Property List中添加
部分
麥克風(fēng)權(quán)限:Privacy - Microphone Usage Description
通訊錄權(quán)限: Privacy - Contacts Usage Description
藍(lán)牙權(quán)限:Privacy - Bluetooth Peripheral Usage Description
語音轉(zhuǎn)文字權(quán)限:Privacy - Speech Recognition Usage Description
日歷權(quán)限:Privacy - Calendars Usage Description
定位權(quán)限:Privacy - Location When In Use Usage Description
定位權(quán)限: Privacy - Location Always Usage Description
定位的需要這么寫啦吧,防止上架被拒您觉。
2、代碼注釋不能用的解決辦法
這個是因?yàn)樘O果解決xcode ghost授滓,把插件屏蔽了琳水。
解決辦法(fix method):
打開終端,命令運(yùn)行: sudo /usr/libexec/xpccachectl
重啟電腦后生效
注意:Xcode8內(nèi)置了開啟注釋的功能:
快捷鍵的設(shè)置:
Xcode-> Preferences -> Key Bindings
三方插件解決辦法(fix method):
讓你的 Xcode8 繼續(xù)使用插件
但是看到文章最后的解釋般堆,我們知道如果用插件的話在孝,可能安全上會有問題、并且提交審核會被拒絕淮摔,所以建議大家還是不要用了私沮,解決辦法總是有的,比如在Xcode中添加注釋的代碼塊也是很方便的和橙。
3.屏蔽雜亂無章的log
解決辦法(fix method):
Edit Scheme-> Run -> Arguments,
在Environment Variables里邊添加
OS_ACTIVITY_MODE = Disable
————這種方法會屏蔽掉真機(jī)的NSLog仔燕,解決方法請等待————
4.UIStatusBar方法過期:
解決辦法(fix method):
//屬性&&方法
@property(nonatomic, readonly) UIStatusBarStyle preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault
@property(nonatomic, readonly) BOOL prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
- (UIStatusBarStyle)preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault
- (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade
//可以這樣寫
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
5.label中的文字顯示不全
用Xcode 8和Xcode 7.3
分別測試了下,如下圖:
Xcode 8
Xcode 7
創(chuàng)建一個Label然后讓它自適應(yīng)大小魔招,字體大小都是17最后輸出的寬度是不一樣的晰搀,我們再看一下,下面的數(shù)據(jù)就知道為什么升iOS 10之后App中有的文字顯示不全了:
發(fā)現(xiàn)英文字母沒有問題仆百,只有漢字有問題厕隧。目前只有一個一個修改控件解決這個問題。
解決辦法(fix method):
UILabel *myLabel = [UILabel new];
/*UIFont 的preferredFontForTextStyle: 意思是指定一個樣式俄周,并讓字體大小符合用戶設(shè)定的字體大小吁讨。 */
myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline];
/*
Indicates whether the corresponding element should automatically update its font when the device’s UIContentSizeCategory is changed.
For this property to take effect, the element’s font must be a font vended using +preferredFontForTextStyle: or +preferredFontForTextStyle:compatibleWithTraitCollection: with a valid UIFontTextStyle.
*/
//是否更新字體的變化
myLabel.adjustsFontForContentSizeCategory = YES;
6.使用Xib awakeFromNib的警告問題
在Xcode 8之前我們使用Xib初始化- (void)awakeFromNib {}
都是這么寫也沒什么問題,但是在Xcode 8會有如下警告:
如果不喜歡這個警告的話峦朗,應(yīng)該明確的加上[super awakeFromNib];
7.判斷系統(tǒng)版本
oc
//值為10.0
[[UIDevice currentDevice] systemVersion]
if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = 9, .minorVersion = 1, .patchVersion = 0}]) {
NSLog(@"Hello from > iOS 9.1");
}
if ([NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){9,3,0}]) {
NSLog(@"Hello from > iOS 9.3");
}
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_9_0) {
// do stuff for iOS 9 and newer
}
else {
// do stuff for older versions than iOS 9
}
swift
if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 10, minorVersion: 0, patchVersion: 0)) {
// 代碼塊
}
if #available(iOS 10.0, *) {
// 代碼塊
} else {
// 代碼塊
}
8.ATS的問題
iOS 9中默認(rèn)非HTTPS的網(wǎng)絡(luò)是被禁止的建丧,當(dāng)然我們也可以把NSAllowsArbitraryLoads設(shè)置為YES禁用ATS。
我們還可以通過NSExceptionDomains來針對特定的域名開放HTTP可以容易通過審核波势。
參考學(xué)習(xí)文章如下:關(guān)于 iOS 10 中 ATS 的問題
9.Xib文件的注意事項(xiàng)
使用Xcode8打開xib文件后翎朱,會出現(xiàn)下圖的提示:
大家選擇Choose Device即可橄维。
之后大家會發(fā)現(xiàn)布局啊,frame亂了拴曲,只需要更新一下frame即可争舞。如下圖
- 注意:如果按上面的步驟操作后,在用Xcode7打開Xib會報一下錯誤澈灼,
- 解決辦法:右鍵Xib文件->Open As Source Code 刪除下面的
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
這句話竞川,以及把< document >中的toolsVersion和< plugIn >中的version改成你正常的xib文件中的值,不過不建議這么做叁熔,在Xcode8出來后委乌,希望大家都快速上手,全員更新荣回。這就跟Xcode5到Xcode6一樣遭贸,有變動,但是還是要盡早學(xué)習(xí)心软,盡快適應(yīng)喲壕吹!
10.tabbar隱藏上面的黑線
//UITabBarController里面
[[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"BarBackground.png"];
[[UITabBar appearance] setShadowImage:[UIImage new]];
—————————————我是分割線—————————————
二、改動
1.UIColor 新增方法
在iOS 10 蘋果官方建議我們使用sRGB删铃,因?yàn)樗阅芨盟憷矢S富。如果你自己為UIColor寫了一套分類的話也可嘗試替換為sRGB泳姐,UIColor類中新增了兩個Api如下:
+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
2.真彩色的顯示
真彩色的顯示會根據(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> // 游戲模式
也就是說如果你的項(xiàng)目是閱讀類的,就選擇UIWhitePointAdaptivityStyleReading這個模式,五種模式的顯示效果是從上往下遞減,也就是說如果你的項(xiàng)目是圖片處理類的,你選擇的是閱讀模式,給選擇太好的效果會影響性能.
3.UITextContentType
// The textContentType property is to provide the keyboard with extra information about the semantic intent of the text document.
@property(nonatomic,copy) UITextContentType textContentType NS_AVAILABLE_IOS(10_0); // default is nil
在iOS 10UITextField添加了textContentType枚舉效拭,指示文本輸入?yún)^(qū)域所期望的語義意義。
使用此屬性可以給鍵盤和系統(tǒng)信息胖秒,關(guān)于用戶輸入的內(nèi)容的預(yù)期的語義意義缎患。例如,您可以指定一個文本字段阎肝,用戶填寫收到一封電子郵件確認(rèn)uitextcontenttypeemailaddress挤渔。當(dāng)您提供有關(guān)您期望用戶在文本輸入?yún)^(qū)域中輸入的內(nèi)容的信息時,系統(tǒng)可以在某些情況下自動選擇適當(dāng)?shù)逆I盤风题,并提高鍵盤修正和主動與其他文本輸入機(jī)會的整合判导。
4. UIRefreshControl的使用
在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脫離了UITableViewController.現(xiàn)在RefreshControl是UIScrollView的一個屬性.使用方法:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(loadData) forControlEvents:UIControlEventValueChanged];
collectionView.refreshControl = refreshControl;
5.Notification(通知)
自從Notification被引入之后,蘋果就不斷的更新優(yōu)化沛硅,但這些更新優(yōu)化只是小打小鬧眼刃,直至現(xiàn)在iOS 10開始真正的進(jìn)行大改重構(gòu),這讓開發(fā)者也體會到UserNotifications的易用摇肌,功能也變得非常強(qiáng)大擂红。
iOS 9 以前的通知
- 在調(diào)用方法時,有些方法讓人很難區(qū)分围小,容易寫錯方法昵骤,這讓開發(fā)者有時候很苦惱树碱。
- 應(yīng)用在運(yùn)行時和非運(yùn)行時捕獲通知的路徑還不一致。
- 應(yīng)用在前臺時变秦,是無法直接顯示遠(yuǎn)程通知成榜,還需要進(jìn)一步處理。
- 已經(jīng)發(fā)出的通知是不能更新的蹦玫,內(nèi)容發(fā)出時是不能改變的伦连,并且只有簡單文本展示方式,擴(kuò)展性根本不是很好钳垮。
iOS 10 開始的通知
- 所有相關(guān)通知被統(tǒng)一到了UserNotifications.framework框架中。
- 增加了撤銷额港、更新饺窿、中途還可以修改通知的內(nèi)容。
- 通知不在是簡單的文本了移斩,可以加入視頻肚医、圖片,自定義通知的展示等等向瓷。
- iOS 10相對之前的通知來說更加好用易于管理肠套,并且進(jìn)行了大規(guī)模優(yōu)化,對于開發(fā)者來說是一件好事猖任。
- iOS 10開始對于權(quán)限問題進(jìn)行了優(yōu)化你稚,申請權(quán)限就比較簡單了(本地與遠(yuǎn)程通知集成在一個方法中)。
iOS 10 通知學(xué)習(xí)相關(guān)資料:
6.UICollectionViewCell
在iOS 10 之前,UICollectionView上面如果有大量cell,當(dāng)用戶活動很快的時候,整個UICollectionView的卡頓會很明顯,為什么會造成這樣的問題,這里涉及到了iOS 系統(tǒng)的重用機(jī)制,當(dāng)cell準(zhǔn)備加載進(jìn)屏幕的時候,整個cell都已經(jīng)加載完成,等待在屏幕外面了,也就是整整一行cell都已經(jīng)加載完畢,這就是造成卡頓的主要原因,專業(yè)術(shù)語叫做:掉幀.要想讓用戶感覺不到卡頓,我們的app必須幀率達(dá)到60幀/秒,也就是說每幀16毫秒要刷新一次.
iOS 10 之前UICollectionViewCell的生命周期是這樣的:
- 用戶滑動屏幕,屏幕外有一個cell準(zhǔn)備加載進(jìn)來,把cell從reusr隊(duì)列拿出來,然后調(diào)用prepareForReuse方法,在這個方法里面,可以重置cell的狀態(tài),加載新的數(shù)據(jù);
- 繼續(xù)滑動,就會調(diào)用cellForItemAtIndexPath方法,在這個方法里面給cell賦值模型,然后返回給系統(tǒng);
- 當(dāng)cell馬上進(jìn)去屏幕的時候,就會調(diào)用willDisplayCell方法,在這個方法里面我們還可以修改cell,為進(jìn)入屏幕做最后的準(zhǔn)備工作;
- 執(zhí)行完willDisplayCell方法后,cell就進(jìn)去屏幕了.當(dāng)cell完全離開屏幕以后,會調(diào)用didEndDisplayingCell方法.
iOS 10 UICollectionViewCell的生命周期是這樣的:
- 用戶滑動屏幕,屏幕外有一個cell準(zhǔn)備加載進(jìn)來,把cell從reusr隊(duì)列拿出來,然后調(diào)用prepareForReuse方法,在這里當(dāng)cell還沒有進(jìn)去屏幕的時候,就已經(jīng)提前調(diào)用這個方法了,對比之前的區(qū)別是之前是cell的上邊緣馬上進(jìn)去屏幕的時候就會調(diào)用該方法,而iOS 10 提前到cell還在屏幕外面的時候就調(diào)用;
- 在cellForItemAtIndexPath中創(chuàng)建cell朱躺,填充數(shù)據(jù)刁赖,刷新狀態(tài)等操作,相比于之前也提前了;
- 用戶繼續(xù)滑動的話,當(dāng)cell馬上就需要顯示的時候我們再調(diào)用willDisplayCell方法,原則就是:何時需要顯示,何時再去調(diào)用willDisplayCell方法;
- 當(dāng)cell完全離開屏幕以后,會調(diào)用didEndDisplayingCell
方法,跟之前一樣,cell會進(jìn)入重用隊(duì)列.在iOS 10 之前,cell只能從重用隊(duì)列里面取出,再走一遍生命周期,并調(diào)用cellForItemAtIndexPath
創(chuàng)建或者生成一個cell.在iOS 10 中,系統(tǒng)會cell保存一段時間,也就是說當(dāng)用戶把cell滑出屏幕以后,如果又滑動回來,cell不用再走一遍生命周期了,只需要調(diào)用willDisplayCell
方法就可以重新出現(xiàn)在屏幕中了.iOS 10 中,系統(tǒng)是一個一個加載cell的,二以前是一行一行加載的,這樣就可以提升很多性能;
iOS 10 新增加的Pre-Fetching預(yù)加載
這個是為了降低UICollectionViewCell在加載的時候所花費(fèi)的時間,在 iOS 10 中,除了數(shù)據(jù)源協(xié)議和代理協(xié)議外,新增加了一個UICollectionViewDataSourcePrefetching
協(xié)議,這個協(xié)議里面定義了兩個方法:
- (void)collectionView:(UICollectionView *)collectionView prefetchItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths NS_AVAILABLE_IOS(10_0);
- (void)collectionView:(UICollectionView *)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths NS_AVAILABLE_IOS(10_0);
在ColletionView prefetchItemsAt indexPaths這個方法是異步預(yù)加載數(shù)據(jù)的,當(dāng)中的indexPaths數(shù)組是有序的,就是item接收數(shù)據(jù)的順序;CollectionView cancelPrefetcingForItemsAt indexPaths這個方法是可選的,可以用來處理在滑動中取消或者降低提前加載數(shù)據(jù)的優(yōu)先級.注意:這個協(xié)議并不能代替之前讀取數(shù)據(jù)的方法,僅僅是輔助加載數(shù)據(jù).Pre-Fetching預(yù)加載對UITableViewCell同樣適用.
7.UINavigationBar
iOS10之前的navigationBar的背景是@"_UINavigationBarBackground",到iOS10變成了@"_UIBarBackground"长搀。
#define iOS10 ([[UIDevice currentDevice].systemVersion intValue]>=10?YES:NO)
NSArray *subviews=self.navigationController.navigationBar.subviews;
for (UIView *view in subviews) {
if (iOS10) {
//iOS10,改變了狀態(tài)欄的類為_UIBarBackground
if ([view isKindOfClass:NSClassFromString(@"_UIBarBackground")]) {
view.hidden = YES;
}
}else{
//iOS9以及iOS9之前使用的是_UINavigationBarBackground
if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) {
view.hidden = YES;
}
}
}
—————————————我是分割線—————————————
iOS 10 蘋果官方文檔
共
同
進(jìn)
步
給個喜歡喔O(∩_∩)O
參考文章:
iOS 日常工作之常用宏定義大全
兼容iOS 10 資料整理筆記
iOS開發(fā) 適配iOS10以及Xcode8
iOS 10 的適配問題