iOS14 隐私适配及部分解决方案

✎  iOS14 新增了“Limited Photo Library Access” 模式,在授权弹窗中增加了 Select Photo 选项。用户可以在 App 请求调用相册时选择部分照片让 App 读取。从 App 的视⻆来看,你的相册里就只有这几张照片,App 无法得知其它照片的存在。

✎  iOS14 中当用户选择

“PHAuthorizationStatusLimited” 时,如果未进行适配,有可能会在每次触发相册功能时都进行弹窗询问用户是否需要修改照片权限。

✎  对于这种情况可通过在 Info.plist 中设置

“PHPhotoLibraryPreventAutomaticLimitedAccessAlert”的值为 YES 来阻止该弹窗反复弹出,并且可通过下面这个 API 来主动控制何时弹出PHPickerViewController 进行照片选择。

[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];

✎  在 iOS14 中官方推荐使用  PHPicker 来替代原 API 进行图片选择。PHPicker 为独立进程,会在视图最顶层进行展示,应用内无法对其进行截图也无法直接访问到其内的数据。

  • UIImagePickerController  -> PHPickerViewController, UIImagePickerViewController 功能受限,每次只能选择一张图片,将逐渐被废弃。

  • PHPicker 支持多选,支持搜索,支持按 image,video,livePhotos 等进行选择。

✎  新API及迁移demo:

@interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView;@property (nonatomic, strong) NSArray<NSItemProvider *> *itemProviders; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.} - (IBAction)button:(id)sender { // 以下 API 仅为 iOS14 only PHPickerConfiguration *configuration = [[PHPickerConfiguration alloc] init]; configuration.filter = [PHPickerFilter videosFilter]; // 可配置查询用户相册中文件的类型,支持三种 configuration.selectionLimit = 0; // 默认为1,为0时表示可多选。 PHPickerViewController *picker = [[PHPickerViewController alloc] initWithConfiguration:configuration]; picker.delegate = self; // picker vc,在选完图片后需要在回调中手动 dismiss [self presentViewController:picker animated:YES completion:^{ }]; } #pragma mark - 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]) { __weak typeof(self) weakSelf = self; [itemProvider loadObjectOfClass:UIImage.class completionHandler:^(__kindof id _Nullable object, NSError * _Nullable error) { if ([object isKindOfClass:UIImage.class]) { __strong typeof(self) strongSelf = weakSelf; dispatch_async(dispatch_get_main_queue(), ^{ strongSelf.imageView.image = (UIImage *)object; }); } }]; } }

✎  需要注意的是,在 limit Photo 模式下,AssetsLibrary 访问相册会失败;在 writeOnly 模式下,AssetLibrary 也会有显示问题。建议还在使用 AssetsLibrary 的同学尽快迁移到新 API。
✎  授权相关:旧 API 废弃,增加 PHAccessLevel 参数。如果再使用以前的API来获取权限状态,
PHAuthorizationStatusLimited 状态下也会返回
PHAuthorizationStatusAuthorized

typedef NS_ENUM(NSInteger, PHAccessLevel) { PHAccessLevelAddOnly = 1, // 仅允许添加照片 PHAccessLevelReadWrite = 2, // 允许访问照片,limitedLevel 必须为 readWrite} API_AVAILABLE(macos(10.16), ios(14), tvos(14));

// 查询权限PHAccessLevel level = PHAccessLevelReadWrite;PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatusForAccessLevel:level]; switch (status) { case PHAuthorizationStatusLimited: NSLog(@“limited”); break; case PHAuthorizationStatusDenied: NSLog(@“denied”); break; case PHAuthorizationStatusAuthorized: NSLog(@“authorized”); break; default: break;}

// 请求权限,需注意 limited 权限尽在 accessLevel 为 readAndWrite 时生效[PHPhotoLibrary requestAuthorizationForAccessLevel:level handler:^(PHAuthorizationStatus status) { switch (status) { case PHAuthorizationStatusLimited: NSLog(@“limited”); break; case PHAuthorizationStatusDenied: NSLog(@“denied”); break; case PHAuthorizationStatusAuthorized: NSLog(@“authorized”); break; default: break; }}];

 定位
✎  在 iOS13 及以前,App 请求用户定位授权时为如下形态:一旦用户同意应用获取定位信息,当前应用就可以获取到用户的精确定位。
✎  iOS14 新增用户大致位置选项可供用户选择,原因是大多数 App 实际上并不需要获取用户到用户最准确的定位信息。iOS14 授权弹窗新增的 Precise的开关默认会选中精确位置。用户通过这个开关可以进行更改,当把这个值设为 On 时,地图上会显示精确位置;切换为Off时,将显示用户的大致位置。
✎  对于对用户位置敏感度不高的 App 来说,这个似乎无影响,但是对于强依赖精确位置的 App 适配工作就显得非常重要了。可以通过用户在 “隐私设置” 中设置来开启精确定位,但是可能用户宁可放弃使用这个应用也不愿意开启。这个时候,iOS14 在 CLLocationManager 新增两个方法可用于向用户申请临时开启一次精确位置权限。
使用方式也很简单,需要首先在 Info.plist 中配置“NSLocationTemporaryUsageDescriptionDictionary”字典中需要配置 key 和 value 表明使用位置的原因,以及具体的描述。
在本例中,key 即为获取用户权限时传的 “purposeKey”,最终呈现给用户的就是左图,右图为当App主动关闭精确定位权限申请。
✎  对于地理位置不敏感的App 来说,iOS14 也可以通过直接在 info.plist 中添加 NSLocationDefaultAccuracyReduced  为 true 默认请求大概位置。
✎  这样设置之后,即使用户想要为该 App 开启精确定位权限,也无法开启。
✎  也可以直接通过API来根据不同的需求设置不同的定位精确度。
✎  需要注意的是,当 App 在 Background 模式下,如果并未获得精确位置授权,那么 Beacon 及其他位置敏感功能都将受到限制。
▐  Local Network
✎  iOS14 当 App 要使用 Bonjour 服务时或者访问本地局域网,使用 mDNS 服务等,都需要授权,开发者需要在 Info.plist 中详细描述使用的为哪种服务以及用途。下图为需要无需申请权限与需要授权的服务:
✎  在 “隐私设置” 中也可以查看和修改具体有哪些 App 正在使用 LocalNetwork
✎  如果应用中需要使用 LocalNetwork 需要在 Info.plist 中配置两个选项,详细描述为什么需要使用该权限,以及需要列出具体使用 LocalNetwork 的服务列表。
✎  对于使用了下列包含 Bonjour 的 framework,都需要更新描述.
 Wi-Fi Address
✎  iOS8 - iOS13 ,用户在不同的网络间切换和接入时,mac 地址都不会改变,这也就使得网络运营商还是可以通过 mac 地址对用户进行匹配和用户信息收集,生成完整的用户信息。iOS14 提供 Wifi 加密服务,每次接入不同的 WiFi 使用的 mac 地址都不同。每过 24 小时,mac 地址还会更新一次。需要关注是否有使用用户网络 mac 地址的服务。
✎  下图为 iOS13 及之前用户接入网络时 mac 地址并不会进行改变
✎  下图为 iOS14 用户接入 Wi-Fi 时 mac 地址的变化情况
✎  并且用户也可以自行选择是否开启 private Wi-Fi address
 剪切板
✎  在 iOS14 中,读取用户剪切板的数据会弹出提示。
✎  弹出提示的原因是使用 UIPasteboard 访问用户数据,访问以下数据都会弹出 toast 提示。
✎  兼容方案:如果应用访问剪切板仅仅用于判断是否为URL格式,则 iOS14 新增了两个 API 可以用于规避该提示。如果应用想直接访问剪切板的数据,暂时可能无法做到规避该提示。iOS14 新增两种
UIPasteboardDetectionPattern。
✎  上面的两个 API 可用于规避提示,但只能用于判断剪切板中是否有 URL,并不是真正的访问剪贴板数据,也拿不到剪切板的真实数据。下面两个 API 可以获得具体的 URL 信息,但是会触发剪切板提示。并且实测当用户剪切板中包含多个 URL 时只会返回第一个。
✎  使用示例

NSSet *patterns = [[NSSet alloc] initWithObjects:UIPasteboardDetectionPatternProbableWebURL, nil];[[UIPasteboard generalPasteboard] detectPatternsForPatterns:patterns completionHandler:^(NSSet * _Nullable result, NSError * _Nullable error) { if (result && result.count) { // 当前剪切板中存在 URL }}];

 相机和麦克风
✎  iOS14 中 App 使用相机和麦克风时会有图标提示以及绿点和黄点提示,并且会显示当前是哪个 App 在使用此功能。我们无法控制是否显示该提示。
✎  会触发录音小黄点的代码示例:

AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:recorderPath settings:nil error:nil];[recorder record];

✎  触发相机小绿点的代码示例:

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 ,即广告标识符。用来标记用户,目前最广泛的用途是用于投放广告、个性化推荐等。
✎  在 iOS13 及以前,系统会默认为用户开启允许追踪设置,我们可以简单的通过代码来获取到用户的 IDFA 标识符。

if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) { NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString; NSLog(@“%@”, idfaString);}

✎  但是在 iOS14 中,这个判断用户是否允许被追踪的方法已经废弃。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-ScI1FFCT-1715326910388)]

[外链图片转存中…(img-fZAQykKW-1715326910388)]

[外链图片转存中…(img-6R7kZcnz-1715326910388)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值