Unity iOS打包发布流程

Posted -九月新辰-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity iOS打包发布流程相关的知识,希望对你有一定的参考价值。

一、版本说明

  • Unity 2020.3.33f
  • MacOS Monterey 12.3.1
  • XCode 13.4.1

二、开发者账号

苹果开发者平台 https://developer.apple.com/

类型用途限制费用
个人开发者账号用于个人开发者进行开发和向AppStore上传应用只能有一个开发者,调试设备受限$99
公司开发者账号用于公司或团队进行开发和向AppStore上传应用可以有多个开发者,调试设备受限,将个人开发者邀请到团队中来$99
企业开发者账号用于企业内部发布,不需要审核,但是不能将应用发布到AppStore任何设备都可以通过苹果OTA方式进行安装$290

三、证书

【1】创建证书签名文件(CSR)

【2】在线申请证书

证书是对电脑开发资格的认证,需要在电脑上安装证书才能正常打包,每个开发者帐号有一套,分为两种:

  1. Developer Certification(开发证书):用于开发测试;
  2. Distribution Certification(发布证书):用于打包测试ipa或者Appstore的安装包;

【3】关联签名文件,并下载证书双击使用

【4】导出p12文件,供其他电脑使用

在钥匙串中,找到我的证书


四、APPID相关(用于后续出包)

苹果开发者平台 https://developer.apple.com/

【1】Identifiers(BoundID)

和unity中的Identifiers保持一致

【2】Devices(添加测试设备UDID)

获取设备的udid
第一种直接在XCode中查看
第二种通过蒲公英等工具获取,https://www.pgyer.com/tools/udid?sl=WrUS

【3】Profiles(与证书配套使用的描述文件)

填写对应的appid
下载下来,后面打包发布会用到,文件后缀为mobileprovision
主要有 devreleasehoc几种版本

五、Unity打包ios相关

【1】注意事项

  • 需要添加icon图,不然xcode出包会报错
  • Build 如果在版本号不变的情况下,每次打包需要递增
  • Scripting Backend IL2CPP
  • 相机、麦克风、定位等如果使用到的权限需要添加描述
  • ios最低版本号要求
  • Architecture(架构) 需要设置为ARM64

【2】通过c#修改XCode项目配置(可跳过)

//打包后调用
[PostProcessBuild]
static void OnBuildFinish(BuildTarget target, string buildPath)

    if (target == BuildTarget.iOS)
    
        SetXCodePro(buildPath);
    
    Debug.Log("打包完成!");

static void SetXCodePro(string buildPath)

    PBXProject project = new PBXProject();
    project.ReadFromString(File.ReadAllText(PBXProject.GetPBXProjectPath(buildPath)));
    string targetGuid = project.GetUnityMainTargetGuid();
    //添加库
    //project.AddFrameworkToProject(targetGuid,"ARKit.framework",false);
    //添加权限
    PlistDocument plist = new PlistDocument();
    plist.ReadFromString(File.ReadAllText(Path.Combine(buildPath, "Info.plist")));
    plist.root.SetString("NSCameraUsageDescription", "APP需要您的同意,才能使用摄像头,以便于相机拍摄,检测现场环境");
    plist.root.SetString("NSMicrophoneUsageDescription", "APP需要您的同意,才能使用麦克风,以便于视频录制、语音识别、语音聊天");
    //缺少合规证明
    plist.root.SetBoolean("ITSAppUsesNonExemptEncryption", false);
    //URL Schemes
    var urlTypeArray = plist.root.CreateArray("CFBundleURLTypes");
    var urlTypeDict = urlTypeArray.AddDict();
    urlTypeDict.SetString("CFBundleTypeRole", "Editor");
    urlTypeDict.SetString("CFBundleURLName", "com.pisx.cy");
    var urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");
    urlScheme.AddString("cy"); //scheme
    
    plist.WriteToFile(Path.Combine(buildPath, "Info.plist"));
    //设置签名证书
    project.SetBuildProperty(targetGuid, "CODE_SIGN_IDENTITY", "Apple Development: xin yang (V6P37FUD2P)");
    //project.SetBuildProperty(targetGuid, "PROVISIONING_PROFILE_SPECIFIER", "");
    project.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");
    
    project.WriteToFile(PBXProject.GetPBXProjectPath(buildPath));
    

Xcode属性查看
在xcode工程所在目录右键->在终端中打开->输入命令xcodebuild -showBuildSettings能看到所有的属性名。

【3】打包结构图

  • .xcodeproj xcode工程文件
  • info.plist 权限配置文件
  • MapFileParser.sh 授权解析,终端命令, chmod +x 该文件路径

六、Xcode打包

【1】将unity打包好的xcode工程用Xcode打开

【2】登录自己的开发者账号

Xcode>Preferences>Accounts

【3】配置签名


【4】bitcode

需要设置为No,否则发布时编译会无法通过

【5】权限操作

用2019等较低的Unity版本打的包,需要勾选
File>ProjectSetting>Do not show a diagnostic…

文件读取授权,在终端窗口输入
chmod +x MapFileParser.sh文件的完整路径

【6】打包

测试包(Debug):用usb连接iPhone手机,选择该设备,点击Build
正式包(Release):Product > Archive,等待构建成功后,依次点击上传发布

提示:选中Xcode然后 状态栏Window - >Organizer就可以看到所有的Archive版本啦!

七、发布

前往苹果开发者平台的app store页面,新建App

【1】TestFlight

  • 审核时间较短、一般用于内部测试
  • 可以生成公开链接(兑换码)的形式,在iPhone的TestFlight中下载应用进行试用(90天),这样外部人员也可以使用了。
  • 填写测试信息

【2】AppStore

  • 审核时间长、较为严格、上架AppSrore,其他人可以进行下载
  • 需要填写详细的发布信息

【3】Hoc 用于内测,直接发布ipa

八、参考链接

证书与文件配置:
https://zhuanlan.zhihu.com/p/208896244
打包视频教程:
https://www.bilibili.com/video/BV1Qt4y1a7aW?p=12&vd_source=226406b39053c6ed9e7307c51d05c436

九、Error合集

xxx.framework was build for iOS+iOS Simulator
项目 -> Build Settings -> Build Options -> Validate Workspace = Yes

no space left on devices
没有剩余空间,删除一些本地文件,留出内存

ERROR ITMS-90087: “Unsupported Architectures. The executable for XXX.app/Frameworks/XXXBLE.framework contains unsupported architectures ‘[x86_64]’.”
appstore不支持当前framework的架构,里面有不支持的静态库(framework)

$ lipo -info workspacePath/XXX.framework/XXX

命令来检查一下frame。
解决方法是生成binary的时候使用一段script来去掉那些不支持的结构。
在Xcode中选择项目->targets->Build Phases, 找到 Run Script。
Shell填入:/bin/sh

APP_PATH="$TARGET_BUILD_DIR/$WRAPPER_NAME"

    # This script loops through the frameworks embedded in the application and

    # removes unused architectures.

    #find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
    find "$APP_PATH" -name 'AgoraRtcWrapper.framework' -type d | while read -r FRAMEWORK

do

FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)

    FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"

    echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

    EXTRACTED_ARCHS=()

    for ARCH in $ARCHS

do

echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"

    lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"

    EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")

    done

echo "Merging extracted architectures: $ARCHS"

    lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "$EXTRACTED_ARCHS[@]"

    rm "$EXTRACTED_ARCHS[@]"

    echo "Replacing original executable with thinned version"

    rm "$FRAMEWORK_EXECUTABLE_PATH"

    mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

    done

ERROR ITMS-90085: “No architectures in the binary. Lipo failed to detect any architectures in the bundle executable.”
这样的话需要修改一个地方就可以了,因为不是全部的sdk 都需要,只修改对应的就可以了。

原来:"$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK 
更换后:"$APP_PATH" -name '[frameworkname].framework' -type d | while read -r 

Unity3D发布打包系列之——IOS打包发布

首先,Unity打包IOS必须条件:

Unity3D下载了IOS平台
下载了XCode软件(必须是MacOS 系统)
在苹果开发者中心注册了开发者帐号


第一步:注册苹果开发者帐号;

Unity3D下载IOS平台和XCode下载就不介绍了,直接开始开发者帐号申请
注意:帐号是收费的,一个是个人版或者公司版,一个是企业版(了解到APPLE的政策是,要发布到APP STORE必须用99美元的个人版或公司版Apple Developer Programs,要在非商店外下载只能使用299美元的企业版iOS Developer Enterprise)

注册地址:https://developer.apple.com/membercenter/index.action

注册前准备:

  • 2个邮箱(299美元的必须是公司域名邮箱)
  • 邓白氏编码DUNS

注册流程:
注册APPLE ID → 注册邓白氏编码 → 获取邓白氏编码后继续验证APPLE ID的公司信息 → 等待APPLE官方审核资料 → 审核通过,缴费 → 收工

关于邓白氏编码

  • 一个邓白氏编码可以注册多个APPLE 开发者账号
  • 通过APPLE的链接申请邓白氏编码,基本上一周左右就可获得。其中邓白氏那边会打电话给你核实身份,然后发邮件给你要补充公司信息,这个公司信息到时候APPLE验证DUNS编码时会用到,两边最好一致,否则修改麻烦。
  • 新的邓白氏编码,请注意尝试次数不要超过3次,超过次数编码会被锁住,解锁及注册方面问题请找苹果客服

第二步:注册完成后

  1. 登录开发者账号
    技术图片
  2. 下载开发者证书(开发者证书(分为开发和发布两种,类型为iOS Development,ios Distribution),这个是最基础的,不论是真机调试,还是上传到appstore都是需要的,是一个基证书,用来证明自己开发者身份的)
    技术图片

注意一下几点:

  • appID,这是每一个应用的独立标识,在设置项中可以配置该应用的权限,比如是否用到了PassBook,GameCenter,以及更常见的push服务,如果选中了push服务,那么就可以创建生成下面第3条所提到的推送证书,所以,在所有和推送相关的配置中,首先要做的就是先开通支持推送服务的appID;
  • 推送证书(分为开发和发布两种,类型分别为APNs Development ios,APNs Distribution ios),该证书在appID配置中创建生成,和开发者证书一样,安装到开发电脑上;
  • Provisioning Profiles,这个东西是很有苹果特色的一个东西,我一般称之为PP文件,该文件将appID,开发者证书,硬件Device绑定到一块儿,在开发者中心配置好后可以添加到Xcode上,也可以直接在Xcode上连接开发者中心生成,真机调试时需要在PP文件中添加真机的udid;是真机调试和必架必备之珍品;
  • 平常我们的制作流程一般都是按以上序列进行,先利用开发者帐号登陆开发者中心,创建开发者证书,appID,在appID中开通推送服务,在开通推送服务的选项下面创建推送证书(服务器端的推送证书见下文),之后在PP文件中绑定所有的证书id,添加调试真机等;


*CRS文件创建:
技术图片
或者
技术图片
进入
技术图片
CRS文件已经生成好了

3.进入开发者设置界面
技术图片
* certificates(证书)

选中All,接着点击右上角的加号,我们先来创建开发者(真机调试)证书,提交证书和调试证书创建步骤几乎一样
技术图片
这里我们Development类型证书,(用于真机调试)。选中之后进入下一个页面:
技术图片
这里会提示你选择创建好的CRS文件,选择上面创建好的CRS文件,点击continue提交,就生成证书
技术图片
下载下来保存到你对应得文件夹就好了,暂且不要双击安装,后面会讲解安装证书和配置文件
注意:证书最好不要创建多个,不易于管理

* identifiers(App ID)

配置App的Bundle ID,就是和XCode中对应的那个Bundle ID, 点击左边的视图identifiers下面的App IDs
技术图片
点击标记2,添加AppID,设置AppID名称
技术图片
设置Bundle ID
技术图片
生成Bundle ID 的设置
技术图片
App ID创建好之后,不需要去动它,也会在后面用到

* Devices(设备ID)**

添加你要真机调试的设备ID
技术图片
设置手机名称和UDID,UDID获取通过手机连接电脑,打开iTunes软件,点击序列号字母处,显示的就是UDID
技术图片

* profiles(配置文件)**

配置证书的最后一步,生成profiles,这个profiles其实最终是安装到Xcode里的,它关联证书、App ID、和Device ID,把前三者结合起来,生成一个可安装的配置文件,用于Xcode进行真机调试,用于发布应用也一样,在进行App打包生成ipa文件时,也会去验证你的证书和profiles,这也是你能否打包成功的关键。
点击第四个模块(profiles)下面的All选项,创建profiles:
技术图片
技术图片
技术图片
技术图片
技术图片
开发者证书的配置完成。

注意:最终配置完成后只需下载两个文件:一个就是第一个模块里面的开发者真机调试证书、然后就是第四个模块里的profiles文件,把这两个文件下载下来,保存好避免遗失,以便接下来在Xcode中配置和使用。(PS 放好这两个文件,记住他们的位置)


Run in Xcode

第三步:Unity打包;
切换到IOS平台,进行设置
技术图片

  • Run in Xcode:选择你电脑上安装的Xcode版本,或者默认Latest version,默认是你电脑上 最新版本
  • Run in Xcode as:选择Debug或者Release版本;PS:和最后Xcode打包时选择保持一致

点击Player Settings ->Other settings 设置

  • 包名设置:和安卓设置方法一样,格式:com.公司名.工程名。设置版本号
  • 设备型号设置:设置只能iPhone用还是iPad用或者两个都能用,以及设备最低的系统版本设置
  • 设置其他你需要的设置
    技术图片
    最后,点击Build进行打包,设置包文件夹名,保存


第四步:用你打包时候选的Xcode版本打开你刚才Build的包
其实,Xcode已经帮我们做了很多配置,只需要我们设置以下配置:
1.点击 Product->Scheme->Edit Scheme 或者进入下面界面,并点击Archive,确保Build Configuration 为 你在Unity中的选择保持一致
技术图片
技术图片

  • Display Name:设置你的App名字
  • Bundle Identifier:设置Build ID,来自你在注册苹果开发者帐号时Bundle ID保持一致。
  • Version:App版本(与Unity设置保持一致)
  • Build:版本号(与Unity设置保持一致)

2.TARGETS->Identity->Team Team选择你注册时对应的App ID 帐号。
技术图片

PS:可以不用选择注册相应证书时对应的 Apple ID 帐号,而且选择别的对应/非对应帐号也都没问题。

3.TARGETS->Build Setting->Code Signing
技术图片
基本不用设置,默认配置好的,如有需要可更改设置
其中下方的 Provisioning Profile 可以使用默认的 Automatic,也可以指定对应的描述文件。(一般我们使用Automatic)
注意:如果用USB将手机连接到电脑,手机端打开开发者模式,选择连接的手机,直接点击Xcode运行,就会打包到你连接的手机上,后续步骤可省略。




4.Archive设置;只能选择iOS Device,选择其他模拟器是不能Archive的
技术图片
等会,Archive会弹出
技术图片
5.Export 导出;点击上图中的“Export”,如下所示,很显然第一个选项是发布app的,不要点,那是个人开发者账号可以干的事情。

技术图片
上图四种选项:

  • Save for iOS App Store Deployment:保存到本地 准备上传App Store 或者在越狱的iOS设备上使用
  • Save for Ad Hoc Deployment:保存到本地 准备在账号添加的可使用设备上使用(具体为在开发者账户下添加可用设备的udid),该app包是发布证书编译的(The app will be code signed with the distribution certificate.)
  • Save for Enterprise Deployment:这种主要针对企业级账户下 准备本地服务器分发的app
  • Save for Development Deployment:针对内部测试使用,主要给开发者的设备(具体也为在开发者账户下添加可用设备的udid)。该app包是开发证书编译的(The app will be code signed with your development certificate)

点击Next,继续,选择存放路径,继续
技术图片
点击Next,IPA就打包成功了。


附:app需要使用手机的某些功能或者应用的时候,需要授权才可以访问,下面将展示一些info.plist上常用的一些授权。
技术图片
bool类型是YES的,这个是允许访问http的网址

下面是以上授权的代码形式,可以直接拷贝到info.plist文件中:

<key>NSAppTransportSecurity</key> 
<dict> 
<key>NSAllowsArbitraryLoads</key> 
<true/> 
</dict> 
<key>NSContactsUsageDescription</key> 
<string>请求访问通讯录</string> 
<key>NSMicrophoneUsageDescription</key> 
<string>请求访问麦克风</string> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>请求访问相册</string> 
<key>NSCameraUsageDescription</key> 
<string>请求访问相机</string> 
<key>NSLocationAlwaysUsageDescription</key> 
<string>始终访问地理位置</string> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string>在使用期间访问地理位置</string> 
<key>NSCalendarsUsageDescription</key> 
<string>请求访问日历</string> 
<key>NSRemindersUsageDescription</key> 
<string>请求访问注意事项</string> 
<key>NSBluetoothPeripheralUsageDescription</key> 
<string>请求访问蓝牙</string> 
<key>ITSAppUsesNonExemptEncryption</key><false/> 

注:至于TestFlight测试和上线,后续再介绍。

以上是关于Unity iOS打包发布流程的主要内容,如果未能解决你的问题,请参考以下文章

Unity3d发布IOS(包含u3d自带IAP内购)的流程-小白篇-Xcode配置发布部分

小松教你手游开发unity实用技能unity ios快捷打包

unity windows如何打包ios

Unity3D发布打包系列之——IOS打包发布

Unity3D发布打包系列之——IOS打包发布

Unity3D发布打包系列之——IOS真机调试打包ipa(补充)