苹果手机适配Xcode13打包及IOS15系统

苹果手机适配Xcode13打包及IOS15系统

  • 1. 问题统计
  • 2. 适配问题
  • 3. iOS15.2系统相册权限卡死Bug影响分析
  • 4. iOS 15.4 12小时制 时间格式转换崩溃
  • 5. keyWindow在IOS15的适配方式

2021年9月苹果发布xcode13及iOS15,苹果每年都有要求限制开发者提交市场App的xcode版本,手机证券App为提前应对限制,做好充分时间准备。
目前公司的项目提前在做适配工作, 所以再次记录。

1. 问题统计

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;

  • 编译模式的调整

苹果手机适配Xcode13打包及IOS15系统_第1张图片

  • Podfile文件的改变

在这里插入图片描述

  • build setting 修改变量

在这里插入图片描述

2. 适配问题

式配点 现象 方案
UITableView 从 iOS 15 开始,TableView 增加sectionHeaderTopPadding属性,默认情况sectionHeaderTopPadding会有22个像素的高度,及默认情况,TableView section header增加22像素的高度 self.tableView.sectionHeaderTopPadding = 0
保存相册 UIImageWriteToSavedPhotosAlbum存储图片之后的回调不再返回图片了,会返回nil,如果在回调方法里面操作image有可能会直接Crash 目前的解决办法声明一个全局image去记录,后面再去操作

3. iOS15.2系统相册权限卡死Bug影响分析

12 月 15 日,苹果发布了 iOS 15.2 的正式版。不幸的是这次升级,获取相册权限在特定情况下会卡死:
在还未向用户申请相册权限时,即
[PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized 时,
如果调用 [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:xxx]; 添加监听,则会卡死。苹果开发者论坛也有反馈(https://developer.apple.com/forums/thread/696131),目前苹果还未有回应,可以看到这个问题在 15.2 beta 版中就存在了,需观察苹果后续会如何处理。
临时方案可以在注册前进行判断,如果没有权限,则不注册观察者。

IOS11之后,系统访问相册即使是第一次访问相册,系统也没有弹出需要用户授权的弹框,对于一些审核比较严格的app这一点我们需要注意

4. iOS 15.4 12小时制 时间格式转换崩溃

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文档

苹果手机适配Xcode13打包及IOS15系统_第2张图片

从苹果官方对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。

5. keyWindow在IOS15的适配方式

- (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;
    }
}
  • 后续在适配的过程中,持续更新,直至适配完

你可能感兴趣的:(IOS适配,xcode,ios,iphone)