0%

关于Unity工程提包警告提示UIWebView 的解决方案


前言


最近提审新项目时,构建包传到 iTunes Connect 后台后总是无法处理成功,Apple 邮件给出以下反馈:

1
2
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.

由于早期已经将项目中的 UIWevView 全部替换为了 WKWebView ,于是推测可能是其他的第三方库里用到了 UIWevView ,所以逐个第三方的排查、升级SDK,最终还是无法解决问题。

于是推测可能是 Unity 框架中使用到了 UIWevView,于是用了以下命令扫描工程目录下的相关文件:

1
grep -r UIWebView .

扫描的结果是:

1
Binary file ./Libraries/libiPhone-lib.a matches

发现 libiPhone-lib.a 中引用了 UIWebView

解决方案


通过查找资料了解到,虽然 Unity 官方不准备在旧版本修复此问题,但是在问题描述中阐述了具体细节:在 PlatformDependent/iPhonePlayer/URLUtility.mm 中使用 UIWebView 处理游戏内链接。

因此,目前有两种解决方案:

  1. 升级Unity引擎
  2. 去掉 libiPhone-lib.a 中的 UIWebView 引用

Unity 已经在部分新版本中修复了这个问题,通过查阅 Release Notes 可以看到说明,但是升级游戏引擎的工作量比较大,所以没有被我们选为首选方案。

处理过程


1.创建URLUtility.mm

新建文件 URLUtility.mm,并写入下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#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];
}
}

2.查看 libiPhone-lib.a 架构

用以下命令查看:

1
file libiPhone-lib.a

结果如下:

1
2
3
4
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

可以得出,有三种架构:armv7、arm64、armv7s。
因此在编译时建议三种架构都编译,否则在替换时会提示缺失符号问题。

3.构建URLUtility.o

使用以下命令构建:

1
2
3
4
5
6
7
8
# arm64 架构
clang -c URLUtility.mm -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./arm64/URLUtility.o

# armv7 架构
clang -c URLUtility.mm -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./armv7/URLUtility.o

# armv7s 架构
clang -c URLUtility.mm -arch armv7s -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk -o ./armv7s/URLUtility.o

注意:-isysroot

指定的 SDK 路径一定是当前工程使用的 Xcode 版本,特别是当机器上存在多个 Xcode 版本时要注意。

4.拆分 libiPhone-lib.a

使用以下命令:

1
2
3
4
5
6
7
8
# arm64 架构
lipo libiPhone-lib.a -thin arm64 -output ./arm64/libiPhone-lib.a

# armv7 架构
lipo libiPhone-lib.a -thin armv7 -output ./armv7/libiPhone-lib.a

# armv7s 架构
lipo libiPhone-lib.a -thin armv7s -output ./armv7s/libiPhone-lib.a

5.替换各个架构下的 libiPhone-lib.a 中的 URLUtility.o

使用以下命令:

1
2
3
4
5
6
7
8
9
10
11
# arm64 架构
ar -d ./arm64/libiPhone-lib.a URLUtility.o
ar -q ./arm64/libiPhone-lib.a ./arm64/URLUtility.o

# armv7 架构
ar -d ./armv7/libiPhone-lib.a URLUtility.o
ar -q ./armv7/libiPhone-lib.a ./armv7/URLUtility.o

# armv7s 架构
ar -d ./armv7s/libiPhone-lib.a URLUtility.o
ar -q ./armv7s/libiPhone-lib.a ./armv7s/URLUtility.o

6.合并 libiPhone-lib.a

使用以下命令:

1
lipo -create ./arm64/libiPhone-lib.a ./armv7/libiPhone-lib.a ./armv7s/libiPhone-lib.a -output libiPhone-lib.a

7.检查 libiPhone-lib.a

用以下命令检查新生成的 libiPhone-lib.a 文件:

1
grep -r UIWebView .

没有任何输出表示当前的文件中已经没有了 UIWebView 引用。

尾声


做完上述操作,将新的 libiPhone-lib.a 替换原工程的 libiPhone-lib.a ,再次提包,构建包成功处理完成。

上述过程已经写成了脚本,有需要的朋友可以自取。

传送门:
libiPhone-lib.sh