iOS10的適配和Xcode8配置箫踩,勤勞的程序猴子總得去整理這些個(gè)東西哎迄,都是淚,都是淚斤蔓,都是淚啊植酥。
Xcode8控制臺(tái)打印
升級(jí)Xcode8.0之后運(yùn)行項(xiàng)目,控制臺(tái)瘋狂打印了一堆堆瞎吧東西弦牡。想要直接去掉也好說(shuō)惧互,解決:
在Product - Scheme - Edit Scheme 下的Run -> Arguments -> Environment Variables 添加 OS_ACTIVITY_MODE = disable
注:?jiǎn)蝹€(gè)程序加這參數(shù),只針對(duì)這一個(gè)程序喇伯。
URL Schemes跳轉(zhuǎn)系統(tǒng)設(shè)置
比如點(diǎn)擊跳轉(zhuǎn)到地理定位的開啟設(shè)置里:(比如 WiFi喊儡、蜂窩數(shù)據(jù)、定位等)
注:iOS10以后稻据,prefs:root開頭的Scheme無(wú)法跳轉(zhuǎn)到系統(tǒng)設(shè)置里了艾猜。
UIRefreshControl的使用
在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脫離了UITableViewController.現(xiàn)在RefreshControl是UIScrollView的一個(gè)屬性. 使用方法:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(loadData) forControlEvents:UIControlEventValueChanged];
collectionView.refreshControl = refreshControl;
UIApplication對(duì)象中openUrl被廢棄
在iOS 10以前,我們要想使用應(yīng)用程序去打開一個(gè)網(wǎng)頁(yè)或者進(jìn)行跳轉(zhuǎn)捻悯,直接使用[[UIApplication sharedApplication] openURL 方法就可以了匆赃。
?但是在iOS 10 已經(jīng)被廢棄了,因?yàn)槭褂眠@種方式今缚,處理的結(jié)果我們不能攔截到也不能獲取到算柳,對(duì)于開發(fā)是非常不利的,在iOS 10全新的推出了 [[UIApplication sharedApplication] openURL:nil options:nil completionHandler:nil];有一個(gè)成功的回調(diào)block 可以進(jìn)行監(jiān)視姓言,注:有警告瞬项。
注釋快捷鍵command+/失效
因?yàn)樘O果解決xcode ghost,把插件屏蔽了何荚,Xcode8.0的注釋// 生成快捷鍵 command+/失效了
解決辦法:
終端運(yùn)行命令:sudo /usr/libexec/xpccachectl
Password:輸入開機(jī)密碼
重啟Mac生效
生效后空行快捷鍵囱淋,只在代碼行能產(chǎn)生/解除注釋,空行不能產(chǎn)生注釋餐塘。
注意:Xcode8內(nèi)置了開啟注釋的功能妥衣,位置在這里
快捷鍵的設(shè)置在這里
Xcode8取消了三方插件的功能,具體可以查閱下Xcode8 Source Editor
自動(dòng)簽名和手動(dòng)簽名
IOS10加入自動(dòng)簽名,Xcode8.0加入Automatically Manage Signing税手。
在此借用study_sea大大的文章(自動(dòng)和手動(dòng)簽名說(shuō)明)蜂筹。
Xcode8開發(fā)iOS10推送
項(xiàng)目中有推送的話,需要開啟Push Notifications芦倒。
其他的推送通知過(guò)程借用zhao0大大的文章(iOS10推送通知過(guò)程)
Xib文件的變更
使用XCode8打開xib文件后狂票,會(huì)出現(xiàn)下圖的提示。
大家選擇Choose Device即可熙暴。
布局已經(jīng)亂了闺属,需要更新一下frame即可。如下圖
注意:如果按上面的步驟操作后周霉,在用Xcode7打開Xib會(huì)報(bào)一下錯(cuò)誤掂器,
解決辦法:需要?jiǎng)h除Xib里面
這句話,以及把< document >中的toolsVersion和< plugIn >中的version改成你正常的xib文件中的值俱箱。
權(quán)限配置
隨著人們對(duì)隱私保護(hù)的注重国瓮,似乎蘋果的每一代產(chǎn)品都有相應(yīng)的體現(xiàn)——更為嚴(yán)格的設(shè)備和數(shù)據(jù)訪問權(quán)限控制。
在iOS10中狞谱,如果你的App想要訪問用戶的相機(jī)乃摹、相冊(cè)、麥克風(fēng)跟衅、通訊錄等等權(quán)限孵睬,都需要進(jìn)行相關(guān)的配置,不然會(huì)直接crash伶跷。
你需要在info.plist中添加你App需要的一些設(shè)備權(quán)限掰读。
首先找到info,可以直接在這里添加鍵值對(duì):
一些常用的權(quán)限配置選項(xiàng):
// 相機(jī)NSCameraUsageDescriptionApp需要您的同意,才能訪問相冊(cè)
// 相冊(cè)NSPhotoLibraryUsageDescriptionApp需要您的同意,才能訪問相機(jī)
// 麥克風(fēng):NSMicrophoneUsageDescriptionApp需要您的同意,才能訪問麥克風(fēng)
// 通信錄NSContactsUsageDescriptionApp需要您的同意,才能訪問通信錄
其它權(quán)限配置選項(xiàng):
// 位置NSLocationUsageDescriptionApp需要您的同意,才能訪問位置
// 在使用期間訪問位置NSLocationWhenInUseUsageDescriptionApp需要您的同意,才能在使用期間訪問位置
// 始終訪問位置NSLocationAlwaysUsageDescriptionApp需要您的同意,才能始終訪問位置
// 日歷NSCalendarsUsageDescriptionApp需要您的同意,才能訪問日歷
// 提醒事項(xiàng)NSRemindersUsageDescriptionApp需要您的同意,才能訪問提醒事項(xiàng)
// 運(yùn)動(dòng)與健身NSMotionUsageDescriptionApp需要您的同意,才能訪問運(yùn)動(dòng)與健身
// 健康更新NSHealthUpdateUsageDescriptionApp需要您的同意,才能訪問健康更新
// 健康分享NSHealthShareUsageDescriptionApp需要您的同意,才能訪問健康分享
// 藍(lán)牙NSBluetoothPeripheralUsageDescriptionApp需要您的同意,才能訪問藍(lán)牙
// 媒體資料庫(kù)NSAppleMusicUsageDescriptionApp需要您的同意,才能訪問媒體資料庫(kù)
UICollectionViewCell的的優(yōu)化
在iOS 10 之前,UICollectionView上面如果有大量cell,當(dāng)用戶活動(dòng)很快的時(shí)候,整個(gè)UICollectionView的卡頓會(huì)很明顯,為什么會(huì)造成這樣的問題,這里涉及到了iOS 系統(tǒng)的重用機(jī)制,當(dāng)cell準(zhǔn)備加載進(jìn)屏幕的時(shí)候,整個(gè)cell都已經(jīng)加載完成,等待在屏幕外面了,也就是整整一行cell都已經(jīng)加載完畢,這就是造成卡頓的主要原因,專業(yè)術(shù)語(yǔ)叫做:掉幀.
要想讓用戶感覺不到卡頓,我們的app必須幀率達(dá)到60幀/秒,也就是說(shuō)每幀16毫秒要刷新一次.
iOS 10 之前UICollectionViewCell的生命周期是這樣的:
用戶滑動(dòng)屏幕,屏幕外有一個(gè)cell準(zhǔn)備加載進(jìn)來(lái),把cell從reusr隊(duì)列拿出來(lái),然后調(diào)用prepareForReuse方法,在這個(gè)方法里面,可以重置cell的狀態(tài),加載新的數(shù)據(jù);
繼續(xù)滑動(dòng),就會(huì)調(diào)用cellForItemAtIndexPath方法,在這個(gè)方法里面給cell賦值模型,然后返回給系統(tǒng);
當(dāng)cell馬上進(jìn)去屏幕的時(shí)候,就會(huì)調(diào)用willDisplayCell方法,在這個(gè)方法里面我們還可以修改cell,為進(jìn)入屏幕做最后的準(zhǔn)備工作;
執(zhí)行完willDisplayCell方法后,cell就進(jìn)去屏幕了.當(dāng)cell完全離開屏幕以后,會(huì)調(diào)用didEndDisplayingCell方法.
iOS 10 UICollectionViewCell的生命周期是這樣的:
用戶滑動(dòng)屏幕,屏幕外有一個(gè)cell準(zhǔn)備加載進(jìn)來(lái),把cell從reusr隊(duì)列拿出來(lái),然后調(diào)用prepareForReuse方法,在這里當(dāng)cell還沒有進(jìn)去屏幕的時(shí)候,就已經(jīng)提前調(diào)用這個(gè)方法了,對(duì)比之前的區(qū)別是之前是cell的上邊緣馬上進(jìn)去屏幕的時(shí)候就會(huì)調(diào)用該方法,而iOS 10 提前到cell還在屏幕外面的時(shí)候就調(diào)用;
在cellForItemAtIndexPath中創(chuàng)建cell叭莫,填充數(shù)據(jù)蹈集,刷新狀態(tài)等操作,相比于之前也提前了;
用戶繼續(xù)滑動(dòng)的話,當(dāng)cell馬上就需要顯示的時(shí)候我們?cè)僬{(diào)用willDisplayCell方法,原則就是:何時(shí)需要顯示,何時(shí)再去調(diào)用willDisplayCell方法;
當(dāng)cell完全離開屏幕以后,會(huì)調(diào)用didEndDisplayingCell方法,跟之前一樣,cell會(huì)進(jìn)入重用隊(duì)列.
在iOS 10 之前,cell只能從重用隊(duì)列里面取出,再走一遍生命周期,并調(diào)用cellForItemAtIndexPath創(chuàng)建或者生成一個(gè)cell.
在iOS 10 中,系統(tǒng)會(huì)cell保存一段時(shí)間,也就是說(shuō)當(dāng)用戶把cell滑出屏幕以后,如果又滑動(dòng)回來(lái),cell不用再走一遍生命周期了,只需要調(diào)用willDisplayCell方法就可以重新出現(xiàn)在屏幕中了.
iOS 10 中,系統(tǒng)是一個(gè)一個(gè)加載cell的,二以前是一行一行加載的,這樣就可以提升很多性能;
iOS 10 新增加的Pre-Fetching預(yù)加載
這個(gè)是為了降低UICollectionViewCell在加載的時(shí)候所花費(fèi)的時(shí)間,在 iOS 10 中,除了數(shù)據(jù)源協(xié)議和代理協(xié)議外,新增加了一個(gè)UICollectionViewDataSourcePrefetching協(xié)議,這 個(gè)協(xié)議里面定義了兩個(gè)方法:
- (void)collectionView:(UICollectionView*)collectionView prefetchItemsAtIndexPaths:(NSArray *)indexPathsNS_AVAILABLE_IOS(10_0);- (void)collectionView:(UICollectionView*)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray *)indexPathsNS_AVAILABLE_IOS(10_0);
在ColletionView prefetchItemsAt indexPaths這個(gè)方法是異步預(yù)加載數(shù)據(jù)的,當(dāng)中的indexPaths數(shù)組是有序的,就是item接收數(shù)據(jù)的順序;
CollectionView cancelPrefetcingForItemsAt indexPaths這個(gè)方法是可選的,可以用來(lái)處理在滑動(dòng)中取消或者降低提前加載數(shù)據(jù)的優(yōu)先級(jí).
注意:這個(gè)協(xié)議并不能代替之前讀取數(shù)據(jù)的方法,僅僅是輔助加載數(shù)據(jù).
Pre-Fetching預(yù)加載對(duì)UITableViewCell同樣適用.
xib布局注意
ios10上UICollectionView的這個(gè)代理,在10以下會(huì)崩潰雇初,大家用xib別點(diǎn)拢肆。
由于10的適配,這種小的在10上顯示正常靖诗,以下顯示不全郭怪,建議多給點(diǎn)坐標(biāo)。
參考:iOS 10 適配知識(shí)點(diǎn)總結(jié)?
? ? ? ? ? ?iOS10升級(jí)后的一些問題