草庐IT

Unity iOS打包发布流程

-九月新辰- 2023-08-02 原文

一、版本说明

  • 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 

有关Unity iOS打包发布流程的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  3. ruby-on-rails - 获取 ActionController::RoutingError(当尝试使用 AngularJS 将数据发布到 Rails 服务器时,没有路由匹配 [OPTIONS] "/users" - 2

    尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg

  4. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  5. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  6. ruby - 如何打包 Ruby 应用程序? - 2

    我有一个使用Qt4绑定(bind)的Ruby应用程序。我希望能够打包并发布它。我查看了其他应用程序,例如rake和puppet,以了解它们是如何打包的。rake和puppet都被打包为gems。当我意识到rake和puppet都是更多的系统级工具而不是用户级应用程序时,我开始走这条路。我也看过orca,但它只是windows。除了gem或orca,是否还有其他选项可用于打包RubyGUI应用程序?我想要跨平台的东西。 最佳答案 看看platformgem规范。您可以为您的代码支持的每个平台打包一个gem。Somegemsconsis

  7. ruby - 如何在 Ruby 中从内存中 HTTP 发布流数据? - 2

    我想上传我在运行时用Ruby生成的数据,就像从block中提供上传数据一样。我找到的所有示例仅展示了如何流式传输必须在请求之前位于磁盘上的文件,但我不想缓冲该文件。除了滚动我自己的套接字连接之外,最好的解决方案是什么?这是一个伪代码示例:post_stream('127.0.0.1','/stream/')do|body|generate_xmldo|segment|body 最佳答案 有效的代码。require'thread'require'net/http'require'base64'require'openssl'class

  8. ruby - 打包的 Ruby 字符串中的奇怪行为 - 2

    我对某些ruby​​行为感到困惑。看下面的代码:[127].pack("C")=="\x7f"#=>true这是有道理的。现在:[128].pack("C")#=>"\x80""\x80"#=>"\x80"[128].pack("C")=="\x80"#=>falsepackoption"C"代表8-bitunsigned(unsignedchar),应该可以存储128的值。两个字符串也打印相同的东西,那么为什么它们不相等呢?这与编码有关吗?我使用的是ruby​​2.0.0p247。 最佳答案 这是错误的,因为编码不同:[128].

  9. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  10. Unity数据可视化图表插件XCharts3.0发布 - 2

    Unity数据可视化图表插件XCharts3.0发布历时8个多月,业余时间,断断续续,XCharts3.0总算发布了。如果要打个满意度,我给3.0版本来个80分。对于代码框架结构设计的调整改动,基本符合预期,甚是满意。相比之前的1.0和2.0版本,我认为3.0才是一个拿得出手给广大开发者使用的版本。1.0发布的时候,很兴奋,从0.1到1.0,也磨了一年,真的等不及想给大家试用了,还特地写过一篇文章以示庆祝。那个时候,1.0虽然还还不够完善,功能也不够丰富,但它是XCharts的开始,没有1.0,也就没有后面的2.0和3.0。后面的2.0发布,做了很多改进和优化,随着版本迭代,慢慢的发现有不少硬

随机推荐