iOS14适配

最近公司项目做了iOS14适配工作,抽时间整理了一版和大家分享一下,有问题请大家及时指正。
iOS14适配主要偏向于隐私安全方面,与之前相比,对用户隐私权限做了更细化要求,给予用户更多的选择。

1、相册

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 等进行选择.

注:在 limit Photo 模式下,AssetsLibrary 访问相册会失败;在 writeOnly 模式下,AssetLibrary 也会有显示问题。建议还在使用AssetsLibrary的同学尽快迁移到新 API

2、定位

iOS14中,定位权限新增“NSLocationTemporaryUsageDescriptionDictionary”选项可供用户选择,大多数 App实际上并不需要获取用户到用户最准确的定位信息. iOS14授权弹窗新增的Precise的开关默认会选中精确位置,用户通过这个开关可以进行更改,当把这个值设为 On 时,地图上会显示精确位置;切换为Off时,将显示用户的大致位置。

适配场景:对于对用户位置敏感度不高的App来说,这个似乎无影响,但是对于强依赖精确位置的App适配工作就显得非常重要了。

适配方式:可以通过用户在 “隐私设置” 中设置来开启精确定位,但是可能用户宁可放弃使用这个应用也不愿意开启。这个时候,iOS14在CLLocationManager新增两个方法可用于向用户申请临时开启一次精确位置权限。

- (void)requestTemporaryFullAccuracyAuthorizationWithPurposeKey:(NSString *)purposeKey completion:(void(^ _Nullable)(NSError * _Nullable))completion API_AVAILABLE(ios(14.0), macos(11.0), watchos(7.0), tvos(14.0));

- (void)requestTemporaryFullAccuracyAuthorizationWithPurposeKey:(NSString *)purposeKey API_AVAILABLE(ios(14.0), macos(11.0), watchos(7.0), tvos(14.0));

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

对于地理位置不敏感的App 来说,iOS14 也可以通过直接在 info.plist 中添加 NSLocationDefaultAccuracyReduced 为 true 默认请求大概位置,这样设置之后,即使用户想要为该 App 开启精确定位权限,也无法开启,也可以直接通过API来根据不同的需求设置不同的定位精确度.

注:当 App 在 Background 模式下,如果并未获得精确位置授权,那么 Beacon 及其他位置敏感功能都将受到限制.

3、Local Network

iOS14中,当App要使用Bonjou服务或者访问本地局域网、使用mDNS 服务等,都需要进行授权,开发者需要在 Info.plist中详细描述使用的服务种类以及用途。
在 "隐私设置" 中也可以查看和修改具体有哪些 App 正在使用 LocalNetwork。

适配场景:如果应用中需要使 LocalNetwork,需要进行适配。

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

• NSLocalNetworkUsageDescriiption - explains reason

• NSBonjourServices lists Bonjour service types

4、Wi-Fi Address

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

iOS14 提供Wifi加密服务,每次接入不同的WiFi使用的mac地址都不同。每过24小时,mac 地址还会更新一次。需要关注是否有使用用户网络mac地址的服务。

5、剪切板

在 iOS14 中,读取用户剪切板的数据会弹出粘贴的数据来源.

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

iOS14 新增两个API:

- (void)detectPatternsForPatterns:(NSSet<UIPasteboardDetectionPattern> *)patterns completionHandler:^(NSSet<UIPasteboardDetectionPattern> * _Nullable result, NSError * _Nullable error)completionHandler NS_REFINED_FOR_SWIFT API_AVAILABLE(ios(14.0));

- (void)detectPatternsForPatterns:(NSSet<UIPasteboardDetectionPattern> *)patterns

                        inItemsSet:(NSIndexSet * _Nullable)itemsSet

                  completionHandler:^(NSSet<UIPasteboardDetectionPattern> * _Nullable result, NSError * _Nullable error)completionHandler NS_REFINED_FOR_SWIFT API_AVAILABLE(ios(14.0));

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

- (void)detectValuesForPatterns:(NSSet<UIPasteboardDetectionPattern> *)patterns completionHandler:^(NSSet<UIPasteboardDetectionPattern> * _Nullable result, NSError * _Nullable error)completionHandler NS_REFINED_FOR_SWIFT API_AVAILABLE(ios(14.0));

- (void)detectValuesForPatterns:(NSSet<UIPasteboardDetectionPattern> *)patterns

                    inItemsSet:(NSIndexSet * _Nullable)itemsSet

              completionHandler:^(NSSet<UIPasteboardDetectionPattern> * _Nullable result, NSError * _Nullable error)completionHandler NS_REFINED_FOR_SWIFT API_AVAILABLE(ios(14.0));

6、相机和麦克风

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];

7、IDFA

在 iOS13 及以前,系统会默认为用户开启允许追踪设置,我们可以简单的通过代码来获取到用户的 IDFA 标识符,但是在 iOS14 中,这个判断用户是否允许被追踪的方法已经废弃.

使用场景:iOS14 中,系统会默认为用户关闭广告追踪权限,若要使用,我们需要去请求用户权限.

使用方法:首先需要在 Info.plist 中配置"NSUserTrackingUsageDescription"及描述文案,接着使用ATTrackingManager(AppTrackingTransparency框架)中的 requestTrackingAuthorizationWithCompletionHandler请求用户权限,在用户授权后再去访问 IDFA才能够获取到正确信息.

8、上传 AppStore

iOS14对隐私审核进行了更加严格的要求,让用户在下载 App之前就了解App将会需要哪些权限。目前苹果商店要求所有应用在上架时都必须提供一份隐私政策。如果引入了第三方收集用户信息等SDK,都需要向苹果说明是这些信息的用途。

9、其他功能适配

• 列表行中的部分UIButton或UITextView点击无反应(UITableView)
解决方案:[self addSubview:button]更改为[self.contentView addSubview:button];

• 使用SDWebImage加载图片,部分图片无法显示

解决方案:更新到新版本5.9.1即可,若不是SDWebImage,在UIImageView的- (void)displayLayer:(CALayer*)layer方法中增加如下代码:
if([UIImageView instancesRespondToSelector:@selector(displayLayer:)]) {
  [super displayLayer:layer];
}

• 从次级页面pop返回到顶层页面tabbar(下方工具栏)被隐藏

解决方案:在UINavigationController的push方法中添加如下代码
- (NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated {

    if (self.viewControllers.count > 1) {
        self.topViewController.hidesBottomBarWhenPushed = NO;
    }
    return [super popToRootViewControllerAnimated:animated];
}

• 使用UILabel给UITextView添加占位文本,设置UILabel背景色为白色,结果出现一条黑线

解决办法:不设置UILabel的backgroundColor即可。

• UIPageControl的设置小圆点图片的kvc方法被禁用了,程序内有的话,必须删除

解决方案:在工程内搜索"_pageImage"和@"_currentPageImage"关键字,找到对应代码并删除。
[pageControl setValue:[UIImage imageNamed:@"image1"] forKeyPath:@"_pageImage"];
[pageControl setValue:[UIImage imageNamed:@"image2"] forKeyPath:@"_currentPageImage"];

• 苹果提醒称,2020年4月起App Store将不再接受使用UIWebView的新App,2020年12月起将不再接受使用UIWebView的App更新。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • iOS14 的适配,很重要的一环就集中在和方面。 在 iOS13 及以前,当用户首次访问应用程序时,会被要求开放大...
    vicentwyh阅读 2,775评论 0 5
  • 1. 隐私适配 iOS14最重要的更新之一:用户隐私和安全。 (1) 广告标识符IDFA 广告标识符IDFA全称I...
    hazydream阅读 4,657评论 0 13
  • UIDatePicker 在 iOS 14 开始,UIDatePicker 默认样式为: 而在 iOS14 之前的...
    王家小雷阅读 967评论 0 4
  • 1.UITableViewCell 的 contentView 会置于自定义控件的上层。 在 iOS14 beta...
    哈啰于先生阅读 5,606评论 0 9
  • iOS14适配一查找那些SDK使用剪切板 背景,iOS14公测版发出之后,我们app出现了从后台唤起会弹出 读取剪...
    mokong阅读 3,982评论 4 11