2021年9月苹果发布xcode13及iOS15,苹果每年都有要求限制开发者提交市场App的xcode版本,手机证券App为提前应对限制,做好充分时间准备。
目前公司的项目提前在做适配工作, 所以再次记录。
Showing All Messages
: The Legacy Build System will be removed in a future release. You can configure the selected build system and this deprecation message in File > Workspace Settings.
Xcode-〉file-〉Workspace Settings 选择新的模式(项目以前都是使用旧的编译模式)
Showing All Messages
/Users/xia/EssenceMobile_ios/project/axsc/tztMobileApp_axsc.xcodeproj Building for iOS, but the linked and embedded framework 'alivcffmpeg.framework' was built for iOS + iOS Simulator.
Xcode-〉Build Setting-〉VALIDATE_WORKSPACE = YES;
Showing All Messages
Multiple commands produce '/Users/xia/Library/Developer/Xcode/DerivedData/tztMobileApp_axsc-bacmqduyvlscwtgrianwrtoxrvsm/Build/Products/Debug-iphonesimulator/tztMobileApp_axsc.app/MJRefresh.bundle':
1) That command depends on command in Target 'tztMobileApp_axsc' (project 'tztMobileApp_axsc'): script phase “Run Script”
2) That command depends on command in Target 'tztMobileApp_axsc' (project 'tztMobileApp_axsc'): script phase “[CP] Copy Pods Resources”
Podfile
install! 'cocoapods', :disable_input_output_paths => true
/Users/xia/EssenceMobile_ios/Frameworks/TIFASDK/TIFASDK.xcodeproj The linked framework 'AxsThirdVendors.framework' is missing one or more architectures required by this target: i386.
'AxsThirdVendors.framework' 缺少i386的架构【模拟器编译】
TIFACustomButton
_font;- >ax_font;
式配点 | 现象 | 方案 |
---|---|---|
UITableView | 从 iOS 15 开始,TableView 增加sectionHeaderTopPadding属性,默认情况sectionHeaderTopPadding会有22个像素的高度,及默认情况,TableView section header增加22像素的高度 | self.tableView.sectionHeaderTopPadding = 0 |
保存相册 | UIImageWriteToSavedPhotosAlbum存储图片之后的回调不再返回图片了,会返回nil,如果在回调方法里面操作image有可能会直接Crash | 目前的解决办法声明一个全局image去记录,后面再去操作 |
12 月 15 日,苹果发布了 iOS 15.2 的正式版。不幸的是这次升级,获取相册权限在特定情况下会卡死:
在还未向用户申请相册权限时,即
[PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized 时,
如果调用 [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:xxx]; 添加监听,则会卡死。苹果开发者论坛也有反馈(https://developer.apple.com/forums/thread/696131),目前苹果还未有回应,可以看到这个问题在 15.2 beta 版中就存在了,需观察苹果后续会如何处理。
临时方案可以在注册前进行判断,如果没有权限,则不注册观察者。
IOS11之后,系统访问相册即使是第一次访问相册,系统也没有弹出需要用户授权的弹框,对于一些审核比较严格的app这一点我们需要注意
Xcode更新到13之后, 发现模拟器的时间为12小时制的时间格式,发现以前使用HH
格式来转换的时间均为nil
字符串时间转时间对象
NSString *timeStr = @"2021-12-12 13:15:59";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *currentDate = [dateFormatter dateFromString:timeStr];
NSLog(@"currenDate==========%@",currentDate);//nil
在IOS15.4之前
是可以正常转换的, 但是在IOS15.4
上转换出的时间对象是nil
IOS15.4之前12小时时间格式和24小时时间格式区别参考:时间格式转换问题
解决方法:dateFormatter.locale = [NSLocale systemLocale]
设置local
属性
时间对象转字符串:
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *dateStr = [dateFormatter stringFromDate:date];
NSLog(@"%@",dateStr);
输出结果:2022-04-12 16:48:44.918467+0800 TimeTest[770:30824] 2022-04-12 4:48:44 PM
在IOS15.4上, 如果使用12小时时间格式
下, 可以看到虽然我们的格式使用HH
,但是转换出来的字符串还是12小时制的时间,并且转换出来字符串还是带了AM
或则PM
等多余字段
- 在 iOS 上,用户可以覆盖默认的 AM/PM 与 24 小时时间设置(通过设置 > 常规 > 日期和时间 > 24 小时时间),这会导致 NSDateFormatter 重写您设置的格式字符串,这可能会导致您的时间解析失败。
NSDateFormatter文档
从苹果官方对NSDateFormatter的解释中可以看出,要想在任何时候输出固定格式的日期,需要设置.local,即设置:
dateFormatter.locale = [NSLocale systemLocale];
或则
dateFormatter.locale = Locale(identifier: "zh_CN")
同时我们可以根据App是否需要再多个国家和地区提供对应的日历,如果需要可以设置对应的日历属性, 因为没有设置,IOS会使用用户默认的设置日历,这样可能会带来一些意想不到的问题。
dateFormatter.calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierISO8601];
ISO8601:
国际标准化组织的国际标准ISO 8601是日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。最新为第三版ISO8601:2004,第一版为ISO8601:1988,第二版为ISO8601:2000。
- (nullable UIWindow *)axKeyWindow
{
UIApplication *application = [UIApplication sharedApplication];
UIWindow *keyWindow = nil;
if (@available(iOS 13.0,*)) {// iOS 13之后keywindow
for (UIScene *secen in application.connectedScenes) {
if (secen.activationState == UISceneActivationStateForegroundActive) {
UIWindowScene *windowScene = nil;
if ([secen isKindOfClass:[UIWindowScene class]]) {
windowScene = (UIWindowScene *)secen;
}
if (@available(iOS 15.0,*)) {
//IOS 15之后获取keyWindow
keyWindow = windowScene.keyWindow;
break;
} else {
for (UIWindow *window in windowScene.windows) {
if (window.isKeyWindow) {
keyWindow = window;
break;
}
}
}
}
}
// iOS13之后新方式获取不到keywindow,使用老版本keywindow
if (!keyWindow) {
keyWindow = application.keyWindow;
}
return keyWindow;
}else {// 老版本keywindow
return application.keyWindow;
}
}