前言
有一段时间没更新文章了,最近几天忙着IOS sdk接入提审过审工作,此文记录一次提审被拒的棘手问题,我不以专业的IOS开发者,来记录最有效的解决方案。
GIF.gif拒审问题描述
这几天提审ipa包,被拒审,内容如下 :
ITMS90809:
Deprecated API Usage - New apps that use UIWebView are no longer accepted.
Instead,use WKWebView for improved security and reliability.
Learn more (https://developer.apple.com/documentation/uikit/uiwebview)
翻译过来:
不推荐使用这个API。新应用程序,不接受使用UIWebView
使用WKWebView可以提高安全性和可靠性。
更多了解需要参考苹果开发者链接
开发环境
-
Xcode 12.2
-
Unity 2018.2.0f2 破解版 (有UIWebView引用)
解决问题方案
IOS接入SDK中我并没有用到过UIWebView,SDK提供方也说没有用过。很好奇这东西怎么来的,于是乎,查了下Google搜索怎么查看工程是否引用到UIWebView这东西,命令如下(后面有一个点 ,一定要注意):
grep -r UIWebView .
终端命名展示.png
进入工程文件夹,输入如上命令,可知Libraries文件夹下的libiPhone-lib.a 中用到过UIWebView。提审的是一个游戏的应用,也就是用Unity导出Xcode工程 ,接入SDK完成 提审的流程。
libiPhone-lib.a是什么呢? libiPhone-lib.a 文件是 Unity Runtime 静态库。遇到不知道怎么处理的问题,Google搜索喽。Goolge上面的知识足够解决我们开发中80%问题。
在查阅文章的时候发现了国内的方法大同小异没什么区别,基于查阅的文章做三个解决方案(别人写好的东西),针对三个方案具体的实现,进行可行性分析,说说我是怎么解决UIWebView的问题。
方案 一 (无效)
思路就是剥离libiPhone-lib.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 * 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];
}
}
-
使用lipo查看libiPhone-lib.a文件中包含的架构
-
使用URLUtility.mm生成对应架构下URLUtility.o文件
-
分离libiPhone-lib.a中各架构文件
-
移除对应架构中的原有URLUtility.o文件
-
将新生成的URLUtility.o文件添加到对应架构的.a中
-
将各架构的.a文件合并生成新的libiPhone-lib.a
因为这个方案无效,我只展示思路和逻辑,要是有兴趣的可以看下参考文章标题去链接里看
方案 二(无效)
思路跟方案一没区别,为什么说没区别呢,就是上面步骤 用Python脚本自动化处理了,方案一无效 同理方案二依旧是无效的
方案 三(亲测有效)
升级Unity版本。这思路也是网上找的,我就是做了具体的实践操作。题外话,关于Unity常识性知识,假如我们是在2018版本的Unity进行开发程序,那在2019的Unity是运行不起来的 ,除非是大改代码。(向下不兼容,这一点很蛋疼)
2020年4月后,苹果提审ipa文件如包含UIWebView相关引用,会拒审核。因为我们用的Unity开发的,这个问题归根结底还是Unity的锅。Unity在最新的版本中修复了UIWebView相关引用。
当前我用的Unity2018版,官方的解释2019和2018部分版本修复了UIWebView相关引用(注意部分版本),这就蛋疼了。好多文章建议了18.xxx版本 ,我试过好起码2个版本都没效果。
一个个试不是高效方案,于是乎科学上网去国外的Unity官网查找版本更新日志,最后查到2018.4.10f1这个版本,经过下载实测没有问题。国内域名Unity官网下载2018.4.10f1没有试过。
就此问题解决,期间感谢黄亮大佬的技术支持。放几张截图 供参考,执行命令没有看到引用UIWebView 的地方
image.png image.png参考文章
https://fusugz.github.io/2020/05/14/unity-uiwebview/
结尾
做最真实的分享,感谢大家的支持,如果疑惑评论区见,如果文章对你有帮助,留下的赞。
网友评论