Xcode11+ iOS13+ Unity 提包UIWebView 解决方案
最近项目进行iOS的SDK更新,因为提审包时,Apple邮件提示UIwebview即将不能使用,2020年4月后包含UIwebview的新应用不能上传,老应用九月必须更新。
于是我将项目所有用到UIWebView的地方进行了更换,
于是进行下述步骤:
1.屏蔽移除项目所以三方SDK,直接入自己开发的SDK和代码
提审有警告
2.屏蔽移除项目所以三方SDK,将项目自己开发的SDK和代码UIWebView进行更新去除
提审有警告
定位到问题,项目本身就有,不全在SDK。
查找发现unity存在UIWebView的使用,于是找到解决方案:
unity libiPhone-lib.a 里面有UIWebView的引用,虽然项目没用到
解决:
将libiPhone-lib.a拆开,将里面的引用更新,再合并。
!!!!!!!!!!!!!
PS:最终建议,最好升级项目unity版本,别直接改unity的东西,这只是解决UIWebView的一种方案,但改动unity的东西会存在风险,比如破坏其他unity功能。
!!!!!!!!!!!!!
比如:Application.OpenURL(),做了如下处理后,这个方法iOS将无法生效,需要自定义实现相关功能
具体实现
2.1 构建URLUtility.o
(1)新建文件URLUtility.mm,并写入下面代码。
#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 *c_str(void); }; } 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; UIApplication *app = [UIApplication sharedApplication]; NSString *urlStr = [NSString stringWithUTF8String:(char *)arg2]; NSURL *url = [NSURL URLWithString:urlStr]; [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]; [app openURL:url]; }
(2)使用脚本将URLUtility.mm生成对应的URLUtility.o
打开终端,使用cd命令先去 URLUtility.mm 对应的目录,执行下述脚本
clang -c URLUtility.mm -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
意思是使用Xcode编译 URLUtility.mm生成arm64架构支持的URLUtility.o(如果项目包含其他的架构,可在执行脚本生成)
2.2 处理libiPhone-lib.a
找到自己即将打到包力的libiPhone-lib.a,使用脚本查看包含的架构,
lipo -info libiPhone-lib.a
比如我们就是用到了 armv7 arm64 两种架构
(1)拆分libiPhone-lib.a
现在分别将这个libiPhone-lib.a 拆分为对应架构的libiPhone-lib.a并放到对应架构URLUtility.o所在的文件夹
lipo libiPhone-lib.a -thin armv7 -output /Users/admin/URLUtility7/libiPhone-lib7.a
lipo libiPhone-lib.a -thin arm64 -output /Users/admin/URLUtility64/libiPhone-lib64.a
(2)替换libiPhone-lib.a里的URLUtility.o
将各自架构libiPhone-lib.a里的URLUtility.o替换为我们生成的。
ar -d 是移除,ar -q是添加
ar -d /Users/admin/URLUtility7/libiPhone-lib7.a URLUtility.o ar -q /Users/admin/URLUtility7/libiPhone-lib7.a /Users/admin/URLUtility7/URLUtility.o ar -d /Users/admin/URLUtility64/libiPhone-lib64.a URLUtility.o ar -q /Users/admin/URLUtility64/libiPhone-lib64.a /Users/admin/URLUtility64/URLUtility.o
如果出现这样的提示,就说明对应架构里不包含URLUtility.o,可以跳过,直接进行下一步。
(3)合并libiPhone-lib.a
现在两个架构的libiPhone已经是符合标准的,,我们再做最后一步,就是将两个架构的libiPhone合成为一个
lipo -create /Users/admin/URLUtility7/libiPhone-lib7.a /Users/admin/URLUtility64/libiPhone-lib64.a -output libiPhone-lib.a
做完这部,再上传提审,没有警告邮件。
3.其他三方SDK,进行更新,一般的SDK最新版都进行了处理。
点个赞再走呗。。。
如有疑问,联系作者
博客园:这个我不知道诶