「这是我参加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 IDAccess 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

iOS各系统版本适配总结
增加,不然深色主题下,项目中体系控件背景色变成黑色背景了。

2. 模态弹出全屏和卡片款式

iOS13的模态弹出形式并不是全屏款式了,假如需求模态依然都是iOS13之前的款式,需求增加 vc.modalPresentationStyle = UIModalPresentationFullScreen; 这样模态弹出就和之前相同了。

3. Sign In with Apple

假如你的运用包括三方登录办法,比方QQ、微信…, 那么你的运用有必要包括AppID登录,不然运用上架将会被拒。

4. 私有特点的修正

在 iOS 13 中不再答应运用valueForKeysetValue: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逻辑中的溃散点

iOS各系统版本适配总结

5. UISearchBar的黑线处理问题

之前为了处理搜索框的黑线问题,通常会遍历 searchBar 的 subViews,找到并删去UISearchBarBackground

iOS各系统版本适配总结

在 iOS13 中这么做会导致 UI 烘托失利,然后直接溃散,溃散信息如下:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Missing or detached view for search bar layout'

能够运用以下办法处理黑线

[searchBar setBackgroundImage:[UIImage new]];

iOS各系统版本适配总结

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中,挑选相片权限运用户答应运用拜访部分相片的权限。

iOS各系统版本适配总结

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 新增两个办法可用于向用户申请暂时敞开一次准确方位权限。

iOS各系统版本适配总结

5. 相机和录音

iOS14 中 App 运用相机和麦克风时会有图标提示以及绿点和黄点提示,并且会显现当时是哪个 App 在运用此功用。咱们无法控制是否显现该提示。

6. KVC 办法禁用

如同 iOS 13 时,UITextField 制止运用 setValue:forKey: 来设置 _placeholderLabel 私有特点,iOS 14 中,UIPageControl 也制止运用 setValue 办法,来设置 _pageImage 和 _currentPageImage 特点。不然运转时将会溃散。

iOS15需求适配的点

1. iOS导航栏背景色彩设置失效处理

iOS各系统版本适配总结

iOS各系统版本适配总结

iOS各系统版本适配总结

2. iOS TabBar处理同NavigationBar

iOS各系统版本适配总结

iOS各系统版本适配总结

3. UITableView新增TopPadding高度

从 iOS 15 开端,增加sectionHeaderTopPadding特点,TableView假如是plain类型,一旦实现了viewForHeaderInSection及heightForHeaderInSection办法,假如没有设置sectionHeaderTopPadding为0,默许情况sectionHeaderTopPadding会有22个像素的高度。一般咱们需求制止。

iOS各系统版本适配总结

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 适配相关