ios17 URL的变化
在 iOS 17 之前,URL 初始化时支持的是较久的 RFC 1738/1808 标准,但是 URLComponents 支持的是 RFC 3986 标准,两个标准不同导致 iOS 开发者在某些时候比较困惑,所以苹果在今年的更新中,终于把标准统一了,统一支持 RFC 3986 标准。
变化是什么?
在 iOS 17 之前,URL(string: "Not an URL") 会返回 nil,因为这是一个无效的 URL 格式,但是在 iOS 17 上,这段代码将会返回 Not%an%URL,相当于是把中间的空格进行了一次 encode。中文在之前需要手动url编码,ios17之后也会自动编码。
Apple 在 iOS 17 的 URL 初始化方法中,添加了一个带有 Bool (默认值 true)的新参数 encodingInvalidCharacters,这个参数代表是否 encoding 掉无效的字符,如果传 false,URL 的行为将会和 iOS 16 上一致。
public init?(string: String, encodingInvalidCharacters: Bool)
// iOS 16
let url = URL(string: "Not an URL") // => nil
// iOS 17
let url = URL(string: "Not an URL", encodingInvalidCharacters: false) // => nil
如果你不想改变 URL 的默认行为,从而兼容以前的代码,需要把之前使用 URL 初始化的方法加上 encodingInvalidCharacters: false 参数。
ios16适配
- APP切换横竖屏问题
iOS16之前切换横竖屏使用的是UIDevice的setValue:forKey:方法进行切换。但在iOS16后不再支持使用setValue方法设置设备的方向,建议替换为UIWindowScene 的requestGeometryUpdate方法。
///竖屏
if (@available(iOS 16.0, *)) {
[self.navigationController setNeedsUpdateOfSupportedInterfaceOrientations];
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
UIWindowScene *ws = (UIWindowScene *)array[0];
UIWindowSceneGeometryPreferencesIOS *geometryPreferences = [[UIWindowSceneGeometryPreferencesIOS alloc] init];
geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskPortrait;
[ws requestGeometryUpdateWithPreferences:geometryPreferences errorHandler:^(NSError * _Nonnull error) {
//业务代码
}];
} else {
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationUnknown] forKey:@"orientation"];
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationPortrait] forKey:@"orientation"];
}
//横屏
if (@available(iOS 16.0, *)) {
[self.navigationController setNeedsUpdateOfSupportedInterfaceOrientations];
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
UIWindowScene *ws = (UIWindowScene *)array[0];
UIWindowSceneGeometryPreferencesIOS *geometryPreferences = [[UIWindowSceneGeometryPreferencesIOS alloc] init];
geometryPreferences.interfaceOrientations = UIInterfaceOrientationMaskLandscapeLeft;
[ws requestGeometryUpdateWithPreferences:geometryPreferences errorHandler:^(NSError * _Nonnull error) {
//业务代码
}];
} else {
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationUnknown] forKey:@"orientation"];
[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIDeviceOrientationLandscapeLeft] forKey:@"orientation"];
}
ios15适配
- 1、UITabar、NaBar新增scrollEdgeAppearance,来描述滚动视图滚动到bar边缘时的外观,即使没有滚动视图也需要去指定scrollEdgeAppearance,否则可能导致bar的背景设置无效。具体可以参考UIBarAppearance 和UINavigationBar适配
2、tableView 增加sectionHeaderTopPadding属性,默认值是UITableViewAutomaticDimension,可能会使tableView sectionHeader多处一段距离,需要设置 为
3、IDFA 请求权限不弹框问题,解决参考iOS15 ATTrackingManager请求权限不弹框
6、image新增了几个调整尺寸的方法:
// preparingThumbnail
UIImage(named: "sv.png")?.preparingThumbnail(of: CGSize(width: 200, height: 100))
// prepareThumbnail,闭包中直接获取调整后的UIImage
UIImage(named: "sv.png")?.prepareThumbnail(of: CGSize(width: 200, height: 100)) { image in
// 需要回到主线程更新UI
}
await UIImage(named: "sv.png")?.byPreparingThumbnail(ofSize: CGSize(width: 100, height: 100))
ios14适配
1、更改了cell布局视图,之前将视图加载在cell上,将会出现contentView遮罩,导致事件无法响应,必须将customView 放在 contentView 上
2、UIDatePicker默认样式不再是以前的,需要设置preferredDatePickerStyle为 UIDatePickerStyleWheels。
3、IDFA必须要用户用户授权处理,否则获取不到IDFA
4、 UIPageControl的变化 具体参考iOS 14 UIPageControl对比、升级与适配
5、在iOS14之后访问相册新增了Limited Photo Library Access 模式,在授权弹窗中增加了 Select Photo 选项。
ios13适配
-1、 iOS 13 推出暗黑模式,UIKit 提供新的系统颜色和 api 来适配不同颜色模式,xcassets 对素材适配也做了调整
2、支持第三方登录必须,就必须Sign In with Apple
3、MPMoviePlayerController 废弃
4、iOS 13 DeviceToken有变化
5、模态弹出默认不再是全屏。
6、私有方法 KVC 不允许使用
7、蓝牙权限需要申请
8、LaunchImage 被弃用
9、 可以使用UITableViewDiffableDataSource进行局部刷新
9、新出UIBarAppearance统一配置navigation bars、tab bars、 toolbars等bars的外观。之前设置na bar和tab bar外观的方法可能会无效
ios12适配
1、C++ 标准库libstdc++相关的3个库(libstdc++、libstdc++.6、libstdc++6.0.9 )废弃,使用libc++代替
2、短信 验证码自动填充api
if (@available(iOS 12.0, *)) {
codeTextFiled.textContentType = UITextContentTypeOneTimeCode;
}
ios11适配
- 1、ViewController的automaticallyAdjustsScrollViewInsets属性被废弃,用scrollView的contentInsetAdjustmentBehavior代替。
- 2、safeAreaLayoutGuide的引入
- 3、tableView默认开启了Size-self
- 4、新增的prefersLargeTitles属性
- 5、改善圆角,layer新增了maskedCorners属性
- 6、tableView右滑删除新增api
- 7、导航条的层级发生了变化。例如在设置titleView时,可能会出现不期望的布局显示。
- 8、 相册权限变更
iOS11以前: NSPhotoLibraryUsageDescription:访问相册和存储照片到相册(读写),会出现用户授权; iOS11之后: NSPhotoLibraryUsageDescription:无需添加。默认开启访问相册权限(读),无需用户授权; NSPhotoLibraryAddUsageDescription: 添加内容到相册(写),会出现用户授权;
ios10适配
1、通知统一使用UserNotifications.framework框架
2、UICollectionViewCell的的优化,新增加Pre-Fetching预加载机制
3、苹果加强了对隐私数据的保护,要对隐私数据权限做一个适配,iOS10调用相机,访问通讯录,访问相册等都要在info.plist中加入权限访问描述,不然之前你们的项目涉及到这些权限的地方就会直接crash掉。
4、AVPlayer增加了多个属性,timeControlStatus、
automaticallyWaitsToMinimizeStalling
AVPlayer有时候播放不了的问题5、tabar未选中颜色设置 用 unselectedItemTintColor代替