前言
有一段時間沒更新文章了,最近幾天忙著IOS sdk接入提審過審工作,此文記錄一次提審被拒的棘手問題,我不以專業的IOS開發者,來記錄最有效的解決方案。
拒審問題描述
這幾天提審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 .
進入工程文件夾,輸入如上命令,可知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 的地方
參考文章
https://fusugz.github.io/2020/05/14/unity-uiwebview/
結尾
做最真實的分享,感謝大家的支持,如果疑惑評論區見,如果文章對你有幫助,留下的贊。