Unity使用UIWebView导致iOS审核被拒的解决方案

根据苹果应用商店的最新政策, UIWebView相关API已经Deprecated,如果项目中有引用UIWebView则即将无法通过苹果审核,提示信息如下

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.

对于Unity项目可以通过如下几个步骤排查:

  1. 检查自己项目Plugins目录下的native代码或静态库是否有引用UIWebView,源码文本文件可以比较容易检索出结果,而对于已编译好的静态库二进制文件,可以在Unity工程根目录下使用grep -r UIWebView .命令,如果有输出Binary file xxxxx matches则对应的二进制文件也极可能引用了UIWebView(不排除部分文件中的非字符串数据也恰好能匹配上,但概率很低)。如果是业务代码引用则替换升级为WKWebView;如果是三方库引用则更新到新版本即可。

  2. 检查自己项目使用的Unity版本,Untiy官方提到在PlatformDependent/iPhonePlayer/URLUtility.mm中引用了UIWebView,并在Unity 2017.4.32f1,2018.4.8f1,2019.2.4f1,2019.3.0b2和2020.1.0a2进行了修复,所以对于大版本使用Unity2017及以上的项目可以将Unity升级为最新的LTS版本来去掉UIWebView的引用。如果升级引擎代价过大或者项目使用的Unity5.6及之前版本,也可以重新编译URLUtility.mm并替换用于链接的Unity静态库中的目标文件URLUtility.o达到同样目的。

步骤2的具体操作如下(必须在MacOS构建机下):

  • 进入Unity打包链接的静态库目录/Applications/Unity.app/Contents/PlaybackEngines/iOSSupport/Trampoline/Libraries(PlaybackEngines文件夹有时也在Unity.app平级目录下),libiPhone-lib-il2cpp.a 即iOS构建时链接的Unity静态库(构建xcode工程时会被拷贝到Libraries目录并重命名为libiPhone-lib.a),所以我们只要修改该文件就能一劳永逸,而不需要每次构建xcode工程都重新修改,但是建议在修改前将该文件备份。

  • 使用命令otool -Vf libiPhone-lib-il2cpp.a查看该静态库支持armv7、armv7s(Unity5.6支持不完备)和arm64三种指令集架构,然后使用lipo工具将三种指令集架构单独分离

lipo libiPhone-lib-il2cpp.a -thin armv7 -output libiPhone-lib-il2cpp-armv7.a
lipo libiPhone-lib-il2cpp.a -thin armv7s -output libiPhone-lib-il2cpp-armv7s.a
lipo libiPhone-lib-il2cpp.a -thin arm64 -output libiPhone-lib-il2cpp-arm64.a
  • 新建一个不引用UIWebView的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];
}
  • 分别针对armv7arm64编译URLUtility.mm,使用ar工具移除前面生成的对应指令集架构的静态库文件中的URLUtility.o,然后使用ar工具将新编译的URLUtility.o重新打包进对应指令集架构的静态库文件。也可以只对arm64架构的进行替换,因为目前市面几乎已经没有不支持arm64的iOS设备,考虑到包体大小所以大部分项目Architectures都设置为仅支持arm64
clang++ -c URLUtility.mm -std=c++11 -stdlib=libc++ -arch armv7  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
ar -d libiPhone-lib-il2cpp-armv7.a URLUtility.o
ar -q libiPhone-lib-il2cpp-armv7.a URLUtility.o
clang++ -c URLUtility.mm -std=c++11 -stdlib=libc++ -arch arm64  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
ar -d libiPhone-lib-il2cpp-arm64.a URLUtility.o
ar -q libiPhone-lib-il2cpp-arm64.a URLUtility.o
  • 使用lipo工具重新合并各指令集架构的.a文件,然后删除临时文件,此时新生成的libiPhone-lib-il2cpp_new.a已经去掉对UIWebView的引用,最后将其重命名替换目录下的libiPhone-lib-il2cpp.a即可。
lipo -create -output libiPhone-lib-il2cpp_new.a libiPhone-lib-il2cpp-arm64.a libiPhone-lib-il2cpp-armv7s.a libiPhone-lib-il2cpp-armv7.a
rm libiPhone-lib-il2cpp-arm64.a libiPhone-lib-il2cpp-armv7s.a libiPhone-lib-il2cpp-armv7.a URLUtility.o

如果项目之前的版本有收到过苹果关于UIWebView的提示,建议下个版本修复时先提交ipa到iOS预审平台检查一下是否完全去除了UIWebView,然后再进行提审。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值