介紹
蘋果在審覈拒約時給出了以下信息:
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.
但是項目內並未使用 UIWebView API,嘗試使用 Unity 構建一個空工程上傳到 TestFlight 或者 QuickSDK
進行預先檢查,發現依然存在 UIWebView API 調用。
搜索後發現 Unity 已在 2017.4, 2018.4, 2019.2, 2019.3, 2020.1 中修復,但是舊版本如 Unity 5.6 就不管了:
環境
Unity 2018.4.xf2
macOS 10.14.6
Xcode 11.0
解決方案
雖然 Unity 官方不準備在舊版本修復此 Bug,但是在問題描述中闡述了具體細節:在
PlatformDependent/iPhonePlayer/URLUtility.mm
中使用 UIWebView 處理遊戲內鏈接。
搜索後找到了一個現成的解決方案,經過測試後可用:
libiPhone-lib.a去掉WebViewController – 簡書
下面記錄一下實踐過程並補充一些相關信息。
保存源文件
首先將以下內容保存爲 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];
}
編譯
原文只使用了 arm64 架構,實際上通過 file 命令查看 libiPhone-lib.a
是三個架構:
$ file libiPhone-lib.a
libiPhone-lib.a: Mach-O universal binary with 3 architectures: [arm_v7:current ar archive] [arm_v7s]
libiPhone-lib.a (for architecture armv7): current ar archive
libiPhone-lib.a (for architecture arm64): current ar archive
libiPhone-lib.a (for architecture armv7s): current ar archive
因此在編譯時建議三種架構都編譯,否則在替換時會提示缺失符號問題。
clang -c URLUtility.mm -arch arm64 -arch armv7 -arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk
執行完當前目錄會生成 URLUtility.o
目標文件。
注意: -isysroot
指定的 SDK 路徑一定是當前工程使用的 Xcode 版本,特別是當機器上存在多個 Xcode 版本時要注意。
替換
首先要明確, libiPhone-lib.a
是一個存檔文件,內部保存了許多目標文件,可以使用ar命令顯示內容
ar -tv libiPhone-lib.a
刪除原有的 URLUtility.o
ar -d libiPhone-lib.a URLUtility.o
在文件最後增加 URLUtility.o
ar -q libiPhone-lib.a URLUtility.o
ar
命令的具體使用方法可以通過執行
man ar
查看。
如果libiPhone-lib.a中包含armv7,armv7s,arm64多個編譯平臺的庫的話,直接使用lipo -d 是刪除不掉URLUtility.o的,需要使用lipo命令拆開不同平臺的.a文件
lipo xx. a -thin armv7 -output xx_armv7.a
分別處理過後,在使用lipo命令合併
lipo -create xxxx.a yyyy.a -output zzzz.a
建議
可以將以上步驟放到構建流程裏,每次出包的時候自動將 Xcode 工程內的 libiPhone-lib.a
替換。
轉載:https://www.colabug.com/2020/0113/6839873/amp/