前言
最近提审新项目时,构建包传到 iTunes Connect 后台后总是无法处理成功,Apple 邮件给出以下反馈:
1 2 ITMS-90809: Deprecated API Usage – Apple will stop accepting submissions of apps that use UIWebView APIs . See https://developer.apple.com/documentation/uikit/uiwebview for more information.
由于早期已经将项目中的 UIWevView 全部替换为了 WKWebView ,于是推测可能是其他的第三方库里用到了 UIWevView ,所以逐个第三方的排查、升级SDK,最终还是无法解决问题。
于是推测可能是 Unity 框架中使用到了 UIWevView,于是用了以下命令扫描工程目录下的相关文件:
扫描的结果是:
1 Binary file ./Libraries/libiPhone-lib.a matches
发现 libiPhone-lib.a 中引用了 UIWebView
解决方案
通过查找资料了解到,虽然 Unity 官方不准备在旧版本修复此问题,但是在问题描述中阐述了具体细节:在 PlatformDependent/iPhonePlayer/URLUtility.mm
中使用 UIWebView 处理游戏内链接。
因此,目前有两种解决方案:
升级Unity引擎
去掉 libiPhone-lib.a 中的 UIWebView 引用
Unity 已经在部分新版本中修复了这个问题,通过查阅 Release Notes 可以看到说明,但是升级游戏引擎的工作量比较大,所以没有被我们选为首选方案。
处理过程
1.创建URLUtility.mm 新建文件 URLUtility.mm,并写入下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #include <iostream> #import <UIKit/UIKit.h> using namespace std; namespace core { template <class type> class StringStorageDefault {}; template <class type,class type2> class basic_string { public: char * str; basic_string( char* arg){ str = arg; } }; } void OpenURLInGame(core::basic_string< char,core::StringStorageDefault<char> > const&arg){} void OpenURL(core::basic_string<char,core::StringStorageDefault<char> >const &arg){ const void *arg2 = arg.str; UIApplication *app = [UIApplication sharedApplication]; NSString *urlStr = [NSString stringWithUTF8String:(char *)arg2]; NSURL *url = [NSURL URLWithString:urlStr]; if (@available(iOS 10.0, *)) { [app openURL:url options:@{UIApplicationOpenURLOptionsSourceApplicationKey : @YES} completionHandler:nil]; } else { [app openURL:url]; } } void OpenURL(std::string const&arg){ UIApplication *app = [UIApplication sharedApplication]; NSString *urlStr = [NSString stringWithUTF8String:arg.c_str()]; NSURL *url = [NSURL URLWithString:urlStr]; if (@available(iOS 10.0, *)) { [app openURL:url options:@{UIApplicationOpenURLOptionsSourceApplicationKey : @YES} completionHandler:nil]; } else { [app openURL:url]; } }
2.查看 libiPhone-lib.a 架构 用以下命令查看:
结果如下:
1 2 3 4 libiPhone-lib.a: Mach-O universal binary with 3 architectures: [arm_v7:current ar archive] [arm_v7s] libiPhone-lib.a (for architecture armv7): current ar archive libiPhone-lib.a (for architecture arm64): current ar archive libiPhone-lib.a (for architecture armv7s): current ar archive
可以得出,有三种架构:armv7、arm64、armv7s。 因此在编译时建议三种架构都编译,否则在替换时会提示缺失符号问题。
3.构建URLUtility.o 使用以下命令构建:
1 2 3 4 5 6 7 8 # arm64 架构 clang -c URLUtility.mm -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./arm64/URLUtility.o # armv7 架构 clang -c URLUtility.mm -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./armv7/URLUtility.o # armv7s 架构 clang -c URLUtility.mm -arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./armv7s/URLUtility.o
注意:-isysroot
指定的 SDK 路径一定是当前工程使用的 Xcode 版本,特别是当机器上存在多个 Xcode 版本时要注意。
4.拆分 libiPhone-lib.a 使用以下命令:
1 2 3 4 5 6 7 8 # arm64 架构 lipo libiPhone-lib.a -thin arm64 -output ./arm64/libiPhone-lib.a # armv7 架构 lipo libiPhone-lib.a -thin armv7 -output ./armv7/libiPhone-lib.a # armv7s 架构 lipo libiPhone-lib.a -thin armv7s -output ./armv7s/libiPhone-lib.a
5.替换各个架构下的 libiPhone-lib.a 中的 URLUtility.o 使用以下命令:
1 2 3 4 5 6 7 8 9 10 11 # arm64 架构 ar -d ./arm64/libiPhone-lib.a URLUtility.o ar -q ./arm64/libiPhone-lib.a ./arm64/URLUtility.o # armv7 架构 ar -d ./armv7/libiPhone-lib.a URLUtility.o ar -q ./armv7/libiPhone-lib.a ./armv7/URLUtility.o # armv7s 架构 ar -d ./armv7s/libiPhone-lib.a URLUtility.o ar -q ./armv7s/libiPhone-lib.a ./armv7s/URLUtility.o
6.合并 libiPhone-lib.a 使用以下命令:
1 lipo -create ./arm64/libiPhone-lib.a ./armv7/libiPhone-lib.a ./armv7s/libiPhone-lib.a -output libiPhone-lib.a
7.检查 libiPhone-lib.a 用以下命令检查新生成的 libiPhone-lib.a 文件:
没有任何输出表示当前的文件中已经没有了 UIWebView 引用。
尾声
做完上述操作,将新的 libiPhone-lib.a 替换原工程的 libiPhone-lib.a ,再次提包,构建包成功处理完成。
上述过程已经写成了脚本,有需要的朋友可以自取。
传送门: libiPhone-lib.sh