2023年12月2日发(作者:剑若)
Unity打IOS版本遇到的问题(总) 工作中是使用的是python脚本自动化打包IOS(unity导出成xcode工程,然后xcode工程再打包成ipa)。打包大概流程以及一些操作的功能将在第五部分中介绍。 先介绍在打包中涉及到证书,证书描述文件在第一和第三部分中介绍。 第二部分记录一些错误的解决方案。 第四部分介绍一些知识,比如app和ipa的区别。目录一:一些值的查看比较杂乱,就是一些值如何查看1. 查看证书的描述文件的uuid字段值证书的描述文件也就是 后缀是 .mobileprovision 的文件。方法一:到 存放路径 ~/Library/MobileDevice/Provisioning Profiles 中查看,这下面的都是已经安装到电脑上的证书的描述文件了。比如provision,其中 前面的那一长串数字xxxxx就是PROVISIONING_PROFILE的值。方法二:如果是没有安装到电脑上的证书,用命令行查看 security cms -D -i provision,找到其 uuid 字段值。2. 查看证书的描述文件的加入的设备ID方法一:mobileprovision 文件右键,显示简介可以看到所有的加入该设备ID方法二:同样是用命令行 security cms -D -i provision
3.查看证书的名字方法一:mobileprovison文件中的右键简介中看到,CERTIFICATES中的Name即是.方法二:应用程序-》实用工具-》钥匙串,找到对应的证书,右键显示简介中的"常用名称"如果描述文件中添加了新的设备,在mac机上双击以后, 在~/Library/MobileDevice/Provisioning Profiles 下会生成新的mobileprovision文件。4.手机设备的udid方法一:把设备连上Mac,打开iTunes点击UDID可以切换看其他信息,需要复制,右键即可。方法二:连上itools 显示更多。方法三:连上xcode看。方法四:蒲公英网站查询
(还可以使用蒲公英进行内测分发,不过需要软件著作权等资质文件,要不然过一会就会被下架不能下载了内测分发:上传ipa进行,生成一个落地页,别人通过这个页面有个安装按钮就可以直接安装了)的UUID值方法一:在终端输入“defaults read /Applications//Contents/Info DVTPlugInCompatibilityUUID”方法二:在应用程序-Xcode-右键显示包内容-里找到DVTPlugInCompatibilityUUID 对应的value(其实就是执行上面那个命令行做的事情)6.查看静态库包含的cpu架构代码打开console终端,执行下列命令lipo -info xxxx.a(静态库路径)
进行测试facebook分享有一个软件veee+ 但是需要郭歪的appleid登陆所以申请一个没曲的appleid,登陆,然后是没曲的applestore了
然后下载veee+,不过有一个小时的免费使用时间。DisplayName 安装的时候显示的名字 BundleName询问的时候使用的名字看 版本号和build号执行 mv 转成zip包,然后解压,看包内容,里面的。命令行:unzip Payloadcd n 的关于 view和controller的apiUnityGetGLViewController()UnityGetGLView()头文件:#import "UnityAppController.h"#import "UnityInterface.h"下载svn苹果开发者工具不再支持svn,下载了苹果开发者工具也没有用了。所以下载 安装Homebrew
使用他来安装svn:执行 brew install svnwhich svnwhere svnsvn --version二. 一些错误提示这一部分比较杂乱琐碎,记录一些遇到的错误。1)in升级了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/in' not present inDVTPlugInCompatibilityUUIDs解决办法:找到 /Applications/Unity/PlaybackEngines/iOSSupport/Tools/OSX/in ,右键显示包内容-
在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//Contents/Developer/Platforms/rm/Developer/usr/bin/并且执行命令:
sudo xcode-select -switch /Applications//Contents/Developer/chmod +x /Applications//Contents/Developer/Platforms/rm/Developer/usr/bin/PackageApplication3)Fatal Error The Project is on case sensitive 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 armv64build的device选:Generic IOS Device可能的原因2:缺少了库,所以找不到应该有的函数。接sdk的时候增加了一个功能苹果登陆(苹果现在要求有三方登录就必须有苹果登录)这个是苹果登录需要导入一个库,ork解决办法:导入库ork,确保是xcode11编译才行6)解锁钥匙串 codesign failed with exit code 1使用jenkins打版本的时候,出现如下错误:: errSecInternalComponentCommand /usr/bin/codesign failed with exit code 1或者Command CodeSign failed with a nonzero exit code可能原因1:查看是否设置了解锁钥匙串的登陆密码,如果没有,在进行xcode的编译前加上:("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_A11CBridgeablePTlxcode原来是10,后来升级了11, 然后正常跳出来同意协议,结果点Agree 没有反应,一直卡在Xcode And IOS SDK LicenseAgreement,后来查到用命令行:sudo xcodebuild -license执行跳出上面这个错误
dyld: Symbol not found: _$s15_ObjectiveCTypes01_A11CBridgeablePTl Referenced from: /Applications//Contents/Developer/usr/bin/../../../SharedFrameworks/ork/Versions/A/DVTFoundation Expected in: /Applications//Contents/Developer/usr/bin/../../../Frameworks/ in /Applications//Contents/Developer/usr/bin/../../../SharedFrameworks/ork/Versions/A/DVTFoundationAbort trap: 6记录一下有用的东西:xcode-select 命令这个命令用来输出或者改变活跃的开发者目录的路径,而这个路径控制着哪个工具会被用于Xcode命令行工具(Xcode command linetools)(例如xcodebuild)以及BSD开发命令(例如cc、make)。
(相当于设置一个环境变量吧)xcode-select -p // 显示当前设置的路径sudo xcode-select --switch /Applications//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: 列出目标文件的依赖。swift版本和code 10.1 只支持swift4(终端 输入swift 就能看到版本),从10.2版本开始内嵌的swift5的libswiftCore(就是swift的标准库),我是10.1升级到11的,在Xcode中的Contents-》Framework中还是遗留着swift4 的 (正常情况下应该是没有这些个关于swift的库文件的)。
而DVTFoundation文件(已经是swift5的写代码了) 引用 的路径 可能:优先Xcode的Frameworks路径如果没有,则寻找其他可执行路径(可以猜一下,可能是:对应模拟器/真机执行文件路径或者系统路径之类)因为在 Frameworks 中找到了,所以本来应该用5的,用成了4的,然后4里面没有那个symbol就出错了(可以直接把在Contents-》Framework中这些swift相关的库给删了看看行不行呗,我已经重装了没法测试了)macOS本身自带swift命令行 /Library/Developer/CommandLineTools/usr/lib/swift/macosx/查看dylib文件的网站MachOView查看mac可执行文件DVTFoundation 是mach-o文件搜索命令 find / -namesudo find / -name udo find / -name DVTFoundation8)ld: library not found for -lstdc++.6.0.9打开xcode工程,在Build Phases > Link Binary With Libraries 中的 右键 find in finder 中确实没有反应。所以从别的好用的xcode中拷贝一个到一下这个目录中Content/Developer/Platforms/rm/Developer/SDKs//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,就下对应的然后进行放到 /Applications//Contents/Developer/Platforms/rm/DeviceSupport 下然后再试试还是一样的提示的话就重启xcode 重新build 重新插拔手机,重启了电脑 应该就行了11) http请求被阻止了,在infolist上添加设置
说要看NSURLError:再搜NSURLError:说明是因为超时了所以加载失败。20)证书过期了需要重新安装新的证书,新的描述文件。新的描述文件中是要对应的新的证书。安装成功了新的证书,登录 钥匙串中肯定会多一个选项的。(跟他们说dis证书过期了,合作方的ios开发居然只给我了只两个新的描述文件、、、然后跟他们又说了一遍,又跟了我一个dev证书,还怀疑我没有安装成功,告诉我要输入密码、、、然后又跟他们详细描述说了一遍,才给了一个正确的dis证书)每次安装完新的证书以后,如果要脚本自动打包的话,第一次都需要用手动打包,弹出如下图,点击始终允许:21)dyld: Library not loaded: @rpath/ork 动态库22)No certificate for team matching 'iPhone Distribution23)malloc: *** error for object 0x1018ad6a0: pointer being freed was not allocated三.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证书 如何用在开发者网站上申请证书,下载证书。1)证书分类:开发证书(Development) : 用于开发阶段真机调试等 不仅在配置该电脑的证书可以使用,还可以生成副本安装到多台电脑上。(通过KeyChain)发布证书(Production): 用于提交到App store,或者是ad-hoc distribution): 只有配置该证书的电脑才可以使用。导出副本也没用。无论是什么开发者账号类型,都有这两种证书类型。2)证书申请流程:1.创建证书申请文件(csr):钥匙串-证书助理-从证书颁发机构请求证书。2.上传csr:登陆开发者网站,申请证书,选择csr上传。3.完成,下载证书到本机使用。此mac机也就是配置该证书的电脑。3)开发证书副本制作:从通过配置该证书的电脑导出.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| CodeSigning3.证书描述文件证书描述文件包含三个东西:provisoning profile=AppID+Devices+DevelopmenCertificate
即在苹果开发者网站上手动创建一个 描述文件Provisioning Profile 时,需要依次指定: App ID(单选)、 证书(Certificates,可多选)、 设备(Devices,可多选)AppIDAppID 一般用反域名格式,是用来标识一个(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_provision中的信息中的名字就是 XX_dev_20200630。xcode中显示是描述文件信息中的真正的名字,而不是说描述文件这个文件名的名字,可能之前都是保持一致了导致有这种错觉没有反应过来。2.描述文件更新,证书没有做修改,不需要重新安装证书,只要重新安装描述文件就可以。3.如果是xcode中登陆了开发者账号,用这个开发者账号对应的证书 就可以不用在Provisioning Profiles下有对应的描述文件了(auto选证书 )4.总结:证书类型开发证书发布证书dev:1.不能发布上appstore。描述文件类型ad-hoc:1.需要添加设备的udid到证书上。dis:1.用于发布到appstore上用的。2.发布到store上之前,不用越狱的手机装不了。in-house:1.不能发布到appstore上。2.可以安装到任何苹果的设备。2.需要添加设备的udid到证书上。3.可以安装到真机上进行99刀/year299刀/year2.一般用于产品上线前一周测试,用来模拟从有3.不能调试。有无无有调试。有有苹果下载的。四.关于app和ipa:一直不明白app和ipa有什么区别1. app 右键显示包内容,即bundle with excutable and resourcesexcutable:Mach-0 是ios的可执行文件resources:Resources文件夹和
Mac 下的软件大部分都只有一个 .app 目录,里面包含了程序全部资源和可执行文件。简单来说,Mac 下的软件就像是 Windows 下的绿色软件一样,解压后即可使用,不需要安装.ipa ipa 格式可以视为这种 .app 软件的衍生物。安装到手机上的生成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 OSAssetBundle" 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文件ts:——icon图片和launchimage图片Classes:代码相关 Unity引擎中拷贝过来的mm。 Native文件夹——IL2CPP的,就是Unity中的那些C#文件。Bulk_Assembly-CSharp_数字.cppFrameworks: 用到的一些库以及外部进去的库以及一些打包的资源 .bundle .frameworkLibraries: Plugins文件夹:Unity工程下的Plugins文件夹下的关于ios的.a .mm .h .m文件 其他不知道啥1)引擎接口函数“Switch Platform”ActiveBuildTarget() //切换平台函数 编辑器模式下运行BuildTarget //当前平台变量ps:This method is not available when running the Editor in batch mode. 在使用命令行调用执行到这个SwitchActiveBuildTarget“Copy PDB files” PC Mac Linux// 导出pdb文件函数tformSettings("Standalone", "CopyPDBFiles", "true");// 不导出pdb文件函数tformSettings("Standalone", "CopyPDBFiles", "false");“PlayerSettings”1)宏定义 iptingDefineSymbolsForGroup(targetGroup); //所有宏定义 ; 分割 iptingDefineSymbolsForGroup(targetGroup, sz); //写入全部宏,相当于改配置2)app版本相关 Version string类型--》playersetting界面中的"Version" (界面中加*就代表多个平台公用) umber string类型---》playersetting界面中的"Build"
VersionCode int类型---》playersetting界面中的 "Bundle Version Code" 一般都用buildcount来赋值,构建次数,每进行一次build都加1,其值存在于打包的机器上,(key名字) ,Windows机器放在注册表里,Softwarre-》公司名-》产品名,Mac机器放在 ~/library/preferences/com.[公司名].[产品名].plist
安卓版本同一个app的bundleVersionCode,一定要每个发布的版本其值要一直增大,不管是不是已经更新了版本。 ios版本同一个app的buildNumber,在版本号version不变的情况下需要一直增大build号,否则就没有要求。“Development Build” “Autoconnect Profiler” if (pment) { _opt |= pment; if (tProfiler) _opt |= tWithProfiler; } pment 是否是开发版本 tProfiler 是否连接分析器“Build” // levels The scenes to be included in the build. If empty, the currently open scene will be built. Paths are relative to theproject folder (Assets/MyLevels/). // 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. layer(, para1, para2, para3);2)打包unity命令BuildiOS调用的这个静态函数就需要用到上述介绍的那些个接口函数 cmd = plistConfig["UnityPath"] + " -batchmode -quit -logfile /dev/stdout -projectPath " + unity_project_path + " -executeMethod OS" 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+ "/" if not execute_cmd(cmd): print "chmod +x fail" cmd = "chmod +x "+ path+ "/MapFileParser" if not execute_cmd(cmd): print "chmod +x fail" MapFileParser:The MapFileParser is a utility that parser the linker map file for a few different compilers and generatesa binary output file with the information that the IL2CPP runtime needs to generate correct managed stack is partof the generated Xcode project because it must run after the linker completes. You should see it run as part of a post buildscript in the Xcode project. 2.拷贝一些资源 icon 图片 ==》 Unity-iPhone/ts/nset launchimage 图片 ==》 Unity-iPhone/ts/LaunchImage_Image 权限文件entitlement文件 ==》Unity-iPhone/ements在 TARGETS --->Capabilities 里边打开了一些功能,就会生成一个对应的entitlement文件下面是开启了aps-environment 和 associated-domains的开关的entitlements内容
2)增加依赖库和框架
xcode的Xcode
2023年12月2日发(作者:剑若)
Unity打IOS版本遇到的问题(总) 工作中是使用的是python脚本自动化打包IOS(unity导出成xcode工程,然后xcode工程再打包成ipa)。打包大概流程以及一些操作的功能将在第五部分中介绍。 先介绍在打包中涉及到证书,证书描述文件在第一和第三部分中介绍。 第二部分记录一些错误的解决方案。 第四部分介绍一些知识,比如app和ipa的区别。目录一:一些值的查看比较杂乱,就是一些值如何查看1. 查看证书的描述文件的uuid字段值证书的描述文件也就是 后缀是 .mobileprovision 的文件。方法一:到 存放路径 ~/Library/MobileDevice/Provisioning Profiles 中查看,这下面的都是已经安装到电脑上的证书的描述文件了。比如provision,其中 前面的那一长串数字xxxxx就是PROVISIONING_PROFILE的值。方法二:如果是没有安装到电脑上的证书,用命令行查看 security cms -D -i provision,找到其 uuid 字段值。2. 查看证书的描述文件的加入的设备ID方法一:mobileprovision 文件右键,显示简介可以看到所有的加入该设备ID方法二:同样是用命令行 security cms -D -i provision
3.查看证书的名字方法一:mobileprovison文件中的右键简介中看到,CERTIFICATES中的Name即是.方法二:应用程序-》实用工具-》钥匙串,找到对应的证书,右键显示简介中的"常用名称"如果描述文件中添加了新的设备,在mac机上双击以后, 在~/Library/MobileDevice/Provisioning Profiles 下会生成新的mobileprovision文件。4.手机设备的udid方法一:把设备连上Mac,打开iTunes点击UDID可以切换看其他信息,需要复制,右键即可。方法二:连上itools 显示更多。方法三:连上xcode看。方法四:蒲公英网站查询
(还可以使用蒲公英进行内测分发,不过需要软件著作权等资质文件,要不然过一会就会被下架不能下载了内测分发:上传ipa进行,生成一个落地页,别人通过这个页面有个安装按钮就可以直接安装了)的UUID值方法一:在终端输入“defaults read /Applications//Contents/Info DVTPlugInCompatibilityUUID”方法二:在应用程序-Xcode-右键显示包内容-里找到DVTPlugInCompatibilityUUID 对应的value(其实就是执行上面那个命令行做的事情)6.查看静态库包含的cpu架构代码打开console终端,执行下列命令lipo -info xxxx.a(静态库路径)
进行测试facebook分享有一个软件veee+ 但是需要郭歪的appleid登陆所以申请一个没曲的appleid,登陆,然后是没曲的applestore了
然后下载veee+,不过有一个小时的免费使用时间。DisplayName 安装的时候显示的名字 BundleName询问的时候使用的名字看 版本号和build号执行 mv 转成zip包,然后解压,看包内容,里面的。命令行:unzip Payloadcd n 的关于 view和controller的apiUnityGetGLViewController()UnityGetGLView()头文件:#import "UnityAppController.h"#import "UnityInterface.h"下载svn苹果开发者工具不再支持svn,下载了苹果开发者工具也没有用了。所以下载 安装Homebrew
使用他来安装svn:执行 brew install svnwhich svnwhere svnsvn --version二. 一些错误提示这一部分比较杂乱琐碎,记录一些遇到的错误。1)in升级了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/in' not present inDVTPlugInCompatibilityUUIDs解决办法:找到 /Applications/Unity/PlaybackEngines/iOSSupport/Tools/OSX/in ,右键显示包内容-
在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//Contents/Developer/Platforms/rm/Developer/usr/bin/并且执行命令:
sudo xcode-select -switch /Applications//Contents/Developer/chmod +x /Applications//Contents/Developer/Platforms/rm/Developer/usr/bin/PackageApplication3)Fatal Error The Project is on case sensitive 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 armv64build的device选:Generic IOS Device可能的原因2:缺少了库,所以找不到应该有的函数。接sdk的时候增加了一个功能苹果登陆(苹果现在要求有三方登录就必须有苹果登录)这个是苹果登录需要导入一个库,ork解决办法:导入库ork,确保是xcode11编译才行6)解锁钥匙串 codesign failed with exit code 1使用jenkins打版本的时候,出现如下错误:: errSecInternalComponentCommand /usr/bin/codesign failed with exit code 1或者Command CodeSign failed with a nonzero exit code可能原因1:查看是否设置了解锁钥匙串的登陆密码,如果没有,在进行xcode的编译前加上:("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_A11CBridgeablePTlxcode原来是10,后来升级了11, 然后正常跳出来同意协议,结果点Agree 没有反应,一直卡在Xcode And IOS SDK LicenseAgreement,后来查到用命令行:sudo xcodebuild -license执行跳出上面这个错误
dyld: Symbol not found: _$s15_ObjectiveCTypes01_A11CBridgeablePTl Referenced from: /Applications//Contents/Developer/usr/bin/../../../SharedFrameworks/ork/Versions/A/DVTFoundation Expected in: /Applications//Contents/Developer/usr/bin/../../../Frameworks/ in /Applications//Contents/Developer/usr/bin/../../../SharedFrameworks/ork/Versions/A/DVTFoundationAbort trap: 6记录一下有用的东西:xcode-select 命令这个命令用来输出或者改变活跃的开发者目录的路径,而这个路径控制着哪个工具会被用于Xcode命令行工具(Xcode command linetools)(例如xcodebuild)以及BSD开发命令(例如cc、make)。
(相当于设置一个环境变量吧)xcode-select -p // 显示当前设置的路径sudo xcode-select --switch /Applications//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: 列出目标文件的依赖。swift版本和code 10.1 只支持swift4(终端 输入swift 就能看到版本),从10.2版本开始内嵌的swift5的libswiftCore(就是swift的标准库),我是10.1升级到11的,在Xcode中的Contents-》Framework中还是遗留着swift4 的 (正常情况下应该是没有这些个关于swift的库文件的)。
而DVTFoundation文件(已经是swift5的写代码了) 引用 的路径 可能:优先Xcode的Frameworks路径如果没有,则寻找其他可执行路径(可以猜一下,可能是:对应模拟器/真机执行文件路径或者系统路径之类)因为在 Frameworks 中找到了,所以本来应该用5的,用成了4的,然后4里面没有那个symbol就出错了(可以直接把在Contents-》Framework中这些swift相关的库给删了看看行不行呗,我已经重装了没法测试了)macOS本身自带swift命令行 /Library/Developer/CommandLineTools/usr/lib/swift/macosx/查看dylib文件的网站MachOView查看mac可执行文件DVTFoundation 是mach-o文件搜索命令 find / -namesudo find / -name udo find / -name DVTFoundation8)ld: library not found for -lstdc++.6.0.9打开xcode工程,在Build Phases > Link Binary With Libraries 中的 右键 find in finder 中确实没有反应。所以从别的好用的xcode中拷贝一个到一下这个目录中Content/Developer/Platforms/rm/Developer/SDKs//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,就下对应的然后进行放到 /Applications//Contents/Developer/Platforms/rm/DeviceSupport 下然后再试试还是一样的提示的话就重启xcode 重新build 重新插拔手机,重启了电脑 应该就行了11) http请求被阻止了,在infolist上添加设置
说要看NSURLError:再搜NSURLError:说明是因为超时了所以加载失败。20)证书过期了需要重新安装新的证书,新的描述文件。新的描述文件中是要对应的新的证书。安装成功了新的证书,登录 钥匙串中肯定会多一个选项的。(跟他们说dis证书过期了,合作方的ios开发居然只给我了只两个新的描述文件、、、然后跟他们又说了一遍,又跟了我一个dev证书,还怀疑我没有安装成功,告诉我要输入密码、、、然后又跟他们详细描述说了一遍,才给了一个正确的dis证书)每次安装完新的证书以后,如果要脚本自动打包的话,第一次都需要用手动打包,弹出如下图,点击始终允许:21)dyld: Library not loaded: @rpath/ork 动态库22)No certificate for team matching 'iPhone Distribution23)malloc: *** error for object 0x1018ad6a0: pointer being freed was not allocated三.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证书 如何用在开发者网站上申请证书,下载证书。1)证书分类:开发证书(Development) : 用于开发阶段真机调试等 不仅在配置该电脑的证书可以使用,还可以生成副本安装到多台电脑上。(通过KeyChain)发布证书(Production): 用于提交到App store,或者是ad-hoc distribution): 只有配置该证书的电脑才可以使用。导出副本也没用。无论是什么开发者账号类型,都有这两种证书类型。2)证书申请流程:1.创建证书申请文件(csr):钥匙串-证书助理-从证书颁发机构请求证书。2.上传csr:登陆开发者网站,申请证书,选择csr上传。3.完成,下载证书到本机使用。此mac机也就是配置该证书的电脑。3)开发证书副本制作:从通过配置该证书的电脑导出.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| CodeSigning3.证书描述文件证书描述文件包含三个东西:provisoning profile=AppID+Devices+DevelopmenCertificate
即在苹果开发者网站上手动创建一个 描述文件Provisioning Profile 时,需要依次指定: App ID(单选)、 证书(Certificates,可多选)、 设备(Devices,可多选)AppIDAppID 一般用反域名格式,是用来标识一个(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_provision中的信息中的名字就是 XX_dev_20200630。xcode中显示是描述文件信息中的真正的名字,而不是说描述文件这个文件名的名字,可能之前都是保持一致了导致有这种错觉没有反应过来。2.描述文件更新,证书没有做修改,不需要重新安装证书,只要重新安装描述文件就可以。3.如果是xcode中登陆了开发者账号,用这个开发者账号对应的证书 就可以不用在Provisioning Profiles下有对应的描述文件了(auto选证书 )4.总结:证书类型开发证书发布证书dev:1.不能发布上appstore。描述文件类型ad-hoc:1.需要添加设备的udid到证书上。dis:1.用于发布到appstore上用的。2.发布到store上之前,不用越狱的手机装不了。in-house:1.不能发布到appstore上。2.可以安装到任何苹果的设备。2.需要添加设备的udid到证书上。3.可以安装到真机上进行99刀/year299刀/year2.一般用于产品上线前一周测试,用来模拟从有3.不能调试。有无无有调试。有有苹果下载的。四.关于app和ipa:一直不明白app和ipa有什么区别1. app 右键显示包内容,即bundle with excutable and resourcesexcutable:Mach-0 是ios的可执行文件resources:Resources文件夹和
Mac 下的软件大部分都只有一个 .app 目录,里面包含了程序全部资源和可执行文件。简单来说,Mac 下的软件就像是 Windows 下的绿色软件一样,解压后即可使用,不需要安装.ipa ipa 格式可以视为这种 .app 软件的衍生物。安装到手机上的生成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 OSAssetBundle" 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文件ts:——icon图片和launchimage图片Classes:代码相关 Unity引擎中拷贝过来的mm。 Native文件夹——IL2CPP的,就是Unity中的那些C#文件。Bulk_Assembly-CSharp_数字.cppFrameworks: 用到的一些库以及外部进去的库以及一些打包的资源 .bundle .frameworkLibraries: Plugins文件夹:Unity工程下的Plugins文件夹下的关于ios的.a .mm .h .m文件 其他不知道啥1)引擎接口函数“Switch Platform”ActiveBuildTarget() //切换平台函数 编辑器模式下运行BuildTarget //当前平台变量ps:This method is not available when running the Editor in batch mode. 在使用命令行调用执行到这个SwitchActiveBuildTarget“Copy PDB files” PC Mac Linux// 导出pdb文件函数tformSettings("Standalone", "CopyPDBFiles", "true");// 不导出pdb文件函数tformSettings("Standalone", "CopyPDBFiles", "false");“PlayerSettings”1)宏定义 iptingDefineSymbolsForGroup(targetGroup); //所有宏定义 ; 分割 iptingDefineSymbolsForGroup(targetGroup, sz); //写入全部宏,相当于改配置2)app版本相关 Version string类型--》playersetting界面中的"Version" (界面中加*就代表多个平台公用) umber string类型---》playersetting界面中的"Build"
VersionCode int类型---》playersetting界面中的 "Bundle Version Code" 一般都用buildcount来赋值,构建次数,每进行一次build都加1,其值存在于打包的机器上,(key名字) ,Windows机器放在注册表里,Softwarre-》公司名-》产品名,Mac机器放在 ~/library/preferences/com.[公司名].[产品名].plist
安卓版本同一个app的bundleVersionCode,一定要每个发布的版本其值要一直增大,不管是不是已经更新了版本。 ios版本同一个app的buildNumber,在版本号version不变的情况下需要一直增大build号,否则就没有要求。“Development Build” “Autoconnect Profiler” if (pment) { _opt |= pment; if (tProfiler) _opt |= tWithProfiler; } pment 是否是开发版本 tProfiler 是否连接分析器“Build” // levels The scenes to be included in the build. If empty, the currently open scene will be built. Paths are relative to theproject folder (Assets/MyLevels/). // 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. layer(, para1, para2, para3);2)打包unity命令BuildiOS调用的这个静态函数就需要用到上述介绍的那些个接口函数 cmd = plistConfig["UnityPath"] + " -batchmode -quit -logfile /dev/stdout -projectPath " + unity_project_path + " -executeMethod OS" 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+ "/" if not execute_cmd(cmd): print "chmod +x fail" cmd = "chmod +x "+ path+ "/MapFileParser" if not execute_cmd(cmd): print "chmod +x fail" MapFileParser:The MapFileParser is a utility that parser the linker map file for a few different compilers and generatesa binary output file with the information that the IL2CPP runtime needs to generate correct managed stack is partof the generated Xcode project because it must run after the linker completes. You should see it run as part of a post buildscript in the Xcode project. 2.拷贝一些资源 icon 图片 ==》 Unity-iPhone/ts/nset launchimage 图片 ==》 Unity-iPhone/ts/LaunchImage_Image 权限文件entitlement文件 ==》Unity-iPhone/ements在 TARGETS --->Capabilities 里边打开了一些功能,就会生成一个对应的entitlement文件下面是开启了aps-environment 和 associated-domains的开关的entitlements内容
2)增加依赖库和框架
xcode的Xcode