【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

贝壳 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:136894

评论

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

模块八作业

panxiaochun

架构实战营

30个类手写Spring核心原理之自定义ORM(下)(7)

Tom弹架构

Java spring 源码

腾讯云容器安全获得云安全守卫者计划优秀案例

腾讯安全云鼎实验室

容器安全

How old are you | 尚硅谷大数据之Canal视频教程

编程江湖

大数据 canal

基于DataX的数据同步(下)-应用DataX进行数据同步

恒生LIGHT云社区

数据库 数据同步 DataX

基于Gradle的Spring源码下载及构建技巧

Tom弹架构

Java spring 源码

三位一体,网易智企的融合与进击

ToB行业头条

2022 年你必须知道的 Serverless 云产品

开源之巅

Serverless 云开发

Dubbo 框架学习笔记十七

风翱

dubbo 12月日更

社区原生的 Go Agent 即将开源

火线安全

DevSecOps IAST

实现一键部署与高效集群管理,SphereEx-Boot 正式上线

SphereEx

开源 开源社区 SphereEx ShadingSphere 一键安装

使用Docker Configs存储配置信息

yombo

Docker Docker Swarm

架构训练营 - 模块三作业

伊静西蒙

千万级日志回放引擎设计稿

FunTester

性能测试 测试框架 FunTester 流量回放 GOREPLAY

揭秘字节跳动基于Hudi的实时数据湖平台

字节跳动数据平台

大数据 实时数据湖

爆肝30天,肝出来史上最透彻Spring原理和27道高频面试题总结

Tom弹架构

Java spring 源码

用EasyRecovery恢复手残误删的文件

淋雨

EasyRecovery

Apsara Stack 技术百科|标准化的云时代:一云多芯

云计算 芯片 科技 混合云

网易有道项目实践技术分享合集

有道技术团队

技术分享 网易有道 技术专题合集

谈谈Golang的同步等待组

恒生LIGHT云社区

golang Go 语言

一次完整的渗透测试&仅供学习研究

H

黑客 网络安全 渗透测试·

seata分布式事务AT模式介绍(二)

恒生LIGHT云社区

分布式 分布式事务 seata

接口文档自动更改?百度程序员开发效率MAX的秘诀

百度Geek说

百度 前端 工具 后端 软件开发

恒源云(GPUSHARE)_云GPU服务器如何使用SpaCy?

恒源云

gpu 服务器 自然语言

整理了一些JPA常用注解

yombo

Java Spring JPA

域名基本信息查询小技巧

喀拉峻

网络安全 安全 信息安全

一文带你了解数据库安全基础

坚果

数据库 28天写作 12月日更

Kubernetes常见组件

Rayzh

Docker Kubernetes 云原生

年底考勤管理汇总难?织信OA管理系统无缝对接外部应用助你解决

优秀

低代码 考勤管理 OA管理系统

人工智能(NLP)|社交网络中的网络表示学习技术研究

索信达控股

人工智能 算法 网络结构

用300行代码手写1个Spring框架,麻雀虽小五脏俱全

Tom弹架构

Java spring 源码

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