「这是我参加2022初次更文应战的第2天,活动详情查看:2022初次更文应战」。
记载一下iOS各个体系版别的适配点
收拾一下iOS各个体系的适配版别,以下文章只做记载收拾用,有些是笔者遇到的,有些是参阅网上收拾的,因为有些适配的点笔者并没有运用到,因而也没实际适配,最好遇到的点都自己验证一下。
iOS11需求适配的点
1. ios11新增新的左滑删去办法,支撑图片和文字款式
// Swipe actions
// These methods supersede -editActionsForRowAtIndexPath: if implemented
// return nil to get the default swipe actions
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
2. UIScrollView、UITableView、UICollectionView导航偏移问题
翻滚视图在被Navigation、TabBar遮住的时分,体系默许会修正翻滚视图的contentInset
特点,假如用户设置翻滚视图的contentInsetAdjustmentBehavior特点为 .never,则体系不会再做相关处理。一般咱们都自己处理翻滚视图的布局frame,默许翻滚视图在导航栏下及TabBar上,因而都需求写上
tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
iOS12需求适配的点
1. library not found for -lstdc++.6.0.9
苹果在Xcode10 和 iOS 12中移除了 libstdc++
库,由libc++
这个库取而代之
解决计划:
一般会报此错误的都是旧版别的SDK库问题,能够删去那个库或者从Xcode9中仿制-lstdc++.6.0.9到Xcode10中
/// 模拟器
Xcode 10:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/
Xcode 11:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/
/// 真机
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
2. iOS 12体系WiFi
获取SSID
(wifi称号)和BSSID
(mac地址)失利
iOS 12体系WiFi
获取SSID
(wifi称号)和BSSID
(mac地址)失利, 在iOS 12
体系之后,苹果提升了获取WiFi
称号和mac
地址的权限控制,要获取这些信息,需求手动为运用打开获取WiFi信息的权限。具体操作能够参阅《获取iOS设备WiFi名字和mac地址+iOS12体系获取失利解决》。
解决计划:
在开发者账号中,勾选项意图App ID
的Access WiFi Infomation
选项;
在Xcode的Capabilities
中,勾选项意图Access WiFi Infomation
选项。
3. webView播映视频回来后状态栏消失
视频播映完成主window
成为KeyWindow
的时分仍隐藏着UIStatusBar
。
解决计划:
- (void)videoPlayerFinishedToShowStatusBar {
if (@available(iOS 12.0, *)) {
[[NSNotificationCenter defaultCenter] addObserverForName:UIWindowDidBecomeKeyNotification object:self.window queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}];
}
}
iOS13需求适配的点
1. 深色形式的适配
iOS13新增了深色形式,假如项目中制止深色形式,需求在Info.plist
增加,不然深色主题下,项目中体系控件背景色变成黑色背景了。
2. 模态弹出全屏和卡片款式
iOS13的模态弹出形式并不是全屏款式了,假如需求模态依然都是iOS13之前的款式,需求增加 vc.modalPresentationStyle = UIModalPresentationFullScreen; 这样模态弹出就和之前相同了。
3. Sign In with Apple
假如你的运用包括三方登录办法,比方QQ、微信…, 那么你的运用有必要包括AppID登录,不然运用上架将会被拒。
4. 私有特点的修正
在 iOS 13 中不再答应运用valueForKey
、setValue:forKey:
等办法获取或设置私有特点,虽然编译能够经过,可是在运转时会直接溃散,并提示一下溃散信息
/// 运用的私有办法
[self.textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
/// 溃散提示信息
*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug'
替换计划
/// 修正UITextField的placeholder字体大小及色彩
NSMutableAttributedString *arrStr = [[NSMutableAttributedString alloc]initWithString:self.valueTextField.placeholder attributes:@{NSForegroundColorAttributeName : UIColorFromRGB(0xD8D8D8),NSFontAttributeName:UIDEFAULTFONTSIZE(12)}];
self.valueTextField.attributedPlaceholder = arrStr;
一般尽量不要在项目中拜访体系的私有特点,假如运用的话,能够增加个分类交换KVC办法来处理KVC底层遍历拜访key逻辑中的溃散点
5. UISearchBar的黑线处理问题
之前为了处理搜索框的黑线问题,通常会遍历 searchBar 的 subViews,找到并删去UISearchBarBackground
。
在 iOS13 中这么做会导致 UI 烘托失利,然后直接溃散,溃散信息如下:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Missing or detached view for search bar layout'
能够运用以下办法处理黑线
[searchBar setBackgroundImage:[UIImage new]];
6. LaunchImage 被弃用
iOS 8 之前咱们是在LaunchImage
来设置发动图,每逢苹果推出新的屏幕尺寸的设备,咱们需求 assets 里面放入对应的尺寸的发动图,这是十分繁琐的一个过程。因而在 iOS 8 苹果引入了 LaunchScreen
,能够直接在 Storyboard 上设置发动界面款式,能够很方便适配各种屏幕。
需求注意的是,苹果在 Modernizing Your UI for iOS 13 section 中提到 ,从2020年4月开端,一切支撑 iOS 13 的 App 有必要提供 LaunchScreen.storyboard
,不然将无法提交到 App Store 进行批阅。
运用 LaunchScreen.storyboard
设置发动页,弃用 LaunchImage
。
iOS14需求适配的点
1. 相片权限新增了挑选相片权限
iOS14中,挑选相片权限运用户答应运用拜访部分相片的权限。
2. UITableView contentView
iOS14中,UITableViewCell上的控件直接增加到cell上,点击事件将被contentView挡住,因而,不管是否有点击事件,cell上的控件都需求增加到self.contentView上。
3. 获取仅有标识符 API 抛弃
在 iOS13 及以前,体系会默许为用户敞开答应追踪设置,咱们能够简单的经过代码来获取到用户的IDFA
标识符。
if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
NSLog(@"%@", idfaString);
}
iOS 14 以后,会默许关闭广告追踪权限,并且上面判别是否敞开权限的办法现已抛弃。
解决计划: 需求咱们需求在 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 {
// 运用原办法拜访 IDFA
}
}
4. 定位问题
在 iOS13 及以前,App 恳求用户定位授权时为如下形状:一旦用户赞同运用获取定位信息,当时运用就能够获取到用户的准确定位。
iOS14 新增用户大致方位选项可供用户挑选。iOS14 授权弹窗新增的 Precise的开关默许会选中准确方位。用户经过这个开关能够进行更改,当把这个值设为 On 时,地图上会显现准确方位;切换为Off时,将显现用户的大致方位。
对于对用户方位敏感度不高的 App 来说,这个好像无影响,可是对于强依靠准确方位的 App 适配作业就显得十分重要了。能够经过用户在 “隐私设置” 中设置来敞开准确定位,可是或许用户宁可抛弃运用这个运用也不愿意敞开。这个时分,iOS14 在 CLLocationManager 新增两个办法可用于向用户申请暂时敞开一次准确方位权限。
5. 相机和录音
iOS14 中 App 运用相机和麦克风时会有图标提示以及绿点和黄点提示,并且会显现当时是哪个 App 在运用此功用。咱们无法控制是否显现该提示。
6. KVC 办法禁用
如同 iOS 13 时,UITextField 制止运用 setValue:forKey: 来设置 _placeholderLabel 私有特点,iOS 14 中,UIPageControl 也制止运用 setValue 办法,来设置 _pageImage 和 _currentPageImage 特点。不然运转时将会溃散。
iOS15需求适配的点
1. iOS导航栏背景色彩设置失效处理
2. iOS TabBar处理同NavigationBar
3. UITableView新增TopPadding高度
从 iOS 15 开端,增加sectionHeaderTopPadding特点,TableView假如是plain类型,一旦实现了viewForHeaderInSection及heightForHeaderInSection办法,假如没有设置sectionHeaderTopPadding为0,默许情况sectionHeaderTopPadding会有22个像素的高度。一般咱们需求制止。
4. UIImageWriteToSavedPhotosAlbum
在iOS15中,UIImageWriteToSavedPhotosAlbum存储图片之后的回调不再回来图片了,会回来nil。
UIImageWriteToSavedPhotosAlbum(image,self,@selector(image:didFinishSavingWithError:contextInfo:), NULL);
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
}
总结
暂时先收拾这些,有遇到后续再补充。
参阅链接
lstdc++.6.0.9适配
iOS12适配及兼容问题解决
iOS14 隐私适配及部分解决计划
iOS 14 适配
iOS15 适配相关