Unity-iOS工程导出Xcode自动构建方法

news2024/12/23 16:55:02

Unity-iOS发布基本流程首先在Unity中导出Xcode工程,然后在Xcode工程中设置IOS打包的一些流程,诸如引入lib、framework或其他资源、设置签名及其他编译设置、加入编译脚本等等操作。

这些操作如果每次都是在导出Xcode后手动操作,一来浪费时间,二来容易出错。目前主要有以下方法自动化设置Xcode工程:

  1. Unity在导出Xcode工程时通过PostProcessBuild回调设置Xcode工程设置
  2. 另一种方法就是通过ruby库xcodeproj来设置,这种方法就脱离了Unity项目,就是一种专门设置xcode工程的方式。

自动设置好Xcode工程后我们就可以使用xcodebuild命令自动构建Xcode工程,使用ExportOptions.plist配置自动发布ipa或者正式包的流程。通过这么一整套流程下来就可以实现Xcode的整体自动化打包流程。本篇文章主要讲讲Xcode工程自动化配置的部分,后面如果觉得有必要再讲讲导出ipa的流程。

Xcode工程项目配置文件

在讲自动构建之前,我们先简单过一遍Xcode工程项目配置文件。如果你的Unity项目通过CocoaPods引入SDK,我们就需要打开*.xcworkspace,这个文件中包含了两个xcodeproj

  1.  Unity-iPhone就是我们Unity导出的工程
  2. Pods就是我们使用pod install安装的pod工程

如果我们还有需要设置Pods工程设置的需求,比如说设置framework的签名或者其他的一些设置,使用Unity的回调就没办法实现了,pod安装是在unity导出xcode工程之后,只能在PodFile中生成Pod工程的时候设置或者使用xcodeproj这个ruby库统一设置。

*.xcodeproj中的*.pbxproj文件记录了所有我们的Xcode工程项目设置。你可以打开Unity-iPhone.xcodeproj下的project.pbxproj文件查看所有的工程项目设置。

pbxproj工程结构解析

Xcode读取rootObject值,获取project的uuid,从project开始解析整个项目配置。这个文件就很好理解,注释也很清晰,这个非常方便后期我们需要设置值时,只需要参照着做就行。

isa就相当于类型,我们可以方便的在xcodeproj中查询到修改的接口 

实现自动设置的通用方法

确定修改什么地方

自动构建的前提是能够手动配置构建,这样做能很方便的理解我们需要在什么地方配置自动构建信息,比如说我想在Build Phase中添加一个shell script,可以先在Xcode中手动添加,然后通过git对比工具很方便的看到修改内容。

 我们就可以很轻松的找到原来是PBXNativeTarget中buildPhases这个数组中添加了一个脚本对象。这种方法对于新手来说非常简单直接,药到病除

找到合适的工具(接口)来实现功能

使用xcodeproj

require "xcodeproj"
# @添加shell脚本
# 打开项目
project_path = "Unity-iPhone.xcodeproj"
# PBXProject
project = Xcodeproj::Project.open(project_path)
#@PBXNativeTarget
$pbx_native_target = project.targets[0]
build_phases = $pbx_native_target.build_phases
# 生成一个uuid
uuid = project.generate_uuid
puts "uuid===>" + uuid
# 设置脚本属性
script = Xcodeproj::Project::Object::PBXShellScriptBuildPhase.new(project,uuid)
script.name = "test shell"
script.shell_path = "/bin/sh"
script.shell_script = "ruby test.rb"
script.run_only_for_deployment_postprocessing = "0"
script.always_out_of_date = "1"
# 插入位置
build_phases.insert(3,script)
# 保存项目
project.save

 我们通过注释可以知道ShellScript类型是PBXShellScriptBuildPhase,我们就可以通过创建一个这个对象来添加shellscript,其次里面的值都可以通过我们手动设置后去设置

使用unity回调方式设置

通过PBXProject->AddShellScriptBuildPhase来添加脚本,但是这种方式设置没有使用ruby设置的内容多。因此如果可能也更推荐使用xcodeproj库来配置工程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ STL】-- 红黑树的插入实现

目录 红黑树的概念 二叉树搜索树的应用 红黑树节点的定义 红黑树结构 insert 需调整的多情况的核心思维: 需调整的多情况分类讲解: 情况一: 情况二: 情况三: 总结: 代码实现: 对于红黑树是否建立成功的检查 升序打印…

C++--类型转换--1128

1.C语言中的类型转换 分为隐式类型转化、显示强制类型转化。 隐式类型转化用于意义相近的类型,比如int,double,short都是表示数值的类型 int i1; double di; //编译、结果无问题 这里是隐式类型转换。 显示强制类型转换 显示强制类型用于意义不相近的类型&…

Redis Sentinel

高可用架构-Redis Sentinel Replication 缺点 接着之前的Redis Replication 主从复制架构,看似解决了主节点并发过大时,master节点处理繁忙的问题。将一部分读数据的请求交给从节点处理,从而将请求进行分散处理。但是该架构却存在很明显的缺…

基于LEACH的随机网络生成无线传感器网络路由协议的仿真比较(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【深度学习】超详细的 PyTorch 学习笔记(上)

文章目录一、PyTorch环境检查二、查看张量类型三、查看张量尺寸和所占内存大小四、创建张量4.1 创建值全为1的张量4.2 创建值全为0的张量4.3 创建值全为指定值的张量4.4 通过 list 创建张量4.5 通过 ndarray 创建张量4.6 创建指定范围和间距的有序张量4.7 创建单位矩阵&#xf…

【力扣算法简单五十题】23.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索…

基于多种优化算法及神经网络的光伏系统控制(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅本科计算机专业,研究生电气学硕…

NNDL 实验八 网络优化与正则化(3)不同优化算法比较

文章目录7.3 不同优化算法的比较分析7.3.1 优化算法的实验设定7.3.1.1 2D可视化实验7.3.1.2 简单拟合实验7.3.1.3 与Torch API对比,验证正确性7.3.2 学习率调整7.3.2.1 AdaGrad算法7.3.2.2 RMSprop算法7.3.3 梯度估计修正7.3.3.1 动量法7.3.3.2 Adam算法7.3.4 不同优…

【并发】深度解析CAS原理与底层源码

【并发】深度解析CAS原理与底层源码 什么是 CAS? CAS全称是(Compare And Swap,比较并交换),通常指的是这样一种原子操作(针对一个变量,首先比较它的内存值与某个期望值是否相同,如…

不就是Redis吗?竟让我一个月拿了8个offer,其中两家都是一线大厂

在高并发的场景Redis是必须的,而 Redis非关系型内存存储不可谓不彪悍。 支持异步持久化达到容灾:速度快、并发高。官方号称支持并发11万读操作,并发8万写操作。惊了吗? 支持数据结构丰富:string(字符串&a…

盘点5种最频繁使用的检测异常值的方法(附Python代码)

本文介绍了数据科学家必备的五种检测异常值的方法。 无论是通过识别错误还是主动预防,检测异常值对任何业务都是重要的。本文将讨论五种检测异常值的方法。 文章目录什么是异常值?为什么我们要关注异常值?技术提升方法1——标准差方法2——箱…

【OpenEnergyMonitor】开源的能源监控系统--项目介绍

OpenEnergyMonitor1. 系统框架2.项目组成2.1 emonPi模块:2.1.1 emonpi的安装:2.1.2 emonTx & emonBase 安装2.1.3 emonTx Wifi 安装:2.1.4 添加额外的 emonTx 节点:2.1.5 添加额外的emonTx-节点监控三项电源2.1.6 添加 emonTH 温度节点2.…

【Vue核心】8.计算属性

1. 定义: 要用的属性不存在,要通过已有属性计算得来。 2. 原理 底层借助了objcet.defineproperty方法提供的getter fllsetter. 3. get两数什么时候执行? (1),初次读取时会执行一次。 (2),当依赖的数据发生改变时会被再次调用。 4. 优势 与methods实现相比,内部有缓存机…

进厂手册:Git 学习笔记(详解命令)

文章目录git 对象通过git对象进行文件的保存git对象的缺点树对象构建树对象提交对象高层命令工作区的文件状态git reset hard 咋用以及用错了怎么恢复git checkout vs git resetGit存储后悔药工作区暂存区版本库reset三部曲checkout深入理解tag远程上的相关操作ssh登入一些个人…

[附源码]计算机毕业设计家庭整理服务管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

LeetCode刷题复盘笔记—一文搞懂动态规划之213. 打家劫舍 II问题(动态规划系列第十八篇)

今日主要总结一下动态规划完全背包的一道题目,213. 打家劫舍 II 题目:213. 打家劫舍 II Leetcode题目地址 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一…

快速排序详解

快速排序,简称快排。其实看快速排序的名字就知道它肯定是一个很牛的排序,C语言中的qsort和C中的sort底层都是快排。 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法…

Opencv 基本操作五 各种连通域处理方法

在深度学习中,尤其是语义分割模型部署的结果后处理中,离不开各类形态学处理方法,其中以连通域处理为主;同时在一些传统的图像处理算法中,也需要一些形态学、连通域处理方法。为此,整理了一些常用的连通域处…

leetcode每日一题寒假版:1691. 堆叠长方体的最大高度 (hard)( 换了皮的最长递增子序列)

2022-12-10 1691. 堆叠长方体的最大高度 (hard) 🚩 学如逆水行舟,不进则退。 —— 《增广贤文》 题目描述: 给你 n 个长方体 cuboids ,其中第 i 个长方体的长宽高表示为 cuboids[i] [width(i), length(i), height(i)]&#xf…

Docker补充知识点--自定义网络实现直连容器

前面介绍docker镜像的秘密这篇知识点的时候,https://blog.csdn.net/dudadudadd/article/details/128200522,提到了docker容器也有属于自己的IP的概念,默认的Docker容器是采用的是bridge网络模式。并且提到了一嘴自定义网卡配置,本…