Unity打IOS版本遇到的问题(总)

    工作中是使用的是python脚本自动化打包IOS(unity导出成xcode工程,然后xcode工程再打包成ipa)。打包大概流程以及一些操作的功能将在第五部分中介绍。

    先介绍在打包中涉及到证书,证书描述文件在第一和第三部分中介绍。

    第二部分记录一些错误的解决方案。

    第四部分介绍一些知识,比如app和ipa的区别。

目录

一:一些值的查看

1. 查看证书的描述文件的uuid字段值

2. 查看证书的描述文件的加入的设备ID

3.查看证书的名字

4.手机设备的udid

5.Xcode的UUID值

6.查看静态库包含的cpu架构代码

7.ios

8.BundleDisplayName 安装的时候显示的名字 BundleName询问的时候使用的名字

二. 一些错误提示

1)Unity4XC.xcplugin

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

xcode-select 命令

xcrun 命令(xcode run 猜的 )

swift版本和libswiftCore.dylib

查看dylib文件的网站

MachOView查看mac可执行文件

搜索命令 find / -name

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

11) http请求被阻止了,在infolist上添加设置

12) 测试ios支付 由于沙盒账号游戏版本不对导致失败

三.IOS开发中证书的相关概念

1. 开发者账号分类:

2. ios证书

1)证书分类:

2)证书申请流程:

3)开发证书副本制作:

4)具体申请好的证书的图示:

3.证书描述文件

4.总结:

四.关于app和ipa:

五.IOS脚本打包流程

1.读取配置文件

2.打ab包

3.编译UNITY工程,生成XCode工程

1)引擎接口函数

2)打包unity命令

4. 编译Xcode工程,生成IPA

六.Xcode工程的一些概念:


一:一些值的查看

比较杂乱,就是一些值如何查看

1. 查看证书的描述文件的uuid字段值

证书的描述文件也就是 后缀是 .mobileprovision 的文件。

方法一:

到 存放路径 ~/Library/MobileDevice/Provisioning Profiles 中查看,这下面的都是已经安装到电脑上的证书的描述文件了。

比如xxxxxx.mobileprovision,其中 前面的那一长串数字xxxxx就是PROVISIONING_PROFILE的值

方法二:

如果是没有安装到电脑上的证书,用命令行查看 security cms -D -i yyyyy.mobileprovision,找到其 uuid 字段值。

2. 查看证书的描述文件的加入的设备ID

方法一:

mobileprovision 文件右键,显示简介可以看到所有的加入该设备ID

方法二:

同样是用命令行 security cms -D -i xxxx.mobileprovision 

3.查看证书的名字

方法一:

mobileprovison文件中的右键简介中看到,CERTIFICATES中的Name即是.

方法二:

应用程序-》实用工具-》钥匙串,找到对应的证书,右键显示简介中的"常用名称"

如果描述文件中添加了新的设备,在mac机上双击以后, 在~/Library/MobileDevice/Provisioning Profiles 下会生成新的mobileprovision文件。

4.手机设备的udid

方法一:

把设备连上Mac,打开iTunes

点击UDID可以切换看其他信息,需要复制,右键即可。

方法二:

连上itools 显示更多。

方法三:

连上xcode看。

方法四:

蒲公英网站查询 

1.直接用手机浏览器连一个网站  https://www.pgyer.com/udid 
2.点击【获取udid】,会让你下载一个描述文件,点击【允许】以后,会跳到手机【设置】界面中的【描述文件】界面
3.点击安装“蒲公英描述文件”
4.安装好了会自动跳回到浏览器,显示手机设备的udid【这个发给我们就行了】
5.打开手机【设置】界面中的【描述文件】界面,把刚刚安装的描述文件删了即可。

(还可以使用蒲公英进行内测分发,不过需要软件著作权等资质文件,要不然过一会就会被下架不能下载了

内测分发:上传ipa进行,生成一个落地页,别人通过这个页面有个安装按钮就可以直接安装了

5.Xcode的UUID值

方法一:

在终端输入“defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

方法二:

应用程序-Xcode-右键显示包内容-info.plist里找到DVTPlugInCompatibilityUUID 对应的value

(其实就是执行上面那个命令行做的事情)

6.查看静态库包含的cpu架构代码

打开console终端,执行下列命令

lipo -infoxxxx.a(静态库路径) 

7.ios 进行测试facebook分享

有一个软件veee+ 但是需要郭歪的appleid登陆

所以申请一个没曲的appleid,登陆,然后是没曲的applestore了 

然后下载veee+,不过有一个小时的免费使用时间。

https://veee273.vip/c_ios_reg

8.BundleDisplayName 安装的时候显示的名字 BundleName询问的时候使用的名字

9.ipa看 版本号和build号

执行 mv xxx.ipa  xxx.zip 转成zip包,然后解压,看包内容,里面的info.plist。

命令行:

unzip xxx.zip
cd Payload
cd xxx.app
open Info.plist

10.unity的关于 view和controller的api

UnityGetGLViewController()

UnityGetGLView()

头文件:

#import "UnityAppController.h"
#import "UnityInterface.h"

11.Mac下载svn

苹果开发者工具不再支持svn,下载了苹果开发者工具也没有用了。

所以下载 安装Homebrew 

使用他来安装svn:执行 brew install svn

which svn
where svn
svn --version

二. 一些错误提示

这一部分比较杂乱琐碎,记录一些遇到的错误。

1)Unity4XC.xcplugin

升级了xcode以后需要把xcode的新的uuid,配置到unity中。

Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362Cfor 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。

2)xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH

升级了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

3)Fatal Error  The Project  is  on case sensitive file system.......

unity工程所在的硬盘文件系统格式有问题。

工程所在的硬盘,格式化的时候设置的系统为大小写敏感了,需要改为大小写不敏感的文件系统。

mac上的unity处理不了大小写敏感的文件系统

4)[Unity] Couldn't set project path to: /Volumes/TOSHIBA

因为路径名带了空格了。

如果说找不到目录,看看是不是路径中文件夹的名字有带空格的,有的可能找不到

原来是设置的硬盘名字带空格 TOSHIBA XXX,所以修改一下硬盘名字。

5)链接错误linker command failed with exit code 1

如何查看具体的错误:

调用第三方静态库.a库中的中的函数,出现如下错误:

ld: symbol(s) not found for architecture arm64

  • 可能的原因1:生成的.a库的xcode选择的架构指令集不对。

解决办法:xcode工程,BuildSetting  下的 Architectures:

                                architectures:standard    

                                validarchitecture:armv7 armv7s armv64

build的device选:Generic IOS Device

  • 可能的原因2:缺少了库,所以找不到应该有的函数。接sdk的时候增加了一个功能苹果登陆(苹果现在要求有三方登录就必须有苹果登录)这个是苹果登录需要导入一个库,AuthenticationServices.framework

解决办法:导入库AuthenticationServices.framework,确保是xcode11编译才行

6)解锁钥匙串 codesign failed with exit code 1

使用jenkins打版本的时候,出现如下错误:

XX.app: errSecInternalComponent
Command /usr/bin/codesign failed with exit code 1
或者
Command CodeSign failed with a nonzero exit code
  • 可能原因1:查看是否设置了解锁钥匙串的登陆密码,如果没有,在进行xcode的编译前加上:
os.system("security unlock-keychain -p 123456") #jenkins调用脚本时需要先解锁钥匙串,123456为版本机钥匙串密码

钥匙串的登陆密码在 MacOS10.14版本中,无法修改密码,必须是和电脑登陆密码一致。(而在原来的MacOS10.12中是可以修改,可以不和开机密码一致的。)

所以在升级了系统以后,打包可能也会出现上述问题,需要修改“解锁钥匙串的登陆密码”。

  • 可能原因2:是否对xcode进行了开发者账户的一些操作,以及钥匙串证书的一些操作,如果是,打开xcode然后clean一下工程,然后重启mac。

  • 可能原因3:是否是用脚本打包ipa并且是还安装了新的证书以及删除了旧的证书(关于钥匙串的操作),如果是而且重启大法没用。那么先不用脚本打包,而是用xcode打包archives,打到最后会跳出一个让输入钥匙串密码的,点击始终允许,打成功以后,再用脚本打就ok了。

7)dyld: Symbol not found: _$s15_ObjectiveCTypes01_A11CBridgeablePTl

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

后来找了 https://www.jianshu.com/p/368fcc9afa50 这个文章一样的问题,看到最后就是先直接卸载了现有的xcode,重新装了。

记录一下有用的东西:

xcode-select 命令

这个命令用来输出或者改变活跃的开发者目录的路径,而这个路径控制着哪个工具会被用于Xcode命令行工具Xcode command line tools)(例如xcodebuild)以及BSD开发命令(例如cc、make)。 

(相当于设置一个环境变量吧)

xcode-select -p   // 显示当前设置的路径

sudoxcode-select--switch /Applications/Xcode.app/Contents/Developer  // 切换开发者目录路径

xcrun 命令(xcode run 猜的 )

是 Xcode 基本的命令行工具。使用它可以调用其他工具。

使用 

objdump -t xxx.a 

提示 xcrun:error:

应该就是xcrun调用的objdump工具 

除了上述的 Xcode 工具以外,还有一些其他用 xcrun 调用的程序:


等等

  • clang: 编译C、C++、Objective-C和 Objective-C 源文件
  • lldb: 调试C、C++、Objective-C 和 Objective-C 程序
  • nasm: 汇编文件
  • ndisasm: 反汇编文件
  • symbols: 显示一个文件或者进程的符号信息。
  • strip: 删除或修改符号表附加到汇编器和链接编辑器的输出。
  • atos: 将数字内存地址转换为二进制映像或进程的符号。
  • ld: 将目标文件和库合并成一个文件。
  • otool: 显示目标文件或库的指定部分。
  • ar: 创建和维护库文档。
  • libtool: 使用链接器 ld 创建库。
  • ranlib: 更新归档库的目录。
  • mksdk: 创建和更新 SDK。
  • lorder: 列出目标文件的依赖。

https://www.jianshu.com/p/2a351587f0ef

swift版本和libswiftCore.dylib

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 的路径 可能:

  • 优先Xcode的Frameworks路径
  • 如果没有,则寻找其他可执行路径(可以猜一下,可能是:对应模拟器/真机执行文件路径或者系统路径之类)

因为在 Frameworks 中找到了,所以本来应该用5的,用成了4的,然后4里面没有那个symbol就出错了

(可以直接把在Contents-》Framework中这些swift相关的库给删了看看行不行呗,我已经重装了没法测试了)

macOS本身自带swift命令行  /Library/Developer/CommandLineTools/usr/lib/swift/macosx/

查看dylib文件的网站

https://filext.com/file-extension/DYLIB

MachOView查看mac可执行文件

https://www.jianshu.com/p/175925ab3355

DVTFoundation 是mach-o文件

搜索命令 find / -name

sudo find / -name libswiftCore.dylib
sudo find / -name DVTFoundation

8)ld: library not found for -lstdc++.6.0.9

打开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/

9) error: Provisioning profile "XXX" doesn't include signing certificate "XXX"

意思是:描述文件中的 证书名字 不包括 签名证书 "iphone developer xxxx” 。确实是不包括,描述文件中的 证书名字 不叫 这个,而是叫apple developer XXX,而这个证书电脑上也没有。后来再电脑上重新安装了apple developer XXX 这个证书就好了。

(ps,后来在另外一台电脑上又遇到过一次,描述文件中的证书名字 apple developer XXX 确实已经在 钥匙串中存在了;但是还是提示那个错误,说描述文件的证书名字 不包括 签名证书 "iphone developer xxxx”;各种重启重新安装证书描述文件清除缓存都没有用,后来发现是这个没有设置成 apple developer :

可以查看上述内容关于:《  “一:一些值的查看” 中的“3.证书名字” 》中的 方法一 和 方法二 查看到的值不同。

10)Xcode:Could not locate device support files

真机调试的时候提示 上述信息。

根据提示中的详细信息,缺少哪个版本的sdk,就下对应的

https://给他胡巴.com/JinjunHan/iOSDeviceSupport

然后进行放到 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

然后再试试

还是一样的提示的话就重启xcode 重新build 重新插拔手机,重启了电脑 应该就行了

11) http请求被阻止了,在infolist上添加设置

    <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>

12) 测试ios支付 由于沙盒账号游戏版本不对导致失败

渠道有个沙盒版本号,相当于请求的支付如果和这个版本号一致,渠道就认为是沙盒支付,如果不一致,渠道就认为是真正的支付

配置成一样的。

流程:

渠道给一个 沙盒账号,=== 就是一个appleid,苹果id。

然后用渠道给的证书打包,需要给渠道设置id添加进描述文件。打包注意设置版本号要和沙盒版本号一致。

13)This request is forbidden for security reasons(出于安全原因,此请求被禁止)

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.

译:您当前没有访问此成员资格资源的权限。若要解决此问题,请登陆开发者账号同意开发人员帐户中的最新程序许可协议。

14)Recovery Suggestion: “xxx” requires the “arm64” capability which is not supported by iPad 4

https://developer.apple.com/documentation/bundleresources/information_property_list/uirequireddevicecapabilities

修改info.plist

    <key>UIRequiredDeviceCapabilities</key>
    <array>
        <string>arm64</string>
    </array>

改成

    <key>UIRequiredDeviceCapabilities</key>
    <array>
        <string>armv7</string>
    </array>

15)Xcode停留在上传包的界面不动了 Xcode stuck in “Uploading package to the App Store” stage while uploading

首先确定是不是正在上传,实际不是卡住,就是在上传中——spot搜索 activity monitor 看网络中 选择网络发送字节一直在增加的

https://stackoverflow.com/questions/60601438/xcode-stuck-in-uploading-package-to-the-app-store-stage-while-uploading

16)xcode点build,提示xcbbuildservice意外退出

删除DerivedData下使xcode退出的项目相关文件夹(与项目名字对应)(DerivedData文件夹位置 xcode-preference-locations)

再重启看看

17)iOS Xcode 上传构建版本 完成后 在appstoreConnect找不到

xcode中提示说上传成功了,但是后台的connect上并没有看到新的构建版本

看看开发者账号的邮箱里有没有苹果发来的邮件,可能是包有问题,不规范。

18)iOS上架错误:缺少出口合规证明

https://www.jianshu.com/p/3910a9e23cc0

19)NSURLConnection finished with error - code -1001

查看一下NSURLConnection类 

https://developer.apple.com/documentation/foundation/nsurlconnection?language=objc

说要看NSURLError:再搜NSURLError:

https://www.jianshu.com/p/390890795730

说明是因为超时了所以加载失败。

20)证书过期了

需要重新安装新的证书,新的描述文件。新的描述文件中是要对应的新的证书。

安装成功了新的证书,登录 钥匙串中肯定会多一个选项的。

(跟他们说dis证书过期了,合作方的ios开发居然只给我了只两个新的描述文件、、、

然后跟他们又说了一遍,又跟了我一个dev证书,还怀疑我没有安装成功,告诉我要输入密码、、、

然后又跟他们详细描述说了一遍,才给了一个正确的dis证书)

每次安装完新的证书以后,如果要脚本自动打包的话,第一次都需要用手动打包,弹出如下图,点击始终允许:

21)dyld: Library not loaded: @rpath/xxx.framework 动态库

https://blog.csdn.net/u012138730/article/details/106127177

22)No certificate for team matching 'iPhone Distribution

https://blog.csdn.net/u012138730/article/details/90734061

23)malloc: *** error for object 0x1018ad6a0: pointer being freed was not allocated

https://blog.csdn.net/u012138730/article/details/82896060

https://blog.csdn.net/u012138730/article/details/107463567

三.IOS开发中证书的相关概念

证书需要用开发者账号来申请,并且进行制作。这一部分先介绍一下开发者账号分成了哪几类,然后介绍证书的内容以及申请流程和制作流程,最后介绍一个证书描述文件是什么。

1. 开发者账号分类

个人类(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则无法运行。

2. ios证书

     如何用在开发者网站上申请证书,下载证书。

     https://developer.apple.com/account/ios/certificate/distribution

1)证书分类:

开发证书(Development) :

         用于开发阶段真机调试等

         不仅在配置该电脑的证书可以使用,还可以生成副本安装到多台电脑上。(通过KeyChain)

发布证书(Production):

         用于提交到App store,或者是ad-hoc distribution):

         只有配置该证书的电脑才可以使用。导出副本也没用。

无论是什么开发者账号类型,都有这两种证书类型。

2)证书申请流程:

https://www.jianshu.com/p/01224fc523d4

1.创建证书申请文件(csr):钥匙串-证书助理-从证书颁发机构请求证书。

2.上传csr:登陆开发者网站,申请证书,选择csr上传。

3.完成,下载证书到本机使用。此mac机也就是配置该证书的电脑。

3)开发证书副本制作:

https://blog.csdn.net/tieshuxianrezhang/article/details/72835963

从通过配置该证书的电脑导出.p12文件到别的电脑上,双击安装即可。

直接在安装了cer证书的电脑上,钥匙串中选中该证书,然后右键导出即可。

  • 遇到的问题

1.如果把.p12安装到某个电脑上以后,钥匙串中没有显示出来该证书,就重启一下钥匙串看看。

如果钥匙串中已经有该证书了,然后xcode还没有显示出来,就把xcode重启一下看看。

4)具体申请好的证书的图示:

  • 个人开发者账号:组织名就是开发者的名字

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

3.证书描述文件

证书描述文件包含三个东西:provisoning profile=AppID+Devices+DevelopmenCertificate 

即在苹果开发者网站上手动创建一个 描述文件Provisioning Profile 时,需要依次指定:

                 App ID(单选)、

                 证书(Certificates,可多选)、

                 设备(Devices,可多选)

  • AppID

AppID 一般用反域名格式,是用来标识一个(explicit AppID)或一组(wildcardAppID)app的。

可以在苹果开发者账号上申请,一般一个应用对应一个AppID,每个AppID还可以选择对应的App服务。

ps:

在Xcode工程,设置BundleIdentifier,就是填写AppIDXcodeTarget| 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。

https://www.jianshu.com/p/035ae1f1e563

  • 其他:

描述文件的安装位置:~/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选证书 )

4.总结:

证书类型开发证书发布证书
描述文件类型

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:

一直不明白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文件中的配置)

五.IOS脚本打包流程

使用python写的打包流程:

第一步先读取配置文件,打包什么渠道,即包含一些证书和描述文件的配置,以及一些xcode工程的配置

第二步打assetbundle包

第三步编译unity工程,生成xcode工程

第四步编译xcode工程,生成ipa。

1.读取配置文件

比如现在打什么渠道版本等等

2.打ab包

选出更新文件。调用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")

3.编译UNITY工程,生成XCode工程

切换到对应的版本平台,调用build函数。

这其中介绍一下代码中会用到的一些引擎接口函数,关于PlayerSettings界面下的一些参数,以及BuildSettings界面下的一些参数。

0)unity编译成xcode以后的工程目录

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文件

     其他不知道啥

1)引擎接口函数

  • “Switch Platform”

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

  • “Copy PDB files” PC Mac Linux

// 导出pdb文件函数
EditorUserBuildSettings.SetPlatformSettings("Standalone", "CopyPDBFiles", "true");
// 不导出pdb文件函数
EditorUserBuildSettings.SetPlatformSettings("Standalone", "CopyPDBFiles", "false");

  • “PlayerSettings”

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号,否则就没有要求。

  • “Development Build” “Autoconnect Profiler”

    if (EditorUserBuildSettings.development)
    {
        _opt |= BuildOptions.Development;
        if (EditorUserBuildSettings.connectProfiler)
            _opt |= BuildOptions.ConnectWithProfiler;
    }
    EditorUserBuildSettings.development 是否是开发版本
    EditorUserBuildSettings.connectProfiler 是否连接分析器

  • “Build”

     // 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);

2)打包unity命令

BuildiOS调用的这个静态函数就需要用到上述介绍的那些个接口函数

    cmd = plistConfig["UnityPath"] + " -batchmode -quit -logfile /dev/stdout -projectPath "\
              + unity_project_path + " -executeMethod CommandBuild.BuildiOS"
    execute_cmd(cmd, output_tag="Unity")

4. 编译Xcode工程,生成IPA

使用命令行进行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 https://bugly.qq.com/docs/

    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号

六.Xcode工程的一些概念:

.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

https://docs.unity3d.com/Manual/index.html    当前版本

https://docs.unity3d.com/550/Documentation/Manual/index.html   5.5版本 对应修改数字即可

七.IOS提审遇到的一些问题:

1.ITMS-90809: Deprecated API Usage UIWebView SADSWebPlayerView

https://blog.csdn.net/u012138730/article/details/106972155

2.ITMS-90339: Deprecated Info.plist Key

https://blog.csdn.net/u012138730/article/details/93469268


版权声明:本文为u012138730原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。