如果應(yīng)用中需要使用 本地網(wǎng)絡(luò) 需要在 Info.plist 中配置兩個(gè)選項(xiàng)芹缔,詳細(xì)描述為什么需要使用該權(quán)限捶闸,以及需要列出具體使用 本地網(wǎng)絡(luò) 的服務(wù)列表。
在6月份剛結(jié)束的首次線上 WWDC 2020 發(fā)布會(huì)上蘋果向我們展示了新的 iOS14 系統(tǒng)乾忱。iOS14 的適配彤守,很重要的一環(huán)就集中在用戶隱私和安全方面。
在 iOS13 及以前洒缀,當(dāng)用戶首次訪問(wèn)應(yīng)用程序時(shí)瑰谜,會(huì)被要求開(kāi)放大量權(quán)限,比如相冊(cè)树绩、定位萨脑、聯(lián)系人,實(shí)際上該應(yīng)用可能僅僅需要一個(gè)選擇圖片功能饺饭,卻被要求開(kāi)放整個(gè)照片庫(kù)的權(quán)限渤早,這確實(shí)是不合理的。對(duì)于相冊(cè)瘫俊,在 iOS14 中引入了 “LimitedPhotos Library” 的概念鹊杖,用戶可以授予應(yīng)用訪問(wèn)其一部分的照片,對(duì)于應(yīng)用來(lái)說(shuō)扛芽,僅能讀取到用戶選擇讓應(yīng)用來(lái)讀取的照片骂蓖,讓我們看到了 Apple 對(duì)于用戶隱私的尊重。這僅僅是一部分川尖,在iOS14 中登下,可以看到諸多類似的保護(hù)用戶隱私的措施,也需要我們升級(jí)適配叮喳。
本文主要分享一下 iOS14 上對(duì)于隱私授權(quán)的變更和部分適配方案被芳,歡迎補(bǔ)充指正。
適配點(diǎn)
?? 相冊(cè)
?? iOS14 新增了“Limited Photo Library Access” 模式馍悟,在授權(quán)彈窗中增加了 Select Photo 選項(xiàng)畔濒。用戶可以在 App 請(qǐng)求調(diào)用相冊(cè)時(shí)選擇部分照片讓 App 讀取。從 App 的視?來(lái)看赋朦,你的相冊(cè)里就只有這幾張照片篓冲,App 無(wú)法得知其它照片的存在。
image.png
? iOS14 中當(dāng)用戶選擇
“PHAuthorizationStatusLimited” 時(shí)宠哄,如果未進(jìn)行適配壹将,有可能會(huì)在每次觸發(fā)相冊(cè)功能時(shí)都進(jìn)行彈窗詢問(wèn)用戶是否需要修改照片權(quán)限。
?? 對(duì)于這種情況可通過(guò)在 Info.plist 中設(shè)置
“PHPhotoLibraryPreventAutomaticLimitedAccessAlert”的值為 YES 來(lái)阻止該彈窗反復(fù)彈出毛嫉,并且可通過(guò)下面這個(gè) API 來(lái)主動(dòng)控制何時(shí)彈出PHPickerViewController 進(jìn)行照片選擇
[[PHPhotoLibrary sharedPhotoLibrary]presentLimitedLibraryPickerFromViewController:self];
? 在 iOS14 中官方推薦使用? PHPicker 來(lái)替代原 API 進(jìn)行圖片選擇诽俯。PHPicker 為獨(dú)立進(jìn)程,會(huì)在視圖最頂層進(jìn)行展示承粤,應(yīng)用內(nèi)無(wú)法對(duì)其進(jìn)行截圖也無(wú)法直接訪問(wèn)到其內(nèi)的數(shù)據(jù)暴区。
UIImagePickerController? -> PHPickerViewController, UIImagePickerViewController 功能受限辛臊,每次只能選擇一張圖片仙粱,將逐漸被廢棄。
image
PHPicker 支持多選彻舰,支持搜索伐割,支持按 image,video刃唤,livePhotos 等進(jìn)行選擇隔心。
image
?? 新API及遷移demo:
image
@interfaceViewController()<PHPickerViewControllerDelegate>@property(weak,nonatomic)IBOutlet UIImageView*imageView;@property(nonatomic,strong)NSArray<NSItemProvider*>*itemProviders;@end@implementationViewController-(void)viewDidLoad{[superviewDidLoad];// Do any additional setup after loading the view.}-(IBAction)button:(id)sender{// 以下 API 僅為 iOS14 onlyPHPickerConfiguration*configuration=[[PHPickerConfiguration alloc]init];configuration.filter=[PHPickerFilter videosFilter];// 可配置查詢用戶相冊(cè)中文件的類型,支持三種configuration.selectionLimit=0;// 默認(rèn)為1尚胞,為0時(shí)表示可多選硬霍。PHPickerViewController*picker=[[PHPickerViewController alloc]initWithConfiguration:configuration];picker.delegate=self;// picker vc,在選完圖片后需要在回調(diào)中手動(dòng) dismiss[selfpresentViewController:picker animated:YES completion:^{}];}#pragmamark - Delegate-(void)picker:(PHPickerViewController*)picker didFinishPicking:(NSArray<PHPickerResult*>*)results{[picker dismissViewControllerAnimated:YES completion:nil];if(!results||!results.count){return;}NSItemProvider*itemProvider=results.firstObject.itemProvider;if([itemProvider canLoadObjectOfClass:UIImage.class]){__weaktypeof(self)weakSelf=self;[itemProvider loadObjectOfClass:UIImage.class completionHandler:^(__kindof id<NSItemProviderReading>_Nullable object,NSError*_Nullable error){if([object isKindOfClass:UIImage.class]){__strongtypeof(self)strongSelf=weakSelf;dispatch_async(dispatch_get_main_queue(),^{strongSelf.imageView.image=(UIImage*)object;});}}];}}
?? 需要注意的是笼裳,在 limit Photo 模式下巡社,AssetsLibrary 訪問(wèn)相冊(cè)會(huì)失敗捷犹;在 writeOnly 模式下岭接,AssetLibrary 也會(huì)有顯示問(wèn)題。建議還在使用 AssetsLibrary 的同學(xué)盡快遷移到新 API楔脯。
? 授權(quán)相關(guān):舊 API 廢棄撩轰,增加 PHAccessLevel 參數(shù)。如果再使用以前的API來(lái)獲取權(quán)限狀態(tài)昧廷,
PHAuthorizationStatusLimited 狀態(tài)下也會(huì)返回
PHAuthorizationStatusAuthorized
image
typedefNS_ENUM(NSInteger,PHAccessLevel){PHAccessLevelAddOnly=1,// 僅允許添加照片PHAccessLevelReadWrite=2,// 允許訪問(wèn)照片堪嫂,limitedLevel 必須為 readWrite}API_AVAILABLE(macos(10.16),ios(14),tvos(14));// 查詢權(quán)限PHAccessLevel level=PHAccessLevelReadWrite;PHAuthorizationStatus status=[PHPhotoLibrary authorizationStatusForAccessLevel:level];switch(status){casePHAuthorizationStatusLimited:NSLog(@"limited");break;casePHAuthorizationStatusDenied:NSLog(@"denied");break;casePHAuthorizationStatusAuthorized:NSLog(@"authorized");break;default:break;}// 請(qǐng)求權(quán)限,需注意 limited 權(quán)限盡在 accessLevel 為 readAndWrite 時(shí)生效[PHPhotoLibrary requestAuthorizationForAccessLevel:level handler:^(PHAuthorizationStatus status){switch(status){casePHAuthorizationStatusLimited:NSLog(@"limited");break;casePHAuthorizationStatusDenied:NSLog(@"denied");break;casePHAuthorizationStatusAuthorized:NSLog(@"authorized");break;default:break;}}];
?? 定位
?? 在 iOS13 及以前木柬,App 請(qǐng)求用戶定位授權(quán)時(shí)為如下形態(tài):一旦用戶同意應(yīng)用獲取定位信息皆串,當(dāng)前應(yīng)用就可以獲取到用戶的精確定位。
?? iOS14 新增用戶大致位置選項(xiàng)可供用戶選擇眉枕,原因是大多數(shù) App 實(shí)際上并不需要獲取用戶到用戶最準(zhǔn)確的定位信息恶复。iOS14 授權(quán)彈窗新增的 Precise的開(kāi)關(guān)默認(rèn)會(huì)選中精確位置怜森。用戶通過(guò)這個(gè)開(kāi)關(guān)可以進(jìn)行更改,當(dāng)把這個(gè)值設(shè)為 On 時(shí)谤牡,地圖上會(huì)顯示精確位置副硅;切換為Off時(shí),將顯示用戶的大致位置翅萤。
?? 對(duì)于對(duì)用戶位置敏感度不高的 App 來(lái)說(shuō)恐疲,這個(gè)似乎無(wú)影響,但是對(duì)于強(qiáng)依賴精確位置的 App 適配工作就顯得非常重要了套么∨嗉海可以通過(guò)用戶在 “隱私設(shè)置” 中設(shè)置來(lái)開(kāi)啟精確定位,但是可能用戶寧可放棄使用這個(gè)應(yīng)用也不愿意開(kāi)啟胚泌。這個(gè)時(shí)候省咨,iOS14 在 CLLocationManager 新增兩個(gè)方法可用于向用戶申請(qǐng)臨時(shí)開(kāi)啟一次精確位置權(quán)限。
image
使用方式也很簡(jiǎn)單玷室,需要首先在 Info.plist 中配置“NSLocationTemporaryUsageDescriptionDictionary”字典中需要配置 key 和 value 表明使用位置的原因茸炒,以及具體的描述。
image
在本例中阵苇,key 即為獲取用戶權(quán)限時(shí)傳的 "purposeKey"壁公,最終呈現(xiàn)給用戶的就是左圖,右圖為當(dāng)App主動(dòng)關(guān)閉精確定位權(quán)限申請(qǐng)绅项。
image
?? 對(duì)于地理位置不敏感的App 來(lái)說(shuō)紊册,iOS14 也可以通過(guò)直接在 info.plist 中添加 NSLocationDefaultAccuracyReduced? 為 true 默認(rèn)請(qǐng)求大概位置。
image
?? 這樣設(shè)置之后快耿,即使用戶想要為該 App 開(kāi)啟精確定位權(quán)限囊陡,也無(wú)法開(kāi)啟。
?? 也可以直接通過(guò)API來(lái)根據(jù)不同的需求設(shè)置不同的定位精確度掀亥。
image
?? 需要注意的是撞反,當(dāng) App 在 Background 模式下,如果并未獲得精確位置授權(quán)搪花,那么 Beacon 及其他位置敏感功能都將受到限制遏片。
?? Local Network
?? iOS14 當(dāng) App 要使用 Bonjour 服務(wù)時(shí)或者訪問(wèn)本地局域網(wǎng),使用 mDNS 服務(wù)等撮竿,都需要授權(quán)吮便,開(kāi)發(fā)者需要在 Info.plist 中詳細(xì)描述使用的為哪種服務(wù)以及用途。下圖為需要無(wú)需申請(qǐng)權(quán)限與需要授權(quán)的服務(wù):
image
?? 在 "隱私設(shè)置" 中也可以查看和修改具體有哪些 App 正在使用 LocalNetwork
image
?? 如果應(yīng)用中需要使用 LocalNetwork 需要在 Info.plist 中配置兩個(gè)選項(xiàng)幢踏,詳細(xì)描述為什么需要使用該權(quán)限髓需,以及需要列出具體使用 LocalNetwork 的服務(wù)列表。
image
?? 對(duì)于使用了下列包含 Bonjour 的 framework房蝉,都需要更新描述.
image
? Wi-Fi Address
?? iOS8 - iOS13 僚匆,用戶在不同的網(wǎng)絡(luò)間切換和接入時(shí)微渠,mac 地址都不會(huì)改變,這也就使得網(wǎng)絡(luò)運(yùn)營(yíng)商還是可以通過(guò) mac 地址對(duì)用戶進(jìn)行匹配和用戶信息收集咧擂,生成完整的用戶信息敛助。iOS14 提供 Wifi 加密服務(wù),每次接入不同的 WiFi 使用的 mac 地址都不同屋确。每過(guò) 24 小時(shí),mac 地址還會(huì)更新一次续扔。需要關(guān)注是否有使用用戶網(wǎng)絡(luò) mac 地址的服務(wù)攻臀。
?? 下圖為 iOS13 及之前用戶接入網(wǎng)絡(luò)時(shí) mac 地址并不會(huì)進(jìn)行改變
image
?? 下圖為 iOS14 用戶接入 Wi-Fi 時(shí) mac 地址的變化情況
image
?? 并且用戶也可以自行選擇是否開(kāi)啟 private Wi-Fi address
image
? 剪切板
?? 在 iOS14 中,讀取用戶剪切板的數(shù)據(jù)會(huì)彈出提示纱昧。
image
?? 彈出提示的原因是使用 UIPasteboard 訪問(wèn)用戶數(shù)據(jù)刨啸,訪問(wèn)以下數(shù)據(jù)都會(huì)彈出 toast 提示。
image
?? 兼容方案:如果應(yīng)用訪問(wèn)剪切板僅僅用于判斷是否為URL格式识脆,則 iOS14 新增了兩個(gè) API 可以用于規(guī)避該提示设联。如果應(yīng)用想直接訪問(wèn)剪切板的數(shù)據(jù),暫時(shí)可能無(wú)法做到規(guī)避該提示灼捂。iOS14 新增兩種
UIPasteboardDetectionPattern离例。
image
?? 上面的兩個(gè) API 可用于規(guī)避提示,但只能用于判斷剪切板中是否有 URL悉稠,并不是真正的訪問(wèn)剪貼板數(shù)據(jù)宫蛆,也拿不到剪切板的真實(shí)數(shù)據(jù)。下面兩個(gè) API 可以獲得具體的 URL 信息的猛,但是會(huì)觸發(fā)剪切板提示耀盗。并且實(shí)測(cè)當(dāng)用戶剪切板中包含多個(gè) URL 時(shí)只會(huì)返回第一個(gè)。
image
?? 使用示例
NSSet*patterns=[[NSSet alloc]initWithObjects:UIPasteboardDetectionPatternProbableWebURL,nil];[[UIPasteboard generalPasteboard]detectPatternsForPatterns:patterns completionHandler:^(NSSet<UIPasteboardDetectionPattern>*_Nullable result,NSError*_Nullable error){if(result&&result.count){// 當(dāng)前剪切板中存在 URL}}];
? 相機(jī)和麥克風(fēng)
?? iOS14 中 App 使用相機(jī)和麥克風(fēng)時(shí)會(huì)有圖標(biāo)提示以及綠點(diǎn)和黃點(diǎn)提示卦尊,并且會(huì)顯示當(dāng)前是哪個(gè) App 在使用此功能叛拷。我們無(wú)法控制是否顯示該提示。
image
?? 會(huì)觸發(fā)錄音小黃點(diǎn)的代碼示例:
AVAudioRecorder*recorder=[[AVAudioRecorder alloc]initWithURL:recorderPath settings:nil error:nil];[recorder record];
?? 觸發(fā)相機(jī)小綠點(diǎn)的代碼示例:
AVCaptureDeviceInput*videoInput=[[AVCaptureDeviceInput alloc]initWithDevice:videoCaptureDevice error:nil];AVCaptureSession*session=[[AVCaptureSession alloc]init];if([session canAddInput:videoInput]){[session addInput:videoInput];}[session startRunning];
? IDFA
?? IDFA 全稱為 Identity for Advertisers 岂却,即廣告標(biāo)識(shí)符忿薇。用來(lái)標(biāo)記用戶,目前最廣泛的用途是用于投放廣告躏哩、個(gè)性化推薦等煌恢。
?? 在 iOS13 及以前,系統(tǒng)會(huì)默認(rèn)為用戶開(kāi)啟允許追蹤設(shè)置震庭,我們可以簡(jiǎn)單的通過(guò)代碼來(lái)獲取到用戶的 IDFA 標(biāo)識(shí)符瑰抵。
if([[ASIdentifierManager sharedManager]isAdvertisingTrackingEnabled]){NSString*idfaString=[[ASIdentifierManager sharedManager]advertisingIdentifier].UUIDString;NSLog(@"%@",idfaString);}
?? 但是在 iOS14 中,這個(gè)判斷用戶是否允許被追蹤的方法已經(jīng)廢棄器联。
image.png
?? iOS14 中二汛,系統(tǒng)會(huì)默認(rèn)為用戶關(guān)閉廣告追蹤權(quán)限婿崭。
image
?? 對(duì)于這種情況,我們需要去請(qǐng)求用戶權(quán)限肴颊。首先需要在 Info.plist 中配置" NSUserTrackingUsageDescription " 及描述文案氓栈,接著使用 AppTrackingTransparency 框架中的 ATTrackingManager 中的 requestTrackingAuthorizationWithCompletionHandler 請(qǐng)求用戶權(quán)限,在用戶授權(quán)后再去訪問(wèn) IDFA 才能夠獲取到正確信息婿着。
#import#import-(void)testIDFA{if(@available(iOS14,*)){[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status){if(status==ATTrackingManagerAuthorizationStatusAuthorized){NSString*idfaString=[[ASIdentifierManager sharedManager]advertisingIdentifier].UUIDString;}}];}else{// 使用原方式訪問(wèn) IDFA}}
? 上傳 AppStore
更加嚴(yán)格的隱私審核授瘦,可以讓用戶在下載 App 之前就知道此 App 將會(huì)需要哪些權(quán)限。目前蘋果商店要求所有應(yīng)用在上架時(shí)都必須提供一份隱私政策竟宋。如果引入了第三方收集用戶信息等SDK提完,都需要向蘋果說(shuō)明是這些信息的用途。
image
總結(jié)
對(duì)于這次 iOS14 的隱私權(quán)限大升級(jí)和新嘗試丘侠,體現(xiàn)了蘋果對(duì)于用戶隱私的尊重徒欣。
從用戶角度來(lái)說(shuō),近年來(lái)越來(lái)越精準(zhǔn)的廣告投放讓我們?cè)絹?lái)越感覺(jué)自己被”監(jiān)視“著蜗字,此次升級(jí)后打肝,我們有了更多保護(hù)自己隱私的方式以及避免廣告騷擾的方法,蘋果此舉無(wú)疑會(huì)加大我們對(duì)其的好感度和信任感挪捕。但從另一個(gè)角度來(lái)說(shuō)粗梭,對(duì)于 IDFA 的限制,可能會(huì)導(dǎo)致之前許多依靠廣告投放收入的免費(fèi) App 難以繼續(xù)維持生計(jì)级零,也可能也會(huì)導(dǎo)致免費(fèi) App 的數(shù)量有所降低楼吃。從開(kāi)發(fā)者的角度來(lái)說(shuō),除了對(duì) iOS14 隱私升級(jí)的積極適配外妄讯,也讓我們感受到了 iOS14 中對(duì)于用戶隱私的重視無(wú)疑會(huì)提高獲取用戶行為信息的成本孩锡。
沖擊最大的應(yīng)該就是廣告行業(yè),對(duì)于目前的推薦算法和用戶拉新都會(huì)受到影響亥贸,如何在充分尊重用戶隱私的前提下進(jìn)行廣告的精準(zhǔn)投放對(duì)于開(kāi)發(fā)者和廣告商來(lái)說(shuō)都是一個(gè)不小的機(jī)遇和挑戰(zhàn)躬窜。