首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之IOS全自动打包生成ipa(六十八)
2014
06-11

Unity3D研究院之IOS全自动打包生成ipa(六十八)

接着上一篇文章, 自动生成framework,这篇文章我把shell自动化打包ipa整理了一下,希望大家喜欢,嘿嘿。。 建议大家先看一下上一篇文章。 http://www.xuanyusong.com/archives/2720

首先我们要先搞清楚nity全自动打包的重要步骤。

1.自动生成xcode工程。

2.自动生成.ipa和dsym文件。

3.上传appstore(本篇略)

首先我们在做渠道包时,一般每个渠道都有自己一些特殊的需求,比如 游戏名子 、游戏图标、SDK、等等。那么我在在做自动化打包的工具时,需要把渠道作为参数传入shell脚本中,如下图所示开始运行我的shell脚本,这里只接收一个参数,其实就是告诉脚本你要打什么渠道的包,这里我写91。

 

Unity3D研究院之IOS全自动打包生成ipa(六十八) - 雨松MOMO程序研究院 - 1

脚本比较简单,原理就是先生成xcode工程,然后接着生成.ipa 。 代码中的$1 就表示我传入的第一个参数 91字符串。

UNITY_PATH :就是unity安装的路径, 如果你不改Unity的名子Mac上就会是这个路径。

PEOJECT_PATH:这个是你游戏工程的路径。。就是 Assets/上一级的哪个路径。。

BUILD_IOS_PATH:这个是我打包生成ipa的一个脚本,后面我会细说我目前把这个脚本放在我的游戏工程里, 所以他是一个相对路径。

XCODE_PATH:这个是生成xcode工程的路径,因为可能有很多渠道,所以我就传入的91字符串作为文件名。

脚本执行的过程,无需打开unity工程,它会自动打开unity工程,自动构建xcode工程,自动关闭unity工程,然后自动打包。。如下图所示,看到这样的字样你的IPA就生成完毕了。

Unity3D研究院之IOS全自动打包生成ipa(六十八) - 雨松MOMO程序研究院 - 2

然后你的.ipa和dsym文件就安安静静的放在build文件夹下,项目根目录/91/build文件夹下面,dsym文件也放在下面,如果你的渠道包比较多的话,你可以把它们统一移动到一个文件夹下面。还有dsym一定要打出来,因为只有dsym 和 .crash文件才能解析出 c#代码中哪个调用方法出的错, 以后有时间了我会整理以下dsym和.crash文件怎么解析出c#错误的堆栈来。。

Unity3D研究院之IOS全自动打包生成ipa(六十八) - 雨松MOMO程序研究院 - 3

ipa是出来了, 不过我们还是要看看它到底是怎么出来了。。在shell脚本中我调用了

 它的意思就是自动打开unity,然后打开你的游戏工程,然后调用ProjectBuild类中的BuildForIPhone的这个方法,然后关闭unity。ProjectBuild类是我自己写的,大家也可以定制自己的类 和方法,static的就可以。

这里有个比较重要的参数 project-$1 这个参数就是外面我们传进来的 91 字符串。 这个字符串很重要,因为工程里面构建的时候需要根据不同的渠道打包不同的资源 包名 文件名 等等。我们在看看 ProjectBuild.cs

 你可以在打包之前 去修改projectSetting的参数, 比如 包名 游戏名 icon 等等 http://docs.unity3d.com/Manual/class-PlayerSettings.html

OK shell脚本中就直接开始构建你的xcode工程。还记得上一篇文章我提到的XUPorter吗?它的原理就是当Xcode打完完毕后开始动态的编辑 framework plist oc代码。。 我们在回到XUPorter XCodePostProcess.cs这个类里面, 如果没看过我上一篇文章的 我建议看一下。。

下面的代码 上一篇文章我已经介绍的很清楚了, 这里就不赘述了。主要看 54行 – 64行之间的代码。

 

 OK 到这一步我们的xcode工程已经做完。。 然后Shell 脚本开始 生成.ipa文件。

#开始生成ipa#
$BUILD_IOS_PATH $PROJECT_PATH/$1 $1

上面代码的意思 就是 去调用我工程里面的buildios.sh文件。 需要传入两个参数 一个是 xcode工程的地址, 一个是 ipa的名子。。。 这个脚本我参考了 http://blog.csdn.net/ccf0703/article/details/7999112 这篇文章, 但是 最后生成ipa我没能成功, 自己又修改了一点。。

 OK,到这一步我们的教程就完毕了。。因为工程中涉及到我项目用的证书啊什么的,所以我不能给出来。 所以我把你需要修改的地方列出来。

1.在关闭unity的状态下 运行 build脚本。 直接把build.sh 拖入终端里  然后空格  加一个你定义的参数  下图是我测试工程的目录结构。

Unity3D研究院之IOS全自动打包生成ipa(六十八) - 雨松MOMO程序研究院 - 4

2.在XCodePostProcess.cs 里面 把证书 还有包名 修改成你的。。

3.你的shell脚本需要给它权限  代码很简单  chmod +x build

4.我的工程下载地址:http://pan.baidu.com/s/1gd242dl

如果我说的上面三点你都修改完毕, 那么这个代码必然会帮你自动生成.ipa

本篇文章我主要给出一个大概的思路,大家可以在我的思路下去拓展,比如 一键打包多个渠道、 打包完毕后自动上传svn等操作。。

有问题 给我留言吧, 嘿嘿!!!

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

Unity3D研究院之IOS全自动打包生成ipa(六十八)》有 81 条评论

  1. 对视 说:

    bogon:~ jiaojunhao$ /Users/jiaojunhao/Desktop/UnityProjects/Buildipa/Assets/shell/build.py 91XCODE工程生成完毕The first param is not a dictionary.ipa生成完毕这异常是那里出问题,参照文章修改如下:修改1:build.sh没有这文件撒,shell里只有build.py拖到终端里。修改2:在XCodePostProcess.cs 里面 把证书 还有包名 修改成你的。。 我这里用是开发者账号等的证书,常用名称:Phone Distribution: Guizhou Yun Chen Tuo Yuan Network Technology Co., Ltd. (HXQSKN4F99) 。修改包名没看到修改的地方 if(projectName== “91”) 这个是判断输入的时候判断用的。修改3:你的shell脚本需要给它权限 代码很简单 chmod +x build,这权限怎么添加?用的是下载的工程源码修改的。修改4:build.py 里 修改了路径#UNITY程序的路径#UNITY_PATH=/Applications/Unity5.3.4f1/Unity.app/Contents/MacOS/Unity#游戏程序路径#PROJECT_PATH=/Users/jiaojunhao/Desktop/UnityProjects/NewHZZX2.0/NewHZZX请指教有那一步错了!

  2. 请问XUPorter是自己新建了一个xcode工程,然后在修改吗?还是在unity3d生成的xcode工程基础上进行修改的?我的项目代码是单独分开的,最终生成的是一个dll加到unity3d里面去,用你这种方法导出的xcode项目,会报错:dll里面的方法引用都找不到。不知道为何

  3. 小仔 说:

    我把Xcode升到了8.1后打包就报这个错,请问要怎么解决呢? 我去修改Unity4XC.xcplugin提示修改不了,需要在终端中修改,可在终端中我并不知道怎么修改。** CLEAN SUCCEEDED **/Users/chenyue_mac/Documents/testScene/1112016-11-03 11:11:06.250 xcodebuild[2665:173701] [MT] PluginLoading: Required plug-in compatibility UUID DA4FDFD8-C509-4D8B-8B55-84A7B66AE701 for plug-in at path ‘~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Unity4XC.xcplugin’ not present in DVTPlugInCompatibilityUUIDs=== BUILD TARGET Unity-iPhone OF PROJECT Unity-iPhone WITH THE DEFAULT CONFIGURATION (Release) ===Check dependenciesUnity-iPhone requires a provisioning profile. Select a provisioning profile for the “Release” build configuration in the project editor.Code signing is required for product type ‘Application’ in SDK ‘iOS 10.1’** BUILD FAILED **The following build commands failed:Check dependencies(1 failure)ChenYue-MacdeiMac:~ chenyue_mac$

  4. 小仔 说:

    我把Xcode升到了8.1后打包就报这个错,请问要怎么解决呢? 我去修改Unity4XC.xcplugin提示修改不了,需要在终端中修改,可在终端中我并不知道怎么修改。** CLEAN SUCCEEDED **/Users/chenyue_mac/Documents/testScene/1112016-11-03 11:11:06.250 xcodebuild[2665:173701] [MT] PluginLoading: Required plug-in compatibility UUID DA4FDFD8-C509-4D8B-8B55-84A7B66AE701 for plug-in at path ‘~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Unity4XC.xcplugin’ not present in DVTPlugInCompatibilityUUIDs=== BUILD TARGET Unity-iPhone OF PROJECT Unity-iPhone WITH THE DEFAULT CONFIGURATION (Release) ===Check dependenciesUnity-iPhone requires a provisioning profile. Select a provisioning profile for the “Release” build configuration in the project editor.Code signing is required for product type ‘Application’ in SDK ‘iOS 10.1’** BUILD FAILED **The following build commands failed: Check dependencies(1 failure)ChenYue-MacdeiMac:~ chenyue_mac$

  5. 雨松大大,请问mac版的U3D突然打包不了IOS工程是怎么回事?点击build之后U3D毫无反应,以前都能打包的,U3D版本是4.6.7 换了几个版本还是这样

  6. 落叶 说:

    CompileC build/Unity-iPhone.build/Release-iphoneos/Unity-iPhone.build/Objects-normal/armv7/UnityAppController.o Classes/UnityAppController.mm normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler 请问这个怎么解决?

  7. 落叶 说:

    CompileC build/Unity-iPhone.build/Release-iphoneos/Unity-iPhone.build/Objects-normal/armv7/UnityAppController.o Classes/UnityAppController.mm normal armv7 objective-c++ com.apple.compilers.llvm.clang.1_0.compiler 请问这个怎么解决?

  8. 陆宇杨 说:

    有个问题,我知道结果了,但我更想知道为什么会发生,怎么能这么实现的?是想好了,一直尝试的结果么?这样的话会比较累,如果是写iphone的人,或者一个程序老猿,写这种互调语法,倒不奇怪,可是雨松一直是写u3d,估计2年前与松野写不出这样的代码,就好像java 用jni调用c 一样,程序是互通的,很多人懂,但更多人不懂,也肯定会有一个过程,程序员由不懂变得秒懂,我真想知道是什么促成了这种转变

  9. 陆宇杨 说:

    有个问题,我知道结果了,但我更想知道为什么会发生,怎么能这么实现的?是想好了,一直尝试的结果么?这样的话会比较累,如果是写iphone的人,或者一个程序老猿,写这种互调语法,倒不奇怪,可是雨松一直是写u3d,估计2年前与松野写不出这样的代码,就好像java 用jni调用c++一样,程序是互通的,很多人懂,但更多人不懂,也肯定会有一个过程,程序员由不懂变得秒懂,我真想知道是什么促成了这种转变

  10. 陆宇杨 说:

    最近入手了太mac pro,正准备用用

  11. 陆宇杨 说:

    不错不错,又一个好的u3d文章

  12. 披着羊皮的狼 说:

    成功了,感谢大神! Unity3D研究院之IOS全自动打包生成ipa(六十八) - 雨松MOMO程序研究院 - 1

  13. 彭正安 说:

    大神,我在使用shell生成ipa包的成,最后有一个错误提示:error: Specified application doesn’t exist or isn’t a bundle directory : ‘/Users/pza/Desktop/auto_test/auto/build/*.app’,并且spa包没有生成出来,请大神帮忙解决一下,谢谢!!!

  14. 彭正安 说:

    在shell里面使用xcrun -sdk iphoneos PackageApplication把app自动编译成ipa文件的时候报这个错误一直找不到原因 error: Specified application doesn’t exist or isn’t a bundle directory : ‘–v’

  15. 侧耳倾听 说:

    第一次使用shell,出现如下错误:
    ZhongdpmatoMacBook-Pro:downjoyPayDemo 6 Zhongdp$
    ZhongdpmatoMacBook-Pro:downjoyPayDemo 6 Zhongdp$ xcrun -sdk iphoneos PackageApplication -v ./${appdirname}/*.app -o ${build_path}/ipa-build/${ipa_name}.ipa || exit
    error: Specified application doesn’t exist or isn’t a bundle directory : ‘./Release-iphoneos/*.app’
    logout
    请大神,这个是什么错误?qq:780713992

  16. 刘志涛 说:

    大神,为什么读取app_icon,游戏图标的时候,在有些机型的icon会有白边呢,直接读取SDK里面配置的icon,就不会i有呢

  17. ell 说:

    雨松大神,我用.net 创建了一个 wcf服务并部署到 IIS服务器上,然后我创建了一个动态库dll。在这个动态库中添加了这个wcf服务的服务引用。我将这个动态库dll引用到自己的 windows 版 unity工程中,并进行相关调用,是可以正常访问我的那个wcf服务的。 然后用 unity 打包成安卓apk,在手机上运行,也能正常访问。 将 这个动态库dll引用到 unity(mac版) 工程中,直接在工程中运行也能访问wcf服务。但是在 准备 将 unity(mac版) 工程 转换成 xcode工程 打包时,在这个转换过程中 却报错了。错误信息部分如下:Cross compilation job Mono.WebBrowser.dll failed.UnityEngine.UnityException: Failed AOT cross compiler: /Applications/Unity/Unity.app/Contents/PlaybackEngines/iossupport/Tools/OSX/mono-xcompiler-wrapper.sh –aot=full,asmonly,nodebug,nrgctx-trampolines=8096,nimt-trampolines=8096,ntrampolines=4048,static,outfile=”Mono.WebBrowser.dll.s” “Mono.WebBrowser.dll” 这是什么原因导致的呢,求大神指导。

  18. 张金华 说:

    xcodebuild -project Unity-iPhone.xcodeproj -scheme Unity-iPhone -destination generic/platform=ios archive -archivePath $archivePath #xcrun -sdk iphoneos PackageApplication -v ${build_path}/*.app -o ${build_path}/${ipa_name}.ipaxcodebuild -exportArchive -archivePath $archivePath -exportPath ${build_path}/${ipa_name}.ipa -exportFormat ipa -exportProvisioningProfile ‘iOSTeam Provisioning Profile: ‘aaaaa’这个打包出来和手动的一样大

  19. 张金华 说:

    打包回大几十M的问题,有人解决了吗

  20. 枫叶 说:

    大神我问下 在xcodebuild || exit 之后我加了CODE_SIGN_IDENTITY=iPhone Developer:taoye ,是为了希望用shell自动选择开发者账号,就不用进去设置了再build,但是发现怎么都不成功,请问有什么好方法设置开发者账号们?

  21. 大神在上请受小弟一拜 说:

    MoMo大神,资源包下载了,但是导入不进去啊,我的unity是4.6.6f2,不知道是不是版本问题,如果是的话,请问能不能提供一下这个版本的package啊

  22. 你好,我经过测试成功了, 但是每次执行命令,unity打开后会重新import 资源,非常慢.

  23. 莫雨 说:

    求教,我想问一下打包之后里面的GI文件夹是可以清的么?这个大小也不小.如果只用烘焙,不用实时GI这个也是必须的么?

  24. 求教 说:

    怎么自动更改图标?

    • 雨松MOMO 说:

      xcode 工程生成以后 用shell 拷贝就行了

      • 求教 说:

        恩,我现在就是这么做的,不过又遇到一个问题就是UnityAppController里的修改,如果很多的话,再用EditorCode的话就会很复杂而且不好实现。如果像 “虔诚的基督徒”这位前辈说的派生一个类的话,该怎么导入到xcode工程呢?

        • 雨松MOMO 说:

          UnityAppController 这里的修改, 在 c#里面改就可以了啊。xcode工程生成出来以后, UnityAppController.mm 就是个文件, 用IO就可以操作这个了。。

          • 求教 说:

            遇到个问题是UnityAppController.WriteBelow()这个方法的参数,如果包含xcode中字符串@“”就会报错,@””内的内容显示时黑色。。

  25. 凳子 说:

    unity5.0打包不行了,4.6一直用这个

  26. 段山峰 说:

    大神,求教一下,我执行shell后,生成xcode没有问题,但是转ipa的时候,会提示uuid报错,这个是什么原因?好纠结,有知道的朋友也可以指点下,谢谢

  27. TrustTJM 说:

    谢谢哈,受教了。我也顺便把我的收获分享出来哈。如果是为了快速Build可以加上project.overwriteBuildSetting (“DEBUG_INFORMATION_FORMAT”, “dwarf”, “Release”);project.overwriteBuildSetting (“DEBUG_INFORMATION_FORMAT”, “dwarf”, “Debug”);如果怕build好了不能提示可以在.py最后加上say -v Ting-Ting xxxx,她就会自动说话了,在设置那里设置一下就行了

  28. 杨旸 说:

    请问我测试时编译xcode工程,提示CpResource错误,需要拷贝的sdk资源的确路径不对,显示的路径为我的用户名 /Assets/XUPorter/Mods/ShareSDK/,我生成的工程不是在Unity工程下,而是在桌面上,是因为这个原因吗?

  29. 杨旸 说:

    请问我测试时编译xcode工程,提示CpResource错误,需要拷贝的sdk资源的确路径不对,显示的路径为我的用户名+/Assets/XUPorter/Mods/ShareSDK/,我生成的工程不是在Unity工程下,而是在桌面上,是因为这个原因吗?

  30. 请问我测试的时候会自动打开unity进行build,但是用的实际工程里就会打开unity然后秒退。有什么解决方案么~~~ Unity3D研究院之IOS全自动打包生成ipa(六十八) - 雨松MOMO程序研究院 - 1

    • 雨松MOMO 说:

      是不是你的代码报错了?

      • momo说的代码报错是指我的项目里还是执行shell脚本报的错呢?今天又试了一下,执行后打开unity会build一会,然后关闭了unity。 Unity3D研究院之IOS全自动打包生成ipa(六十八) - 雨松MOMO程序研究院 - 1 然后控制台显示“The first param is not a dictionary”,这个应该是unity没有build出来xcode可执行的文件夹。

        • 后来找到原因了。PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.iPhone, “USE_SHARE”);这里是更改unity里iphone的标签为USE_SHARE,我自己定义的标签为PPSDK。我有个变量是在ppsdk下定义的,所以标签更改了所以定义找不到了,unity build的时候直接报错了。

  31. 请教者 说:

    请问一直在提示一个证书验证错误是什么情况啊

  32. Guccang 说:

    一键打包生成的ipa安装后比xcode打包的大了近30M而这个30M就是 Unix可执行文件 多出来的30M求解答。谢谢MOMO

  33. Guccang 说:

    你好MOMO,我是用xcode打包的app文件90M,ipa 35M ,一键打包的app文件120M,ipa 40M左右, 是Unix可执行文件几乎变大了一倍,就MOMO给个编译参数,将其生成的Unix可执行文件变小一点。谢谢。

    • 雨松MOMO 说:

      xcrun /usr/bin/xcrun -sdk iphoneos PackageApplication -v “${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app” -o “${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa” –sign “${DEVELOPER_NAME}” –embed “${PROVISONING_PROFILE}”像这样。。把证书 还有 mobileprovision 在这里传进去 打包试试。。

  34. MOMO大神,请问下, 用u3d 打包, 我的类里面 包含了 自动arc模式, 怎么在uinty3d工程里找到xcode里的 Compile Sources目录里面的需要的类里写入 (-fobjc-arc) 呢?

  35. Paul 说:

    解决了吗? 路径上确实有这个东西

  36. Killliu 说:

    CompileC build/Unity-iPhone.build/Release-iphoneos/Unity-iPhone.build/Objects-normal/armv7/UnityAppController.o Classes/UnityAppController.mm normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compilerMOMO 大神,这是什么原因啊!求救命!在线等

  37. Killliu 说:

    CompileC build/Unity-iPhone.build/Release-iphoneos/Unity-iPhone.build/Objects-normal/armv7/UnityAppController.o Classes/UnityAppController.mm normal armv7 objective-c++ com.apple.compilers.llvm.clang.1_0.compilerMOMO 大神,这是什么原因啊!求救命!在线等

  38. 雨凇momo 说:

    Code Sign error: No matching codesigning identity found: No codesigning identities (i.e. certificate and private key pairs) matching “iPhone Developer:mi zhou(WFZN8QWUAV)” were found.CodeSign error: code signing is required for product type ‘Application’ in SDK ‘iOS 8.0’急急急急急急急急急急急急急急!在线等!!这是什么原因啊?怎么破?大神求解脱!!!!

  39. IT菜鸟 说:

    好烦啊,看了好久都弄不对,好菜啊

  40. 木偶 说:

    在shell里面使用xcrun -sdk iphoneos PackageApplication把app自动编译成ipa文件的时候报这个错误一直找不到原因 error: Specified application doesn’t exist or isn’t a bundle directory : ‘–v’

  41. changemoon7 说:

    看了微博追过来的,第一个帮顶,感谢分享 Unity3D研究院之IOS全自动打包生成ipa(六十八) - 雨松MOMO程序研究院 - 1

留下一个回复

你的email不会被公开。