写点什么

贝壳 APP iOS14 权限管理适配总结

  • 2020-10-26
  • 本文字数:4634 字

    阅读完需:约 15 分钟

贝壳APP iOS14权限管理适配总结

WWDC 2020 发布会上苹果向我们展示了新的 iOS14 系统。iOS14 的适配,很重要的一环就集中在用户隐私和安全方面。


本文将详细介绍 iOS14 上对于隐私授权的变更和部分适配方案。

1 相册

1.1 相册读取范围控制

相册是用户最私密的信息之一,可读取 & 不可读取这种简单粗暴的方式已经不能满足日常的使用需求。例如,我的相册里存了一张可爱的卡通图,当我使用某个新的 APP 想要设置头像时,但我只想要 APP 只能读取这一张图,而无法读取其他的图片,当前可不大好解决。于是苹果为相册读取提供了更细致的管控,可以允许 APP 仅读取选中的照片,这样能够很好的控制私密照片不被陌生应用读取,进一步保护隐私。

1.2 iOS14 相册适配点

iOS14 新增了“Limited Photo Library Access”模式,在授权弹窗中增加了 Select Photo 选项。用户可以在 App 请求调用相册时选择部分照片让 App 读取。


iOS14 中当用户选择 PHAuthorizationStatusLimited 时,如果未进行适配,有可能会在每次触发相册功能时都进行弹窗询问用户是否需要修改照片权限。对于这种情况可通过在 Info.plist 中设置“PHPhotoLibraryPreventAutomaticLimitedAccessAlert” 的值为 YES 来阻止该弹窗反复弹出,并且可通过下面这个 API 来主动控制何时弹出 PHPickerViewController 进行照片选择。


[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];
复制代码

1.3 PHPicker

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


(1)UIImagePickerController 转移到 PHPickerViewController, UIImagePickerViewController 功能受限,每次只能选择一张图片,将逐渐被废弃。



(2)功能:PHPicker 支持多选,支持搜索,支持按 image, video, livePhotos 等进行选择。



(3)PHPicker API 指导



(4)PHPicker 用法示例


 - (IBAction)button:(id)sender {      PHPickerConfiguration *configuration = [[PHPickerConfiguration alloc] init];      configuration.filter = [PHPickerFilter videosFilter]; // 可配置查询用户相册中文件的类型,支持三种    configuration.selectionLimit = 0; // 默认为1,为0时表示可多选。      PHPickerViewController *pickerVc = [[PHPickerViewController alloc] initWithConfiguration:configuration];      pickerVc.delegate = self;      // pickerVc,在选完图片后需要在回调中手动 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<NSItemProviderReading> _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。

2 相机和麦克风

2.1 相机和麦克风调用监控

当应用使用摄像头和麦克风的时,一个小点会出现在状态栏中 WIFI 和蜂窝信号条上方。当应用使用摄像头时,这个点是绿色的,当使用麦克风时,这个点是橙色的.



如果用户使用摄像头或麦克风关闭应用,打开控制中心,会看到一个摄像头或麦克风图标,以及最近哪个应用在使用这项功能。录像指示灯可以防止后台的应用在用户不知情的情况下访问摄像头或麦克风,确保应用没有偷偷录下用户的对话或视频。


2.2 触发相机和麦克风监控的代码实现

// 会触发录音小黄点的代码示例:
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];
复制代码

3 定位

3.1 模糊定位

目前的终端系统可以控制是否授予 APP 获取定位权限,而在新版的 iOS 14/iPadOS 14 中,位置信息进行了更细致的管控。在设置中关闭 APP 的「精确位置」,可以只允许 APP 仅仅获取用户大致的地理位置。



iOS14 授权弹窗新增的 Precise 的开关默认会选中精确位置。用户通过这个开关可以进行更改,当把这个值设为 On 时,地图上会显示精确位置;切换为 Off 时,将显示用户的大致位置。


3.2 获取精确定位

对于对用户位置敏感度不高的 App 来说,这个似乎无影响,但是对于强依赖精确位置的 App 适配工作就显得非常重要了。可以通过用户在 “隐私设置” 中设置来开启精确定位,但是可能用户宁可放弃使用这个应用也不愿意开启。iOS14 在 CLLocationManager 新增两个方法可用于向用户申请临时开启一次精确位置权限。



使用方法需要首先在 Info.plist 中配置“NSLocationTemporaryUsageDescriptionDictionary”字典中需要配置 key 和 value 表明使用位置的原因,以及具体的描述。


3.3 新增权限 API

废弃旧的权限状态回调函数,在 CLLocationManagerDelegate 新增回调方法, 新方法在精度和频率权限发生变化时,都会回调。



废弃旧的权限状态类方法,新增实例属性去获取当前的权限状态:


4 Local Network

4.1 什么是 Local Network

苹果所谓的“本地网络”其实就是我们常说的局域网,不同的电脑、iPhone、iPad、Apple Watch 等电子产品通过同一个网络连接在一起时,就组成了一个本地网络。“本地网络”虽然带有“网络”两个字,但是关闭并不等于禁用互联网,因此很多应用都不会受到影响。

4.2 Local Network iOS14 前后对比

在 iOS14 发布之前,应用可以通过本地网络扫描到其他设备,以此来获取你的定位、设备使用情况等个人信息,可以说这是很多应用厂商获取用户数据的一个重要渠道。而 iOS 14 上的“本地网络”权限,就等于在局域网上加了一把锁,当我们关闭该权限时,应用就无法偷偷扫描用户所在局域网的其他电子设备了。不过,也有一些应用需要借助本地网络才能够实现相应的功能,如 iPhone 连接电视投屏、智能家居、监控摄像头,网络打印机等,因此当这些应用申请权限时,我们可以选择使用时开启“本地网络”权限,以免影响日常生活体验。

4.3 Local Network iOS14 新特性

iOS14 当 App 要使用 Bonjour 服务时或者访问本地局域网,使用 mDNS 服务等,都需要授权,开发者需要在 Info.plist 中详细描述使用的为哪种服务以及用途。下图为需要无需申请权限与需要授权的服务:



如果应用中需要使用 LocalNetwork 需要在 Info.plist 中配置两个选项,详细描述为什么需要使用该权限,以及需要列出具体使用 LocalNetwork 的服务列表。


5 Wi-Fi Address

iOS8 - iOS13 ,用户在不同的网络间切换和接入时,mac 地址都不会改变,这也就使得网络运营商还是可以通过 mac 地址对用户进行匹配和用户信息收集,生成完整的用户信息。iOS14 提供 Wifi 加密服务,每次接入不同的 WiFi 使用的 mac 地址都不同。



并且可以手动设置私有 Wi-Fi 地址,且连接的每个 Wi-Fi 网络都有不同的地址、不和设备绑定、每天生成不同的地址。


6 IDFA

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


if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
NSLog(@"%@", idfaString);
}
复制代码


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



并且广告追踪权限已经默认关闭,这就意味着 App 将无法在用户不知情的情况下获取到 IDFA,而需要进行申请。同其他常见权限类似,需要在 Info.plist 中配置" NSUserTrackingUsageDescription " 及描述文案,接着使用 AppTrackingTransparency 框架中的 ATTrackingManager 中的 requestTrackingAuthorizationWithCompletionHandler 请求用户权限,在用户授权后再去访问 IDFA 才能够获取到正确信息。


#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
- (void)testIDFA {
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
}
}];
} else {
// iOS 13 现有方法
}
}
复制代码

7 剪贴板

在 iOS14 中,当应用访问剪贴板时,苹果会用一个小横幅通知用户剪贴板被复制了。这是为了防止应用滥用它们对于剪贴板的访问权限。



弹出提示的原因是使用 UIPasteboard 访问用户数据,访问以下数据都会弹出 toast 提示。



应用访问剪切板仅仅用于判断是否为 URL 格式,iOS14 新增了两个 API 可以用于规避该提示。如果应用想直接访问剪切板的数据,暂时可能无法做到规避该提示。iOS14 新增两种 UIPasteboardDetectionPattern 如下图:



上图的两个 API 可用于规避提示,但只能用于判断剪切板中是否有 URL,并不是真正的访问剪贴板数据,也拿不到剪切板的真实数据。下面两个 API 可以获得具体的 URL 信息,但是会触发剪切板提示。并且实测当用户剪切板中包含多个 URL 时只会返回第一个。


8 总结

这次 iOS14 的隐私权限大升级和新尝试,体现了苹果对于用户隐私的尊重。


  • 数据最小化:苹果自己或者其他人获得的私人数据最小化

  • 设备端智能技术:尽可能本地处理用户信息

  • 安全保护:技术手段对数据安全的保护

  • 透明度和管控:帮助用户理解被收集的数据,让用户自己选择该如何使用该数据。


这四条核心隐私原则,是苹果一直在强调的,而且也看到真正付诸了实践。


参考文献:



本文转载自公众号贝壳产品技术(ID:beikeTC)。


原文链接


贝壳APP iOS14权限管理适配总结


2020-10-26 10:137183

评论

发布
暂无评论
发现更多内容

FinClip | 2022 年 9月产品更新放送

FinClip

转转推荐场景EE题解决思路

转转技术团队

深度学习 推荐系统

活跃开发者数量仅次于以太坊,波卡凭什么?

One Block Community

区块链 开发者 波卡生态

上手JavaScript基准测试

小鑫同学

前端 Node 10月月更

Vue组件入门(四)组件注册

Augus

Vue 3 10月月更

【kafka问题】记一次kafka消费者未接收到消息问题

石臻臻的杂货铺

Kafk 10月月更

Flash软件应用项目(二)

张立梵

设计师 Flash 10月月更

技术分享必备de终端录制神器

小鑫同学

前端 Node 10月月更

37手游基于云平台的大数据建设实践

Apache Flink

大数据 flink 实时计算

煤矿上的女孩

脑极体

容器云PaaS平台建设中应关注的重点和难点

穿过生命散发芬芳

10月月更 容器云PaaS

开发中遇到跨域我选择这么做

小鑫同学

前端 Node 10月月更

使用PlopJs让开发变得更高效

小鑫同学

前端 Node 10月月更

Rust编程语言中的定义类型

小鑫同学

前端 Node 10月月更

数据导出Excel实战

卢卡多多

Excel 数据导出 10月月更

零信任时代企业如何提升访问权限的安全?

FinClip

从一个工程师成长看自动化运维的过程

阿泽🧸

自动化运维 10月月更

Web3.0杂谈-#005(52/100)

hackstoic

元宇宙 Web3.0

Python进阶(十八)Python3爬虫小试牛刀之爬取CSDN博客个人信息

No Silver Bullet

Python 数据分析 10月月更

【玩转云函数】打通Github到企微的消息通知

小鑫同学

前端 Node 10月月更

开箱体验Rust,Come on!!!

小鑫同学

前端 Node 10月月更

Python进阶(十六)正则表达式

No Silver Bullet

Python 正则表达式 10月月更

电商秒杀系统设计

张立奎

10分钟了解sql注入--报错注入(二)

贤鱼很忙

sql 网络安全 10月月更

【分享】前端线上紧急排查工具

小鑫同学

前端 Node 10月月更

混合云中合规管理的思考

HummerCloud

云安全 混合云 安全合规检测 10月月更

【一Go到底】第十三天---循环控制

指剑

Go golang 10月月更

免杀实战之面向PHP的WebShell免杀

网络安全学海

网络安全 安全 信息安全 渗透测试 WEB安全

Spring Boot「05」Annotations 02

Samson

Java Spring Boot 学习笔记 技术笔记 10月月更

15分钟了解sql注入(一) union注入

贤鱼很忙

网络安全 Web SQL注入 10月月更

35分钟了解sql注入-盲注(三)

贤鱼很忙

sql 网络安全 10月月更

贝壳APP iOS14权限管理适配总结_安全_李星谣_InfoQ精选文章