Unity 打包iOS 删除 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.

但是项目内并未使用 UIWebView API,尝试使用 Unity 构建一个空工程上传到 TestFlight 或者 QuickSDK
进行预先检查,发现依然存在 UIWebView API 调用。

搜索后发现 Unity 已在 2017.4, 2018.4, 2019.2, 2019.3, 2020.1 中修复,但是旧版本如 Unity 5.6 就不管了:

Unity Issue Tracker – [iOS] Apple throws Deprecated API Usage warning for using UIWebView when submitting Builds to the App Store Connect

环境
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/

Unity 是一款广泛用于游戏开发的跨平台引擎,它支持多种操作系统和设备,包括 iOS苹果的移动操作系统)。而 com.ptc.vuforia.engine 则是 Unity 中用来支持增强现实(AR)功能的一个插件。 在 Unity打包 iOS 平台,我们首先需要确保已经安装了适用于 iOS 的开发环境及相关证书。然后,在 Unity 中进行以下步骤来进行打包: 1. 首先,选择菜单栏中的 File(文件)--> Build Settings(构建设置)打开构建设置窗口。 2. 在构建设置窗口中,选择 iOS 平台,并点击 Switch Platform(切换平台)按钮。Unity 将会重新编译项目以适应 iOS 平台。 3. 然后,点击 Player Settings(播放器设置)按钮,打开 Player Settings 窗口。 4. 在 Player Settings 窗口中,我们需要设置一些 iOS 相关的选项,包括应用程序的图标、权限、名称等。 5. 在设置完成后,点击 Build(构建)按钮,选择一个目录来保存生成的 Xcode 项目。 6. Unity 将会自动导出 Xcode 项目文件,我们可以使用 Xcode 来进一步修改和打包应用程序。 7. 打开导出的 Xcode 项目,在 Xcode 中选择合适的开发证书和设备,然后进行编译和打包。 8. 最终,我们将得到一个用来在 iOS 设备上安装和运行的应用程序。 需要注意的是,如果项目中使用了 com.ptc.vuforia.engine 这个插件来支持 AR 功能,我们需要确保该插件已经正确导入到 Unity 项目中,并且在打包 iOS 时也包含了相关的资源文件和设置。 总而言之,Unity 提供了便捷的打包方式来将游戏或应用程序导出到 iOS 平台,并且通过 com.ptc.vuforia.engine 这个插件,我们可以进一步增强应用程序的功能,实现更出色的游戏体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TxNet.Ltd.

你的赞同是对我的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值