下面是对iOS 13系统适配的整理,来源为工程开发中和网络。会定期更新
参考:
https://www.jianshu.com/p/d2a0fa7bcbef
https://www.jianshu.com/p/a0cc0f4e99c7
1、iOS 13需要增加蓝牙权限描述
NSBluetoothAlwaysUsageDescription
V8.0.1提交AppStore审核,要求必须要添加该权限。
2、UITabBar问题
(1)顶部分割线隐藏不生效
解决:1、可以遍历找到UIToolbar上的UIImageView对象设置hidden 2、下面参考代码修改 standardAppearance
(2)UITabBar 消失过(hidesBottomBarWhenPushed),再显示出来,下面的文字变成了默认蓝色
解决:iOS 13 UITabBar 增加一个新的属性 standardAppearance 需要配置
UITabBarAppearance *appearance = UITabBarAppearance.new;
NSMutableParagraphStyle *par = [[NSMutableParagraphStyle alloc] init];
par.alignment = NSTextAlignmentCenter;
UITabBarItemStateAppearance *normal = appearance.stackedLayoutAppearance.normal;
if (normal) {
normal.titleTextAttributes = @{NSForegroundColorAttributeName:JL_BLACK_COLOR, NSParagraphStyleAttributeName : par};
}
UITabBarItemStateAppearance *selected = appearance.stackedLayoutAppearance.selected;
if (selected) {
selected.titleTextAttributes = @{NSForegroundColorAttributeName:JL_GREEN_COLOR, NSParagraphStyleAttributeName : par};
}
// 顶部分割线
[appearance setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor] size:CGSizeMake(SCREEN_WIDTH, self.tabBar.frame.size.height)]];
[appearance setShadowImage:[UIImage imageWithColor:UIColorFromRGB(0xf5f5f5, 1) size:CGSizeMake(SCREEN_WIDTH, 1)]];
self.tabBar.standardAppearance = appearance;
} else {
UITabBar *appearance = [UITabBar appearance];
#ifdef __IPHONE_10_0
[appearance setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor] size:CGSizeMake(SCREEN_WIDTH, self.tabBar.frame.size.height)]];
[appearance setShadowImage:[UIImage imageWithColor:UIColorFromRGB(0xf5f5f5, 1) size:CGSizeMake(SCREEN_WIDTH, 1)]];
#else
[appearance setBackgroundImage:[UIImage imageNamed:@"tab_bg"]];
[appearance setShadowImage:[UIImage new]];
#endif
}
3、UIWebView废弃
目前我们工程应该是在iOS 9以上全都使用WKWebView,只有在9以下的机器使用UIWebView
4、launchImage废弃
从2020年4月开始,所有使⽤ iOS13 SDK 的 App 将必须提供 LaunchScreen。
工程中使用的是LaunchScreen
5、iOS 13 DeviceToken变化
如果是通过deviceToken Data获取字符串需要修改。直接把Data数据传到第三方平台的没有问题。需要对应去看第三方平台的处理,
如果需要更新SDK那就更新第三方SDK。
6、控制器模态跳转样式变更
系统新增一种跳转方式UIModalPresentationAutomatic,而且为默认,测试为Sheet风格的样式。
修改的话需要把跳转的转场动画设置为UIModalPresentationFullScreen,否则dismiss时不会调用presentViewController的 生命周期viewWillAppear
7、UISegmentedControl控件样式改变和tintColor失效
iOS 13新增selectedSegmentTintColor作为选中segment样式
8、Sign in with apple
Sign In with Apple will be available for beta testing this summer. It will be required as an option for users in apps that support third-party sign-in when it is commercially available later this year.
暂时没有第三方登录,可以不添加
9、UITextField私有属性_placeholderLabel禁止访问
继续使用KVC修改_placeholderLabel的属性会crash
解决可以用UITextField添加新的属性attributedPlaceholder,用来设置占位文字
注意:通过KVC方式修改私有属性会有crash的风险,需要检查代码。
10、暗黑模式(dark mode)
苹果建议适配暗黑模式
教练一点通适配点
UI 适配
1、UITabBar 消失过(hidesBottomBarWhenPushed),再显示出来,下面的文字变成了默认蓝色
2、底部导航 UITabBar 顶部的线条颜色修改
3、控制器模态跳转默认方式修改为 满屏
升级的SDK
1、个推SDK 升级
2、TZImagePickerController
================================================================================================================================================================================================
参考资料链接:
1. https://mp.weixin.qq.com/s/j01Ew12ksyd9IDbbsW29Zg
2. https://www.jianshu.com/p/b230194b1b0f
3. https://juejin.im/post/6850418120923250701
以下项目中测试出来的问题:
1、YYImage中的 YYAnimatedImageView 设置单张图片显示不出来的问题
原因:目前看到多数反馈,由于UIimageView 重写 - (void)displayLayer:(CALayer *)layer 方法导致渲染不出来。
2、WKWebview 中的 WKcontentView 会出现僵尸对象的Crash。
原因: 有多数开发者已在苹果开发者反馈,初步判定是系统内部原因。
3、项目中用到 TZImagePickerController 相册选择的三方SDK 需要升级适配相册不然又得图片显示不出来,但是升级后裁剪图片还是会crash。还需要跟踪。
原因:iOS14变更相册读取权限,新增仅授权部分图像给app,TZImagePickerController未对新api适配.
解决:更新引用版本到3.4.2以上, 已对新api适配. 裁剪图片功能正常.
4、UITableViewCell 的 contentView 会置于自定义控件的上层。
在 iOS14 bate 中,UITableViewCell 中如果有直接添加在 cell 上的控件,也就是使用 [self addSubview:] 方式添加的控件,会显示在 contentView 的下层。
contentView 会阻挡事件交互,使所有事件都响应 tableView:didSelectRowAtIndexPath: 方法,如果 customView 存在交互事件将无法响应。如果 contentView 设置了背景色,还会影响界面显示。
5. 此项目中使用 "YBImageBrowser" (版本2.1.1) 预览本相册信息, iOS14出现显示黑屏.
原因: iOS14中 YYAnimatedImageView 无法显示正常图片. iOS14系统YYAnimatedImageView没有正确处理(void)displayLayer:(CALayer *)layer; (参见第一条)
解决: 重写"YYAnimatedImageView.h"中displayLayer方法.
-(void)displayLayer:(CALayer *)layer {
UIImage *currentFrame = _curFrame;
if (!currentFrame) {
currentFrame = self.image;
}
if (currentFrame) {
layer.contentsScale = currentFrame.scale;
layer.contents = (__bridge id)currentFrame.CGImage;
}
}
6.在iOS14中使用位置定位权限时新增是否开启"精确定位"开关(默认为开启,但用户可以选择关闭). 需增加配置说明,明确申请定位权限的用途.
具体plist配置参数如下:
<dict>
<key>WantsToNavigate</key>
<string>需要您授权开启"精确定位",以便确定本准确位置信息</string>
<key>TacoFeature</key>
<string>您的准确位置将被用来定位本具体位置,以提供精准服务信息。</string>
</dict>
7.在iOS14中原获取UDID方法失效,获取值为空. 需使用AppTrackingTransparency 新框架获取,请请求用户授权.
具体plist配置参数如下:
<key>NSUserTrackingUsageDescription</key>
<string>需要您的授权获取设备UDID, 以便提供完整服务</string>
具体api适配方法:
+ (NSString*)jxt_IDFA {
__block NSString *IDFAString = nil;
dispatch_semaphore_t signal = dispatch_semaphore_create(0);
if (@available(iOS 14, *)) {
// iOS14使用 AppTrackingTransparency 新框架
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
IDFAString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
}else{
IDFAString = @"";
}
dispatch_semaphore_signal(signal);
}];
} else {
// 使用原方式访问 IDFA
NSString * systemVersion = [[UIDevice currentDevice] systemVersion];
if ([systemVersion floatValue] >= 6.0f){
IDFAString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}else{
IDFAString = @"";
}
dispatch_semaphore_signal(signal);
}
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
return IDFAString;
}
======以下是资料引用介绍======
iOS14 的适配,很重要的一环就集中在用户隐私和安全方面。以下是关于 iOS14 上对于隐私授权的变更和部分适配方案:
相册相关
1、iOS14 新增了“Limited Photo Library Access” 模式,在授权弹窗中增加了 Select Photo 选项。用户可以在 App 请求调用相册时选择部分照片让 App 读取。从 App 的视⻆来看,你的相册里就只有这几张照片,App 无法得知其它照片的存在。
需要在 Info.plist 中设置 “PHPhotoLibraryPreventAutomaticLimitedAccessAlert”的值为 YES 来阻止该弹窗反复弹出,并且可通过下面这个 API 来主动控制何时弹出PHPickerViewController 进行照片选择。
[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];
2、 在 iOS14 中官方推荐使用 PHPicker 来替代原 API 进行图片选择。PHPicker 为独立进程,会在视图最顶层进行展示,应用内无法对其进行截图也无法直接访问到其内的数据。
需要 由 UIImagePickerController 替换到 PHPickerViewController, UIImagePickerViewController 功能受限,每次只能选择一张图片,将逐渐被废弃。 PHPicker 支持多选,支持搜索,支持按 image,video,livePhotos 等进行选择。
注意点:在 limit Photo 模式下,AssetsLibrary 访问相册会失败;在 writeOnly 模式下,AssetLibrary 也会有显示问题。建议还在使用 AssetsLibrary 的同学尽快迁移到新 API。
授权相关:旧 API 废弃,增加 PHAccessLevel 参数。如果再使用以前的API来获取权限状态,PHAuthorizationStatusLimited 状态下也会返回 PHAuthorizationStatusAuthorized
定位相关
3、在 iOS13 及以前,App 请求用户定位授权时为如下形态:一旦用户同意应用获取定位信息,当前应用就可以获取到用户的精确定位。 iOS14 新增用户大致位置选项可供用户选择,原因是大多数 App 实际上并不需要获取用户到用户最准确的定位信息。iOS14 授权弹窗新增的 Precise的开关默认会选中精确位置。用户通过这个开关可以进行更改,当把这个值设为 On 时,地图上会显示精确位置;切换为Off时,将显示用户的大致位置。 也可以直接通过API来根据不同的需求设置不同的定位精确度。
咱们App 本是依赖精确位置的,用户可以在 “隐私设置” 中设置来开启精确定位,但是可能用户宁可放弃使用这个应用也不愿意开启。
在没有开启精确定位时,需要首先在 Info.plist 中配置“NSLocationTemporaryUsageDescriptionDictionary”字典中需要配置 key 和 value 表明使用位置的原因,以及具体的描述。
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));
IDFA相关
4、在 iOS13 及以前,系统会默认为用户开启允许追踪设置,我们可以简单的通过代码来获取到用户的 IDFA 标识符。 但是在 iOS14 中,这个判断用户是否允许被追踪的方法已经废弃。而且 iOS14 中,系统会默认为用户关闭广告追踪权限。
对于这种情况,我们需要去请求用户权限。首先需要在 Info.plist 中配置" NSUserTrackingUsageDescription " 及描述文案,接着使用 AppTrackingTransparency 框架中的ATTrackingManager 中的 requestTrackingAuthorizationWithCompletionHandler 请求用户权限,在用户授权后再去访问 IDFA 才能够获取到正确信息。
代码如下:
- (void)testIDFA { if (@available(iOS 14, *)) { [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { if (status == ATTrackingManagerAuthorizationStatusAuthorized) { NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString; } }]; } else { // 使用原方式访问 IDFA }}
上传APPstore相关
5、更加严格的隐私审核,可以让用户在下载 App 之前就知道此 App 将会需要哪些权限。目前苹果商店要求所有应用在上架时都必须提供一份隐私政策。如果引入了第三方收集用户信息等SDK,都需要向苹果说明是这些信息的用途。
以下好像是项目中没用到的适配:
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 地址的服务。
以下改变可以不需要适配
剪切板
在 iOS14 中,读取用户剪切板的数据会弹出提示。 弹出提示的原因是使用 UIPasteboard 访问用户数据,访问以下数据都会弹出 toast 提示。
如果应用访问剪切板仅仅用于判断是否为URL格式,则 iOS14 新增了两个 API 可以用于规避该提示(但只能用于判断剪切板中是否有 URL,并不是真正的访问剪贴板数据,也拿不到剪切板的真实数据。)。如果应用想直接访问剪切板的数据,暂时可能无法做到规避该提示。
相机和麦克风
iOS14 中 App 使用相机和麦克风时会有图标提示以及绿点和黄点提示,并且会显示当前是哪个 App 在使用此功能。我们无法控制是否显示该提示。