【Xcode问题】XCode 16(iOS18 SDK)适配兼容记录

前言

最近打包提审的小伙伴应该都收到了苹果的升级提醒邮件,自2025年4月24日起所有上传至 App Store Connect 的App都必须使用 Xcode16 打包。

Although delivery was successful, you may want to correct the following issues in your next delivery. Once you’ve corrected the issues, upload a new binary to App Store Connect.

ITMS-90725: SDK version issue - This app was built with the iOS 17.4 SDK. Starting April 24, 2025, all iOS and iPadOS apps must be built with the iOS 18 SDK or later, included in Xcode 16 or later, in order to be uploaded to App Store Connect or submitted for distribution.

Apple Developer Relations

这两天在做MacOS、XCode的升级及iOS18的兼容工作。此次升级和以往类似,不出所料的还是出现了一些问题。

当前环境

  • MacOS系统:15.4
  • Xcode版本:16.3
  • iOS系统:18.3

问题一:WKWebViewConfiguration设置私有属性崩溃

在iOS18.3系统中 WKWebView 设置 WKWebViewConfiguration 属性时引发了一个崩溃

在这里插入图片描述

控制台打印崩溃信息如下

在这里插入图片描述

最终定位到崩溃为设置 _allowUniversalAccessFromFileURLs 私有属性时引发的崩溃

[config setValue:@YES forKey:@"_allowUniversalAccessFromFileURLs"];

目前暂时没有在苹果发布信息中找到相关描述,初步处理方案可以通过对版本进行判断处理

if (!@available(iOS 18.0, *) && @available(iOS 9.0, *)) {
     [config setValue:@YES forKey:@"_allowUniversalAccessFromFileURLs"];
}

问题二:微信登录、分享无法拉起微信

在iOS18.3系统中测试微信授权登录和分享时发现无法拉起微信,赶紧又用其他测试机试了下,发现Xcode16打的包,iOS18及以上系统有问题 ❌,iOS18以下系统依然正常✅。在微信授权回调返回中也是iOS18及以上返回NO,18以下返回YES

SendAuthReq *req = [[SendAuthReq alloc] init];
req.scope = @"xcope";
req.state = @"wx_oauth_authorization_state";
// 唤起微信
[WXApi sendReq:req completion:^(BOOL success) {
      NSLog(@"%d", success); // iOS18返回NO,18以下返回YES
}];

同时在拉起微信操作时,控制台可以看到如下警告信息

在这里插入图片描述

查了下苹果iOS18 Release Notes还真有相关描述,官网地址:https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-18-release-notes#UIApplication

在这里插入图片描述

从 Xcode 16(iOS18)开始苹果将彻底废弃 UIApplication.openURL(_😃 方法,该方法将会无效,不会打开任何传入的URL,方法将总是返回false。

所以项目中使用到 UIApplication.openURL(_😃 方法的地方都需要替换为最新的API

// OC
[UIApplication.sharedApplication openURL:url options:@{} completionHandler:nil];

// Swift
UIApplication.shared.open(url, options: [:]) { success in

}

由此可见微信SDK中应该是使用了废弃的 UIApplication.openURL(_😃 导致了微信拉取失败。

同时在微信官方接入文档中也看到了相关问题说明

在这里插入图片描述

微信SDK地址:https://developers.weixin.qq.com/doc/oplatform/Mobile\\_App/Access\\_Guide/iOS.html

微信官方给出的解决方案是将微信SDK升级到最新版本 2.0.4

其实还有一种取巧的方法,就是hook UIApplication.openURL(_😃 方法直接调用最新API

#import "UIApplication+SwizzleOpenURL.h"
#import <objc/runtime.h>
@implementation UIApplication (SwizzleOpenURL)
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [UIApplication class];
        SEL originalSelector = @selector(openURL:);
        SEL swizzledSelector = @selector(swizzled_openURL:);
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
        if (originalMethod && swizzledMethod) {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}
- (BOOL)swizzled_openURL:(NSURL *)url {
    if (@available(iOS 10.0, *)) {
        [self openURL:url
            options:@{}
            completionHandler:^(BOOL success) {
               // 需要处理回调的建议自行处理
            }];
        return YES;
    } else {
        return [self swizzled_openURL:url];
    }
}
@end

友情提示

见原文:【Xcode问题】XCode 16(iOS18 SDK)适配兼容记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值