赞
踩
工作中是使用的是python脚本自动化打包IOS(unity导出成xcode工程,然后xcode工程再打包成ipa)。打包大概流程以及一些操作的功能将在第五部分中介绍。
先介绍在打包中涉及到证书,证书描述文件在第一和第三部分中介绍。
第二部分记录一些错误的解决方案。
第四部分介绍一些知识,比如app和ipa的区别。
目录
8.BundleDisplayName 安装的时候显示的名字 BundleName询问的时候使用的名字
2)xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
3)Fatal Error The Project is on case sensitive file system.......
4)[Unity] Couldn't set project path to: /Volumes/TOSHIBA
5)链接错误linker command failed with exit code 1
6)解锁钥匙串codesign failed with exit code 1
7)dyld: Symbol not found: _$s15_ObjectiveCTypes01_A11CBridgeablePTl
8)ld: library not found for -lstdc++.6.0.9
9) error: Provisioning profile "XXX" doesn't include signing certificate "XXX"
10)Xcode:Could not locate device support files
比较杂乱,就是一些值如何查看
证书的描述文件也就是 后缀是 .mobileprovision 的文件。
方法一:
到 存放路径 ~/Library/MobileDevice/Provisioning Profiles 中查看,这下面的都是已经安装到电脑上的证书的描述文件了。
比如xxxxxx.mobileprovision,其中 前面的那一长串数字xxxxx就是PROVISIONING_PROFILE的值。
方法二:
如果是没有安装到电脑上的证书,用命令行查看 security cms -D -i yyyyy.mobileprovision,找到其 uuid 字段值。
方法一:
mobileprovision 文件右键,显示简介可以看到所有的加入该设备ID
方法二:
同样是用命令行 security cms -D -i xxxx.mobileprovision
方法一:
mobileprovison文件中的右键简介中看到,CERTIFICATES中的Name即是.
方法二:
应用程序-》实用工具-》钥匙串,找到对应的证书,右键显示简介中的"常用名称"
如果描述文件中添加了新的设备,在mac机上双击以后, 在~/Library/MobileDevice/Provisioning Profiles 下会生成新的mobileprovision文件。
把设备连上Mac,打开iTunes
点击UDID可以切换看其他信息,需要复制,右键即可。
连上itools 显示更多。
连上xcode看。
蒲公英网站查询
1.直接用手机浏览器连一个网站 https://www.pgyer.com/udid
2.点击【获取udid】,会让你下载一个描述文件,点击【允许】以后,会跳到手机【设置】界面中的【描述文件】界面
3.点击安装“蒲公英描述文件”
4.安装好了会自动跳回到浏览器,显示手机设备的udid【这个发给我们就行了】
5.打开手机【设置】界面中的【描述文件】界面,把刚刚安装的描述文件删了即可。
(还可以使用蒲公英进行内测分发,不过需要软件著作权等资质文件,要不然过一会就会被下架不能下载了
内测分发:上传ipa进行,生成一个落地页,别人通过这个页面有个安装按钮就可以直接安装了)
方法一:
在终端输入“defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID”
方法二:
在应用程序-Xcode-右键显示包内容-info.plist里找到DVTPlugInCompatibilityUUID 对应的value
(其实就是执行上面那个命令行做的事情)
打开console终端,执行下列命令
lipo -info xxxx.a(静态库路径)
有一个软件veee+ 但是需要郭歪的appleid登陆
所以申请一个没曲的appleid,登陆,然后是没曲的applestore了
然后下载veee+,不过有一个小时的免费使用时间。
执行 mv xxx.ipa xxx.zip 转成zip包,然后解压,看包内容,里面的info.plist。
命令行:
- unzip xxx.zip
- cd Payload
- cd xxx.app
- open Info.plist
UnityGetGLViewController()
UnityGetGLView()
头文件:
#import "UnityAppController.h"
#import "UnityInterface.h"
苹果开发者工具不再支持svn,下载了苹果开发者工具也没有用了。
所以下载 安装Homebrew
使用他来安装svn:执行 brew install svn
which svn
where svn
svn --version
这一部分比较杂乱琐碎,记录一些遇到的错误。
升级了xcode以后需要把xcode的新的uuid,配置到unity中。
Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Unity4XC.xcplugin' not present in DVTPlugInCompatibilityUUIDs
解决办法:找到 /Applications/Unity/PlaybackEngines/iOSSupport/Tools/OSX/Unity4XC.xcplugin ,右键显示包内容-info.plist 在DVTPlugInCompatibilityUUIDs 中加入xcode的UUID。
升级了xcode以后,需要把旧的里面的一个PackageApplication拷贝到对应的路径中,新的xcode不提供这个了可能。
PackageApplication
解决办法:在其他xcode版本中找到 “PackageApplication”,并且copy到如下路径:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
并且执行命令:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication
unity工程所在的硬盘文件系统格式有问题。
工程所在的硬盘,格式化的时候设置的系统为大小写敏感了,需要改为大小写不敏感的文件系统。
mac上的unity处理不了大小写敏感的文件系统。
因为路径名带了空格了。
如果说找不到目录,看看是不是路径中文件夹的名字有带空格的,有的可能找不到
原来是设置的硬盘名字带空格 TOSHIBA XXX,所以修改一下硬盘名字。
如何查看具体的错误:
调用第三方静态库.a库中的中的函数,出现如下错误:
ld: symbol(s) not found for architecture arm64
解决办法:xcode工程,BuildSetting 下的 Architectures:
architectures:standard
validarchitecture:armv7 armv7s armv64
build的device选:Generic IOS Device
解决办法:导入库AuthenticationServices.framework,确保是xcode11编译才行
使用jenkins打版本的时候,出现如下错误:
- XX.app: errSecInternalComponent
- Command /usr/bin/codesign failed with exit code 1
- 或者
- Command CodeSign failed with a nonzero exit code
os.system("security unlock-keychain -p 123456") #jenkins调用脚本时需要先解锁钥匙串,123456为版本机钥匙串密码
钥匙串的登陆密码在 MacOS10.14版本中,无法修改密码,必须是和电脑登陆密码一致。(而在原来的MacOS10.12中是可以修改,可以不和开机密码一致的。)
所以在升级了系统以后,打包可能也会出现上述问题,需要修改“解锁钥匙串的登陆密码”。
xcode原来是10,后来升级了11, 然后正常跳出来同意协议,结果点Agree 没有反应,一直卡在Xcode And IOS SDK License Agreement,后来查到用命令行:
sudo xcodebuild -license
执行跳出上面这个错误
- dyld: Symbol not found: _$s15_ObjectiveCTypes01_A11CBridgeablePTl
- Referenced from: /Applications/Xcode.app/Contents/Developer/usr/bin/../../../SharedFrameworks/DVTFoundation.framework/Versions/A/DVTFoundation
- Expected in: /Applications/Xcode.app/Contents/Developer/usr/bin/../../../Frameworks/libswiftCore.dylib
- in /Applications/Xcode.app/Contents/Developer/usr/bin/../../../SharedFrameworks/DVTFoundation.framework/Versions/A/DVTFoundation
- Abort trap: 6
后来找了 [iOS]Xcode "dyld: Symbol not found: _$s15_ObjectiveCTypes01_A11CBridgeablePTl" 问题解决过程记录 - 简书 这个文章一样的问题,看到最后就是先直接卸载了现有的xcode,重新装了。
记录一下有用的东西:
这个命令用来输出或者改变活跃的开发者目录的路径,而这个路径控制着哪个工具会被用于Xcode命令行工具(Xcode command line tools)(例如xcodebuild)以及BSD开发命令(例如cc、make)。
(相当于设置一个环境变量吧)
xcode-select -p // 显示当前设置的路径
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer // 切换开发者目录路径
是 Xcode 基本的命令行工具。使用它可以调用其他工具。
使用
objdump -t xxx.a
提示 xcrun:error:
应该就是xcrun调用的objdump工具
除了上述的 Xcode 工具以外,还有一些其他用 xcrun
调用的程序:
等等
ld
创建库。Xcode 10.1 只支持swift4(终端 输入swift 就能看到版本),从10.2版本开始内嵌的swift5的libswiftCore(libswiftCore.dylib就是swift的标准库),我是10.1升级到11的,在Xcode中的Contents-》Framework中还是遗留着swift4 的 libswiftCore.dylib(正常情况下应该是没有这些个关于swift的库文件的)。
而DVTFoundation文件(已经是swift5的写代码了) 引用 libswiftCore.dylib 的路径 可能:
因为在 Frameworks 中找到了,所以本来应该用5的,用成了4的,然后4里面没有那个symbol就出错了
(可以直接把在Contents-》Framework中这些swift相关的库给删了看看行不行呗,我已经重装了没法测试了)
macOS本身自带swift命令行 /Library/Developer/CommandLineTools/usr/lib/swift/macosx/
https://filext.com/file-extension/DYLIB
DVTFoundation 是mach-o文件
- sudo find / -name libswiftCore.dylib
- sudo find / -name DVTFoundation
打开xcode工程,在Build Phases > Link Binary With Libraries 中的 libstdc.6.0.9.tbd 右键 find in finder 中确实没有反应。所以从别的好用的xcode中拷贝一个到一下这个目录中
Content/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
意思是:描述文件中的 证书名字 不包括 签名证书 "iphone developer xxxx” 。确实是不包括,描述文件中的 证书名字 不叫 这个,而是叫apple developer XXX,而这个证书电脑上也没有。后来再电脑上重新安装了apple developer XXX 这个证书就好了。
(ps,后来在另外一台电脑上又遇到过一次,描述文件中的证书名字 apple developer XXX 确实已经在 钥匙串中存在了;但是还是提示那个错误,说描述文件的证书名字 不包括 签名证书 "iphone developer xxxx”;各种重启重新安装证书描述文件清除缓存都没有用,后来发现是这个没有设置成 apple developer :
可以查看上述内容关于:《 “一:一些值的查看” 中的 “3.证书名字” 》中的 方法一 和 方法二 查看到的值不同。
真机调试的时候提示 上述信息。
根据提示中的详细信息,缺少哪个版本的sdk,就下对应的
https://给他胡巴.com/JinjunHan/iOSDeviceSupport
然后进行放到 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 下
然后再试试
还是一样的提示的话就重启xcode 重新build 重新插拔手机,重启了电脑 应该就行了
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
This app is not allowed to query for scheme fbauth2,加上:
- <key>LSApplicationQueriesSchemes</key>
- <array>
- <string>fbauth2</string>
- </array>
渠道有个沙盒版本号,相当于请求的支付如果和这个版本号一致,渠道就认为是沙盒支付,如果不一致,渠道就认为是真正的支付
配置成一样的。
流程:
渠道给一个 沙盒账号,=== 就是一个appleid,苹果id。
然后用渠道给的证书打包,需要给渠道设置id添加进描述文件。打包注意设置版本号要和沙盒版本号一致。
You currently don't have access to this membership resource.To resolve this issue, agree to the latest Program License Agreement in your developer account.
译:您当前没有访问此成员资格资源的权限。若要解决此问题,请登陆开发者账号同意开发人员帐户中的最新程序许可协议。
修改info.plist
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
改成
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
首先确定是不是正在上传,实际不是卡住,就是在上传中——spot搜索 activity monitor 看网络中 选择网络发送字节一直在增加的
ios - Xcode stuck in "Uploading package to the App Store" stage while uploading - Stack Overflow
删除DerivedData下使xcode退出的项目相关文件夹(与项目名字对应)(DerivedData文件夹位置 xcode-preference-locations)
再重启看看
xcode中提示说上传成功了,但是后台的connect上并没有看到新的构建版本
看看开发者账号的邮箱里有没有苹果发来的邮件,可能是包有问题,不规范。
查看一下NSURLConnection类
说要看NSURLError:再搜NSURLError:
说明是因为超时了所以加载失败。
需要重新安装新的证书,新的描述文件。新的描述文件中是要对应的新的证书。
安装成功了新的证书,登录 钥匙串中肯定会多一个选项的。
(跟他们说dis证书过期了,合作方的ios开发居然只给我了只两个新的描述文件、、、
然后跟他们又说了一遍,又跟了我一个dev证书,还怀疑我没有安装成功,告诉我要输入密码、、、
然后又跟他们详细描述说了一遍,才给了一个正确的dis证书)
每次安装完新的证书以后,如果要脚本自动打包的话,第一次都需要用手动打包,弹出如下图,点击始终允许:
dyld: Library not loaded: @rpath/xxx.framework 动态库_ivy_0709的博客-CSDN博客
No certificate for team matching 'iPhone Distribution_ivy_0709的博客-CSDN博客
Xcode崩溃调试_ivy_0709的博客-CSDN博客_dydisplaylinkinterposer
24)assert启用不启用的本质
证书需要用开发者账号来申请,并且进行制作。这一部分先介绍一下开发者账号分成了哪几类,然后介绍证书的内容以及申请流程和制作流程,最后介绍一个证书描述文件是什么。
个人类(Individual 99刀一年)
组织类(Company公司 99刀一年;Enterprise企业 299刀一年)
1)个人开发者账号: 在上架App Store后,开发者直接显示申请人姓名。
协作人数1人,个人使用。
每一种Apple产品,均有各类设备各100台测试权限。
适合简单的发布一个应用,适合个人用户。
2)公司开发者账号: 在上架App Store后,App开发者显示公司。
多人协作。可以进行账号管理,可邀请多个Apple ID分不同的管理级别的权限:
(1)Agent是团队代理人,只能有一个,Agent账号具有所有权限。
(2)Admin:是管理员。具有管理Members的权限和上传发布app等权限。
(3)Member:是普通开发者。只有创建测试证书(dev)的权限,没有创建发布证书(dis)的权限。
每一种Apple产品,均有各类设备各100台测试权限。
希望以公司品牌来发布应用,适合公司用户。
3)企业账号: 不能用来上传app store。
用这种证书打出来的包能在任何iOS设备上运行,不需要苹果的验证、签名。
希望不审核,直接扫码下载应用。使用企业证书发布app有效期为12个月,假如过了有效期app则无法运行。
如何用在开发者网站上申请证书,下载证书。
开发证书(Development) :
用于开发阶段真机调试等
不仅在配置该电脑的证书可以使用,还可以生成副本安装到多台电脑上。(通过KeyChain)
发布证书(Production):
用于提交到App store,或者是ad-hoc distribution):
只有配置该证书的电脑才可以使用。导出副本也没用。
无论是什么开发者账号类型,都有这两种证书类型。
1.创建证书申请文件(csr):钥匙串-证书助理-从证书颁发机构请求证书。
2.上传csr:登陆开发者网站,申请证书,选择csr上传。
3.完成,下载证书到本机使用。此mac机也就是配置该证书的电脑。
iOS_如何导出p12文件(开发/发布证书多台MAC使用技巧)_tieshuxianrezhang的博客-CSDN博客
从通过配置该证书的电脑导出.p12文件到别的电脑上,双击安装即可。
直接在安装了cer证书的电脑上,钥匙串中选中该证书,然后右键导出即可。
1.如果把.p12安装到某个电脑上以后,钥匙串中没有显示出来该证书,就重启一下钥匙串看看。
如果钥匙串中已经有该证书了,然后xcode还没有显示出来,就把xcode重启一下看看。
Development证书
Production证书:用户ID和组织编号一致
Development证书:
Production证书:用户ID和组织编号一致
ps:
上述是ios开发中用到的证书,可以在mac机上 实用工具--钥匙串 上看该电脑上装有哪些证书。
而证书的含义是对电脑开发资格的认证,其中包含公开密钥(相当于公章)+证书名称+数字签名。在要开发应用的电脑上必须安装相应的证书。
所以 windows上也会有很多证书,可以在windows机上 internet选项--内容--证书 看
那么证书是怎么来的呢,是由专门的机构颁布的:由CA 以及 受CA信任的机构,一级机构,二级机构……
有了相关证书,就相当于有了签名认证,就可以
在ios真机上,开发调试app(Development证书)了,
以及
发布到app store (Production(Distribution)证书)上。
(只有经过签名认证的app才能安装到真机和发布到appstore上)
Xcode工程设置证书路径:XcodeTarget | BuildSetting| CodeSigning
证书描述文件包含三个东西:provisoning profile=AppID+Devices+DevelopmenCertificate
即在苹果开发者网站上手动创建一个 描述文件Provisioning Profile 时,需要依次指定:
App ID(单选)、
证书(Certificates,可多选)、
设备(Devices,可多选)
AppID 一般用反域名格式,是用来标识一个(explicit AppID)或一组(wildcardAppID)app的。
可以在苹果开发者账号上申请,一般一个应用对应一个AppID,每个AppID还可以选择对应的App服务。
ps:
在Xcode工程,设置BundleIdentifier,就是填写AppID:XcodeTarget | Info | BundleIdentifier
当需要把应用安装到在新的设备上时,要更新所使用的证书描述文件,把新设备的ID加入。
方法一:
登陆苹果开发者网站,在网页上加入了新的DevicesID(即设备的UDID),重新生成一个包含此设备ID的证书描述文件,,安装到使用的机器上,从而可以在xcode工程中进行选择该证书描述文件。
方法二:
当在Xcode上,加入了开发者账户以后,连入一个新的设备可以自动点击注册该设备,会自动更新本机的证书描述文件了。
ps:
当Xcode启用了Automatically manage signing,选择了一个开发者账号以后,会自动创建一个开发证书(会同步到网上),以及只在本机自动创建两个描述文件:
一个是 iOS Team Provisioning Profile:* ,
一个是iOS Team Provisioning Profile: 已有的appID
这两个描述文件只有AppID是不同的,一个是*,一个是已有的appID,而证书都是该开发者账号的所有development证书,设备ID都是所有的设置ID。
描述文件的安装位置:~/Library/MobileDevice/Provisioning Profiles 的.mobileprovision文件。
描述文件中的一些配置:
get-task-allow:能否调试,dev描述文件为true,其他类型为false。
aps-environment:创建证书描述文件的时候的设置。跟后台推送有关。
1.对方给了一个描述文件本机安装了以后(Provisioning Profiles这个文件夹下也确实存在了这个描述文件),但是就是在xcode中找不到这个 0708的
,xcode中显示的就是下面这几个:
原因是 XX_dev_20200708.mobileprovision中的信息中的名字就是 XX_dev_20200630。
xcode中显示是描述文件信息中的真正的名字,而不是说描述文件这个文件名的名字,可能之前都是保持一致了导致有这种错觉没有反应过来。
2.描述文件更新,证书没有做修改,不需要重新安装证书,只要重新安装描述文件就可以。
3.如果是xcode中登陆了开发者账号,用这个开发者账号对应的证书 就可以不用在Provisioning Profiles下有对应的描述文件了(auto选证书 )
证书类型 | 开发证书 | 发布证书 | ||
描述文件类型 | dev: 1.不能发布上appstore。 2.需要添加设备的udid到证书上。 3.可以安装到真机上进行调试。 | ad-hoc: 1.需要添加设备的udid到证书上。 2.一般用于产品上线前一周测试,用来模拟从苹果下载的。 | dis: 1.用于发布到appstore上用的。 2.发布到store上之前,不用越狱的手机装不了。 3.不能调试。 | in-house: 1.不能发布到appstore上。 2.可以安装到任何苹果的设备。 |
99刀/year | 有 | 有 | 有 | 无 |
299刀/year | 有 | 无 | 有 |
一直不明白app和ipa有什么区别
1. app 右键显示包内容,即bundle with excutable and resources
excutable:Mach-0 是ios的可执行文件
resources:Resources文件夹
2.app和ipa
.app
Mac 下的软件大部分都只有一个 .app 目录,里面包含了程序全部资源和可执行文件。简单来说,Mac 下的软件就像是 Windows 下的绿色软件一样,解压后即可使用,不需要安装
.ipa
ipa 格式可以视为这种 .app 软件的衍生物。安装到手机上的
3.xcode生成ipa
点击Product->Archive
然后再export,export。
(如果archive出来的包名不对,不是xcode设置中的包名,看看info文件中的配置)
使用python写的打包流程:
第一步先读取配置文件,打包什么渠道,即包含一些证书和描述文件的配置,以及一些xcode工程的配置
第二步打assetbundle包
第三步编译unity工程,生成xcode工程
第四步编译xcode工程,生成ipa。
比如现在打什么渠道版本等等
选出更新文件。调用unity的编辑器下的静态函数。
- def build_unity_ios_assetBundle():
-
- delete_dir(update_path_root)
- cmd = plistConfig["UnityPath"] + " -batchmode -quit -logfile /dev/stdout -projectPath "\
- + unity_project_path + " -executeMethod CommandBuild.BuildiOSAssetBundle"
-
- return execute_cmd(cmd, output_tag="Unity")
切换到对应的版本平台,调用build函数。
这其中介绍一下代码中会用到的一些引擎接口函数,关于PlayerSettings界面下的一些参数,以及BuildSettings界面下的一些参数。
Data文件夹:
.unity场景文件,每一个场景编译成一个level
Raw文件夹:——StreamingAssets,原封不动的
Managed文件夹:——不知道是啥 原来的dll文件吧
Resources文件夹:——加密压缩过的,Resources文件夹
还有一些assets文件
Images.xcassets:——icon图片和launchimage图片
Classes:代码相关
Unity引擎中拷贝过来的mm。
Native文件夹——IL2CPP的,就是Unity中的那些C#文件。Bulk_Assembly-CSharp_数字.cpp
Frameworks:
用到的一些库以及外部进去的库以及一些打包的资源 .bundle .framework
Libraries:
Plugins文件夹:Unity工程下的Plugins文件夹下的关于ios的.a .mm .h .m文件
其他不知道啥
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.IOS) //切换平台函数 编辑器模式下运行
EditorUserBuildSettings.activeBuildTarget //当前平台变量
ps:This method is not available when running the Editor in batch mode. 在使用命令行调用执行到这个SwitchActiveBuildTarget
(BuildTarget.Android)的时候会有问题,导致 UNITY_ANDROID 宏不生效。https://docs.unity3d.com/ScriptReference/EditorUserBuildSettings.SwitchActiveBuildTarget.html
// 导出pdb文件函数
EditorUserBuildSettings.SetPlatformSettings("Standalone", "CopyPDBFiles", "true");
// 不导出pdb文件函数
EditorUserBuildSettings.SetPlatformSettings("Standalone", "CopyPDBFiles", "false");
1)宏定义
PlayerSettings.GetScriptingDefineSymbolsForGroup(targetGroup); //所有宏定义 ; 分割
PlayerSettings.SetScriptingDefineSymbolsForGroup(targetGroup, sz); //写入全部宏,相当于改配置
2)app版本相关
PlayerSettings.bundleVersion string类型--》playersetting界面中的"Version" (界面中加*就代表多个平台公用)
PlayerSettings.iOS.buildNumber string类型---》playersetting界面中的"Build"
PlayerSettings.Android.bundleVersionCode int类型---》playersetting界面中的 "Bundle Version Code"
一般都用buildcount来赋值,构建次数,每进行一次build都加1,其值存在于打包的机器上,PlayerPrefs.GetInt(key名字) ,Windows机器放在注册表里,Softwarre-》公司名-》产品名,Mac机器放在 ~/library/preferences/com.[公司名].[产品名].plist
安卓版本同一个app的bundleVersionCode,一定要每个发布的版本其值要一直增大,不管是不是已经更新了版本。
ios版本同一个app的buildNumber,在版本号version不变的情况下需要一直增大build号,否则就没有要求。
if (EditorUserBuildSettings.development)
{
_opt |= BuildOptions.Development;
if (EditorUserBuildSettings.connectProfiler)
_opt |= BuildOptions.ConnectWithProfiler;
}
EditorUserBuildSettings.development 是否是开发版本
EditorUserBuildSettings.connectProfiler 是否连接分析器
// levels The scenes to be included in the build. If empty, the currently open scene will be built. Paths are relative to the project folder (Assets/MyLevels/MyScene.unity).
// para1-locationPathName The path where the application will be built.
// para2-target The BuildTarget to build.
// para3-options Additional BuildOptions, like whether to run the built player.
BuildPipeline.BuildPlayer(EditorBuildSettings.scenes, para1, para2, para3);
BuildiOS调用的这个静态函数就需要用到上述介绍的那些个接口函数
- cmd = plistConfig["UnityPath"] + " -batchmode -quit -logfile /dev/stdout -projectPath "\
- + unity_project_path + " -executeMethod CommandBuild.BuildiOS"
- execute_cmd(cmd, output_tag="Unity")
使用命令行进行xcode工程的编译,这里包含的步骤有:1. 设置MapFileParser 权限为x 2.把一些用到的图片资源拷贝到相应的目录下 3.修改xcode工程配置 4.生成ipa 5.上传bugly
1.设置MapFileParser 权限:
- def update_xcode_other_file():
- path = current_xcode_project
-
- cmd = "chmod +x "+ path+ "/MapFileParser.sh"
-
- if not execute_cmd(cmd):
- print "chmod +x MapFileParser.sh fail"
-
- cmd = "chmod +x "+ path+ "/MapFileParser"
-
- if not execute_cmd(cmd):
- print "chmod +x MapFileParser.sh fail"
MapFileParser:The MapFileParser is a utility that parser the linker map file for a few different compilers and generates a binary output file with the information that the IL2CPP runtime needs to generate correct managed stack traces.It is part of the generated Xcode project because it must run after the linker completes. You should see it run as part of a post build script in the Xcode project.
2.拷贝一些资源
icon 图片 ==》 Unity-iPhone/Images.xcassets/AppIcon.appiconset
launchimage 图片 ==》 Unity-iPhone/Images.xcassets/LaunchImage_xx.LaunchImage
权限文件entitlement文件 ==》Unity-iPhone/xx.entitlements
在 TARGETS --->Capabilities 里边打开了一些功能,就会生成一个对应的entitlement文件
下面是开启了aps-environment 和 associated-domains的开关的entitlements内容
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
- <plist version="1.0">
- <dict>
- <key>aps-environment</key>
- <string>development</string>
- <key>com.apple.developer.associated-domains</key>
- <array>
- <string>applinks:xxx.com</string>
- </array>
- </dict>
- </plist>
对应在xcode工程中:
3修改xcode工程的一些配置
1)修改BuildFlag
- from mod_pbxproj import XcodeProject
-
- proj = XcodeProject.Load(current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj')
- """
- <key>BuildFlags</key>
- <dict>
- <key>ENABLE_BITCODE</key>
- <string>NO</string>
- <key>ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME</key>
- <string>LaunchImage_xx</string>
- </dict>
- """
- proj.change_setting_flag(build_flags,dic_channel_config[current_config][build_flags])
对应于在xcode工程中:
2)增加依赖库和框架
xcode的Xcode ▸ Contents ▸ Developer ▸ Platforms ▸ iPhoneOS.platform ▸ Developer ▸ SDKs ▸ iPhoneOS.sdk 下的
usr/lib路径下的库文件 (tbd文件 text-based stub libraries,减少Xcode中SDK的体积)
System/Library/Frameworks/路径下framework
以及外面目录下的文件
- from mod_pbxproj import XcodeProject
-
- proj = XcodeProject.Load(current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj')
- """
- <key>dylibs</key>
- <array>
- <string>libz</string>
- <string>libstdc++.6.0.9</string>
- <string>libsqlite3.0</string>
- </array>
- <key>Frameworks</key>
- <array>
- <string>Security</string>
- <string>SystemConfiguration</string>
- <string>JavaScriptCore</string>
- <string>MobileCoreServices</string>
- <string>CoreTelephony</string>
- <string>CoreAudio</string>
- <string>WebKit</string>
- </array>
- <key>OtherFrameworkFiles</key>
- <array>
- <string>/XXPlatform/test/XXPlatform.json</string>
- </array>
- """
- proj.add_file('usr/lib/' + lib_need_add + '.tbd', parent='Frameworks', tree='SDKROOT')
- proj.add_file('System/Library/Frameworks/' + framwork_need_add + '.framework', parent='Frameworks', tree='SDKROOT')
- proj.add_file(cur_path + '/' + other_framwork_need_add, parent='Frameworks', tree='SDKROOT')
对应于xcode工程界面:
3)增加LDFlag
- from mod_pbxproj import XcodeProject
- proj = XcodeProject.Load(current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj')
- """
- <key>OtherLDFlags</key>
- <array>
- <string>-ObjC</string>
- <string>-lc++.1</string>
- <string>-liconv</string>
- <string>-lz</string>
- </array>
- """
- proj.add_other_ldflags(other_flags)
对应于xcode工程中:
4)修改C++ standard Library
- """
- # 将unity5默认生成的C++ standard Library由libc++改为libstdc++
- cmd = sed
- -i s/CLANG_CXX_LIBRARY =libc++;
- /CLANG_CXX_LIBRARY =libstdc++;
- /g current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj'
- """
- cmd = "sed -i '' 's/CLANG_CXX_LIBRARY = "'"libc++"'";/CLANG_CXX_LIBRARY = "'"libstdc++"'";/g' " + current_project_path + '/Unity-iPhone.xcodeproj/project.pbxproj'
- if not execute_cmd(cmd):
- print "manual sign fail"
- return False
4.Build Xcode
编译xcode工程:
- def build_xcode_project(current_project_path):
- # 编译XCODE工程
- global plistConfig
- try:
- cmd = "xcodebuild -project '" + current_project_path + "/Unity-iPhone.xcodeproj' "+\
- "-configuration 'Release' -target 'Unity-iPhone' "\
- "PROVISIONING_PROFILE=" +'''"'''+ dic_channel_config["iOSProvisionCode"] +'''"'''+ \
- " CODE_SIGN_IDENTITY=" +'''"'''+ dic_channel_config["iOSCodeSign"] +'''"'''
- return execute_cmd(cmd)
-
- except Exception, e:
- print '\nSome error/exception occurred.' + e
- return False
-
- return True
其中 PROVISIONING_PROFILE 即 描述文件的uuid
和 CODE_SIGN_IDENTITY 即证书的名字
5.生成IPA
- def generate_ipa(current_project_path, timestamp, ipaFolder, final_path):
- # 生成IPA
- appname = plistConfig["AppOutputName"] + ".app"
-
- cmd = "/usr/bin/xcrun -sdk iphoneos PackageApplication -v '" + current_project_path+ "/build/Release-iphoneos/" + appname + "' -o '" + final_path + "mldj-" + current_channel_name +"-" + timestamp + ".ipa" + "'"
- return execute_cmd(cmd)
6.生成符号表文件,上传bugly home - Bugly 文档
- cmd = "java -jar " + jar_path + " -i " + dsym_path + " -u -o " + symbols_zip_file+ " -package:" + bundle_id +" -version " + bugly_version_info
- execute_command(cmd)
java -jar + buglySymboliOS.jar bugly库
-i xx.dSYM xcode生成的调试信息文件,用来生成符号表文件
-u 上传开关,上传生成的符号表文件
-o Symbols.zip 输出的 生成的符号表文件
-package:com.xx.xx BundleIndentifier
-version 1.10.5_867 version号_build号
.xcodeproj是xcode工程文件。用xcode打开.xcodeproj,里面包含了所有的源文件、资源文件和构建一个或者多个 product 的信息。具体包含源文件引用 源代码,包含头文件和实现文件 内部和外部的静态库和动态库 资源文件 图片文件 界面构建文件(nib) 在文件结构的导航中,使用 Groups 去组织源文件 工程层级编译配置。可以给工程指定超过一个编译配置,比如:编译配置的 release 和 debug。
project 定义了一些基本的编译设置
每个 target 都继承了 project 的默认设置,
每个 target 可以通过重新设置 target 的编译选项来定义自己的特殊编译选项。
(
target 定义了构造一个 product 所需的文件和编译指令。
一个 target 对应于一个 product。
target 就是 告诉编译系统要编译的文件和编译设置。
编译指令就是根据 build settings and build phases 来确定的。
)
找不同版本的unitymanual
Unity - Manual: Unity User Manual 2021.3 (LTS) 当前版本
Unity - Manual: Unity User Manual (5.5) 5.5版本 对应修改数字即可
ITMS-90809: Deprecated API Usage UIWebView SADSWebPlayerView_ivy_0709的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。