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

news/2024/7/20 21:06:12 标签: unity, ios, UIWebView

根据苹果应用商店的最新政策, 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,然后再进行提审。


http://www.niftyadmin.cn/n/763296.html

相关文章

CSAPP实验环境搭建

CSAPP配套了一系列很棒的lab&#xff0c;由于实验环境是unix&#xff0c;如果在Windows或MACOS环境下建议使用Docker的Linux容器来搭建csapp的实验环境。 下载lab lab下载地址&#xff1a;http://csapp.cs.cmu.edu/3e/labs.html&#xff0c;点击对应实验的Self-Study Handout即…

CSAPP实验-BombLab

bomblab是csapp的第二个配套实验&#xff0c;该实验提供了一个bomb二进制文件和一个bomb.c源文件&#xff0c;我们的目标是运行bomb并按照提示一步步输入字符串&#xff0c;直到完成整个拆炸弹的流程。但是源文件中只提供了部分代码&#xff0c;所以我们需要通过反汇编工具 obj…

CSAPP实验-AttackLab

csapp的attacklab配套实验&#xff0c;要求利用缓冲区溢出对指定可执行文件进行攻击&#xff0c;包括CI(Code Injection)攻击和ROP(Return-Oriented Programming)攻击两种方式 概览 在writeup已经中给出了详细的目标和实验流程&#xff0c;首先给出了一个有漏洞的函数getbuf:…

CSAPP实验-CacheLab

cachelab是csapp的配套实验之一&#xff0c;该实验分为A、B两个部分&#xff0c;A部分要求实现一个cache模拟器&#xff0c;B部分是实现一个针对cache优化的矩阵转置函数 Part A Part A部分我们需要完成csim.c源文件&#xff0c;参考csim-ref程序接收相同的命令行参数并产生相…

XCode工程设置

Project设置 针对整个Project的设置&#xff0c;分为Info和BuildSetting两个页签&#xff0c;其中有部分设置会被Target所继承或修改。注意&#xff1a;Project的Building Settings中已有的设置如果在Target中重新设置&#xff0c;那么Project的设置会被覆盖&#xff0c;只有当…

CSAPP实验-ShellLab

shell-lab是csapp的配套实验之一&#xff0c;它要求我们实现一个功能和unix shell类似的tiny shell&#xff0c;在源文件tsh.c中已给出了基本框架&#xff0c;剩下的只需要完成实现指定的函数即可&#xff0c;该实验对应csapp的第8章内容。 Unix Shell Shell可以认为是一个可…

Unity Shader实现标准Phong光照模型

Unity Shader实现标准Phong模型&#xff0c;可以控制如下选项 逐像素/顶点光照镜面反射开关漫反射开关环境光开关自发光开关纹理贴图镜面反射颜色光泽度漫反射颜色自发光颜色使用Blinn-Phong 代码如下&#xff1a; Shader "Custom/Phong" {Properties{_Specular(&…

浅谈《守望先锋》中的 ECS 构架

转自云风的BLOG: https://blog.codingnow.com/2017/06/overwatch_ecs.html 今天读了一篇 《守望先锋》架构设计与网络同步 。这是根据 GDC 2017 上的演讲 Overwatch Gameplay Architecture and Netcode 视频翻译而来的&#xff0c;所以并没有原文。由于是个一小时的演讲&#…