IOS 14适配
1. IDFA隐私加强
IDFA默认关闭,需要向用户申请获取权限,需要在info.plist中明示用户申请权限:
key : NSUserTrackingUsageDescription
value: “获取设备信息用以精准推送您喜欢的内容”(用于显示给用户的话术)
申请代码:
// 调用request会弹窗提示用户是否授权,点拒绝则无法读取
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
// 已授权
NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
} else {
// 此时用户点击拒绝则无法读取
NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
}
}];
注意:
需要用户在手机中打开追踪开关,该开关默认关闭(正式版延期至2021年,目前依然可读取)。
如果用户不打开该开关则无法获取idfa,也无法申请权限。细则见文章结尾。
另外需要引入系统库FrameWork: AppTrackingTransparency
2. 定位获取变更
IOS 14可以授权模糊定位(Precise Location),默认给出精准定位。APP可以申请单次的精准定位。
申请的单次精准定位本次APP生命周期内有效,APP一个生命周期内可以多次申请。任何一次允许后则可正常获取精准定位。
申请方式:需要在info.plist中配置:
NSLocationTemporaryUsageDescriptionDictionary
key:precise。用于request的PurposeKey值,自定义即可
value:申请定位用于给您做精准推荐。(用于显示给用户的话术)
[self.locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"precise" completion:^(NSError *error) {
// 根据状态判断是否获取到了定位权限
if (self.locationManager.accuracyAuthorization == CLAccuracyAuthorizationReducedAccuracy) {
}
}];
也可以不获取精准定位直接请求模糊定位:NSLocationDefaultAccuracyReduced 值为true
注意:申请单次精准定位的前提是用户选择了给模糊定位。如果用户拒绝给定位或者已经给出精准定位,则无法申请单次精准定位。
3. 新特性Clips
类似于小程序,通过浏览器、短信消息、Maps、NFC、二维码等形式启动。待更新
4. UITableViewCell
IOS 14要求使用[cell.contentView addSubview],不推荐使用[cell addSubview]了,有人说会遮挡视图,目前没复现,点击也还正常,但是保不齐以后不让用,还是建议用contentView add吧。
5. KVC 不允许访问 UIPageControl的pageImage
新增了API:preferredIndicatorImage设置image
6. 相册新增选择部分照片权限类型
PHAuthorizationStatusLimited,会在弹窗相册权限时增加一个“选择照片”选项,点击可以勾选部分照片供该APP使用。
如果用户选择了部分照片,那么重启APP后再用到相册权限依然会弹窗提醒选择更多照片。
可以在Info.plist中设置“PHPhotoLibraryPreventAutomaticLimitedAccessAlert”为YES,来阻止弹窗反复弹出。
也可以在代码中配置在合适的位置弹窗:
[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];
7. 相机和麦克风
iOS14 中 App 在使用相机和麦克风时右上角会有绿点(相机)和黄点(麦克风)提示,无法隐藏。
8. 读取剪切板会弹提示
读取剪切板内容时,会有toast提示,从顶部弹出,例如:手机淘宝 - 粘贴自:QQ
备注
IDFA获取逻辑:
首先分总开关和小开关,总开关为设置里面的隐私开关,关闭后无论APP怎么处理都无法获取idfa,只有在APP设置中开关开启的状态下才能进行其它操作。下面介绍一下总开关开启的情况下:
IOS 14以下:
即便IDFA的状态为ATTrackingManagerAuthorizationStatusAuthorized,依然可以强制读取IDFA。
IOS 14以后:
如果APP不进行request idfa操作,那么默认开关是开启的,此时我们获取idfa状态,是未授权(ATTrackingManagerAuthorizationStatusAuthorized),但是可以不进行if判断强制读取。
如果APP进行了request idfa操作,那么会弹窗提醒用户,此时用户如果点了拒绝,那么idfa无法读取,强制读取亦失效。但是在APP弹窗之前是可以读取idfa的,所以如果APP是在使用期间进行request,那么request之前其实是可以拿到idfa并存储下来。
综合来说,目前的情形是不建议做弹窗授权,弹窗了反而会有无法读取的可能。