首页 > 技术文章 > Xcode11+ iOS13+ Unity 提包UIWebView 解决方案

Yongersblog 原文

最近项目进行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最新版都进行了处理。

点个赞再走呗。。。

如有疑问,联系作者

博客园:这个我不知道诶


 

推荐阅读