iOS自动打包并发布脚本

作者: CaryaLiu | 来源:发表于2015-11-27 22:58 被阅读24933次

    欢迎到我的 个人博客 http://liumh.com 浏览此文

    本文最终实现的是使用脚本打 Ad-hoc 包,并发布测试,当然稍微修改一下脚本参数就可以打其他类型的 ipa 包了。另外该脚本还实现了将生成的 ipa 包上传至蒲公英进行测试分发。文中内容包括:

    1. xcodebuild 简介
    2. 使用xcodebuild和xcrun打包签名
    3. 将打包过程脚本化

    xcodebuild 简介

    xcodebuild 是苹果提供的打包项目或者工程的命令,了解该命令最好的方式就是使用 man xcodebuild 查看其 man page. 尽管是英文,一定要老老实实的读一遍就好了。

    DESCRIPTION

    xcodebuild builds one or more targets contained in an Xcode project, or builds a scheme contained in an Xcode workspace or Xcode project.

    Usage

    To build an Xcode project, run xcodebuild from the directory containing your project (i.e. the directory containing the name.xcodeproj package). If you have multiple projects in the this directory you will need to use -project to indicate which project should be built. By default, xcodebuild builds the first target listed in the project, with the default build configuration. The order of the targets is a property of the project and is the same for all users of the project.

    To build an Xcode workspace, you must pass both the -workspace and -scheme options to define the build. The parameters of the scheme will control which targets are built and how they are built, although you may pass other options to xcodebuild to override some parameters of the scheme.

    There are also several options that display info about the installed version of Xcode or about projects or workspaces in the local directory, but which do not initiate an action. These include -list, -showBuildSettings, -showsdks, -usage, and -version.

    总结一下:

    1. 需要在包含 name.xcodeproj 的目录下执行 xcodebuild 命令,且如果该目录下有多个 projects,那么需要使用 -project 指定需要 build 的项目。
    2. 在不指定 build 的 target 的时候,默认情况下会 build project 下的第一个 target
    3. 当 build workspace 时,需要同时指定 -workspace-scheme 参数,scheme 参数控制了哪些 targets 会被 build 以及以怎样的方式 build。
    4. 有一些诸如 -list, -showBuildSettings, -showsdks 的参数可以查看项目或者工程的信息,不会对 build action 造成任何影响,放心使用。

    那么,xcodebuild 究竟如何使用呢? 继续看文档:

    NAME

    xcodebuild -- build Xcode projects and workspaces

    SYNOPSIS

    1. xcodebuild [-project name.xcodeproj] [[-target targetname] ... | -alltargets] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action ...] [buildsetting=value ...] [-userdefault=value ...]

    2. xcodebuild [-project name.xcodeproj] -scheme schemename [[-destination destinationspecifier] ...] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action ...] [buildsetting=value ...] [-userdefault=value ...]

    3. xcodebuild -workspace name.xcworkspace -scheme schemename [[-destination destinationspecifier] ...] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action ...] [buildsetting=value ...] [-userdefault=value ...]

    4. xcodebuild -version [-sdk [sdkfullpath | sdkname]] [infoitem]

    5. xcodebuild -showsdks

    6. xcodebuild -showBuildSettings [-project name.xcodeproj | [-workspace name.xcworkspace -scheme schemename]]

    7. xcodebuild -list [-project name.xcodeproj | -workspace name.xcworkspace]

    8. xcodebuild -exportArchive -archivePath xcarchivepath -exportPath destinationpath -exportOptionsPlist path

    9. xcodebuild -exportLocalizations -project name.xcodeproj -localizationPath path [[-exportLanguage language] ...]

    10. xcodebuild -importLocalizations -project name.xcodeproj -localizationPath path

    挑几个我常用的形式介绍一下,较长的使用方式以序列号代替:

    • xcodebuild -showsdks: 列出 Xcode 所有可用的 SDKs

    • xcodebuild -showBuildSettings: 上述序号6的使用方式,查看当前工程 build setting 的配置参数,Xcode 详细的 build setting 参数参考官方文档 Xcode Build Setting Reference, 已有的配置参数可以在终端中以 buildsetting=value 的形式进行覆盖重新设置.

    • xcodebuild -list: 上述序号7的使用方式,查看 project 中的 targets 和 configurations,或者 workspace 中 schemes, 输出如下:

    Information about project "NavTabBar":
        Targets:
            NavTabBar
            NavTabBarTests
            NavTabBarUITests
    
        Build Configurations:
            Debug
            Release
            Ad-hoc
    
        If no build configuration is specified and -scheme is not passed then "Release" is used.
    
        Schemes:
            NavTabBar
    
    • xcodebuild [-project name.xcodeproj] [[-target targetname] ... | -alltargets] build: 上述序号1的使用方式,会 build 指定 project,其中 -target-configuration 参数可以使用 xcodebuild -list 获得,-sdk 参数可由 xcodebuild -showsdks 获得,[buildsetting=value ...] 用来覆盖工程中已有的配置。可覆盖的参数参考官方文档 Xcode Build Setting Reference, action... 的可用选项如下, 打包的话当然用 build,这也是默认选项。

      • build
        Build the target in the build root (SYMROOT). This is the default action, and is used if no action is given.

      • analyze
        Build and analyze a target or scheme from the build root (SYMROOT). This requires specifying a scheme.

      • archive
        Archive a scheme from the build root (SYMROOT). This requires specifying a scheme.

      • test
        Test a scheme from the build root (SYMROOT). This requires specifying a scheme and optionally a destination.

      • installsrc
        Copy the source of the project to the source root (SRCROOT).

      • install
        Build the target and install it into the target's installation directory in the distribution root (DSTROOT).

      • clean
        Remove build products and intermediate files from the build root (SYMROOT).

    • xcodebuild -workspace name.xcworkspace -scheme schemename build: 上述序号3的使用方式,build 指定 workspace,当我们使用 CocoaPods 来管理第三方库时,会生成 xcworkspace 文件,这样就会用到这种打包方式.

    使用xcodebuild和xcrun打包签名

    开始之前,可以新建一个测试工程 TestImg 来练习打包,在使用终端命令打包之前,请确认该工程也可以直接使用 Xcode 真机调试成功。

    然后,打开终端,进入包含 TestImg.xcodeproj 的目录下,运行以下命令:

    xcodebuild -project TestImg.xcodeproj -target TestImg -configuration Release

    如果 build 成功,会看到 ** BUILD SUCCEEDED ** 字样,且在终端会打印出这次 build 的签名信息,如下:

    Signing Identity: "iPhone Developer: xxx(59xxxxxx)"
    Provisioning Profile: "iOS Team Provisioning Profile: *"

    且在该目录下会多出一个 build 目录,该目录下有 Release-iphoneosTestImg.build 文件,根据我们 build -configuration 配置的参数不同,Release-iphoneos 的文件名会不同。

    Release-iphoneos 文件夹下,有我们需要的TestImg.app文件,但是要安装到真机上,我们需要将该文件导出为ipa文件,这里使用 xcrun 命令。

    xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/TestImg.app -o ~/Desktop/TestImg.ipa

    这里又冒出一个 PackageApplication, 我刚开始也不知道这是个什么玩意儿,万能的google告诉我,这是 Xcode 包里自带的工具,使用 xcrun -sdk iphoneos -v PackageApplication -help 查看帮助信息.

    Usage:
    PackageApplication [-s signature] application [-o output_directory] [-verbose] [-plugin plugin] || -man || -help

    Options:

    [-s signature]: certificate name to resign application before packaging
    [-o output_directory]: specify output filename
    [-plugin plugin]: specify an optional plugin
    -help: brief help message
    -man: full documentation
    -v[erbose]: provide details during operation

    如果执行成功,则会在你的桌面生成 TestImg.ipa 文件,这样就可以发布测试了。如果你遇到以下警告信息:

    Warning: --resource-rules has been deprecated in Mac OS X >= 10.10! ResourceRules.plist: cannot read resources

    请参考 stackoverflow 这个回答

    将打包过程脚本化

    工作中,特别是所做项目进入测试阶段,肯定会经常打 Ad-hoc 包给测试人员进行测试,但是我们肯定不想每次进行打包的时候都要进行一些工程的设置修改,以及一系列的 next 按钮点击操作,现在就让这些操作都交给脚本化吧。

    1. 脚本化中使用如下的命令打包:

    xcodebuild -project name.xcodeproj -target targetname -configuration Release -sdk iphoneos build CODE_SIGN_IDENTITY="$(CODE_SIGN_IDENTITY)" PROVISIONING_PROFILE="$(PROVISIONING_PROFILE)"

    或者

    xcodebuild -workspace name.xcworkspace -scheme schemename -configuration Release -sdk iphoneos build CODE_SIGN_IDENTITY="$(CODE_SIGN_IDENTITY)" PROVISIONING_PROFILE="$(PROVISIONING_PROFILE)"

    1. 然后使用 xcrun 生成 ipa 文件:

    `xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/$(target|scheme).app"

    1. 清除 build 过程中产生的中间文件
    2. 结合蒲公英分发平台,将 ipa 文件上传至蒲公英分发平台,同时在终端会打印上传结果以及上传应用后该应用的 URL。蒲公英分发平台能够方便地将 ipa 文件尽快分发到测试人员,该平台有开放 API,可避免人工上传。

    该脚本的使用可使用 python autobuild.py -h 查看,与 xcodebuild 的使用相似:

    Usage: autobuild.py [options]

    Options:
    -h, --help: show this help message and exit
    -w name.xcworkspace, --workspace=name.xcworkspace: Build the workspace name.xcworkspace.
    -p name.xcodeproj, --project=name.xcodeproj: Build the project name.xcodeproj.
    -s schemename, --scheme=schemename: Build the scheme specified by schemename. Required if building a workspace.
    -t targetname, --target=targetname: Build the target specified by targetname. Required if building a project.
    -o output_filename, --output=output_filename: specify output filename

    在脚本顶部,有几个全局变量,根据自己的项目情况修改。

    CODE_SIGN_IDENTITY = "iPhone Distribution: companyname (9xxxxxxx9A)"
    PROVISIONING_PROFILE = "xxxxx-xxxx-xxx-xxxx-xxxxxxxxx"
    CONFIGURATION = "Release"
    SDK = "iphoneos"
    
    USER_KEY = "15d6xxxxxxxxxxxxxxxxxx"
    API_KEY = "efxxxxxxxxxxxxxxxxxxxx"
    

    其中,CODE_SIGN_IDENTITY 为开发者证书标识,可以在 Keychain Access -> Certificates -> 选中证书右键弹出菜单 -> Get Info -> Common Name 获取,类似 iPhone Distribution: Company name Co. Ltd (xxxxxxxx9A), 包括括号内的内容。

    PROVISIONING_PROFILE: 这个是 mobileprovision 文件的 identifier,获取方式:

    Xcode -> Preferences -> 选中申请开发者证书的 Apple ID -> 选中开发者证书 -> View Details... -> 根据 Provisioning Profiles 的名字选中打包所需的 mobileprovision 文件 -> 右键菜单 -> Show in Finder -> 找到该文件后,除了该文件后缀名的字符串就是 PROVISIONING_PROFILE 字段的内容。

    当然也可以使用脚本获取, 此处参考 命令行获取mobileprovision文件的UUID:

    #!/bin/bash
    if [ $# -ne 1 ]
    then
      echo "Usage: getmobileuuid the-mobileprovision-file-path"
      exit 1
    fi
    
    mobileprovision_uuid=`/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i $1)`
    echo "UUID is:"
    echo ${mobileprovision_uuid}
    

    USER_KEY, API_KEY: 是蒲公英开放 API 的密钥。

    autobuild.py脚本放在你项目的根目录下,进入根目录,如下使用:

    ./autobuild.py -w yourname.xcworkspace -s schemename -o ~/Desktop/yourname.ipa
    

    或者

    ./autobuild.py -p yourname.xcodeproj -t targetname -o ~/Desktop/yourname.ipa
    

    该脚本可在 github 查看,如有任何问题,请留言回复。


    常见问题:

    1. 找不到request module.
    import requests
    ImportError: No module named requests
    

    找不到request module,参考stackoverflow, 使用 $ sudo pip install requests或者sudo easy_install -U requests;

    1. 如果使用了上传蒲公英,且安装需要密码,请打开脚本,搜一下脚本里的password,将其值设置为空。

    ========== update 2016-12-28 ==========

    github上脚本进行更新:

    1. 使用xcodebuild -exportArchive替换PackageApplication进行打包.
    2. 解析传入参数使用argparse替换OptionParser.
    3. 去掉对PROVISIONING_PROFILECODE_SIGN_IDENTITY的配置,请使用Xcode8的自动证书管理。
    4. 新增exportOptions.plist文件,用于设置导出ipa文件的参数,该文件中的可配置参数可使用xcodebuild --help查看。
    5. 脚本传入参数去掉--target--outputipa文件默认会存放在Desktop创建诸如{scheme}{2016-12-28_08-08-10}格式的文件夹中。

    假如你的项目目录如下所示:

    |____AOP
    | |____AppDelegate.h
    | |____AppDelegate.m
    | |____Base.lproj
    | | |____LaunchScreen.xib
    | | |____Main.storyboard
    | |____Images.xcassets
    | |____Info.plist
    | |____main.m
    | |____ViewController.h
    | |____ViewController.m
    |____AOP.xcodeproj
    |____autobuild
    | |____autobuild.py
    | |____exportOptions.plist
    

    先进入autobuild目录,使用脚本打包的命令如下:

    python autobuild.py -p ../AOP.xcodeproj -s AOP

    脚本执行完毕,若成功,则会在桌面生成ipa文件。

    若是打包xcworkspace项目,则打包命令格式如下所示:

    python autobuild.py -w ../yourworkspace.xcworkspace -s yourscheme

    exportOptions.plist文件中的可选配置参数如下:

    compileBitcode : Bool
    
      For non-App Store exports, should Xcode re-compile the app from bitcode? Defaults to YES.
    
    embedOnDemandResourcesAssetPacksInBundle : Bool
    
      For non-App Store exports, if the app uses On Demand Resources and this is YES, asset   
      packs are embedded in the app bundle so that the app can be tested without a server to   
      host asset packs. Defaults to YES unless onDemandResourcesAssetPacksBaseURL is specified.
    
    iCloudContainerEnvironment
    
      For non-App Store exports, if the app is using CloudKit, this configures the   
      "com.apple.developer.icloud-container-environment" entitlement. Available options:   
      Development and Production. Defaults to Development.
    
    manifest : Dictionary
    
      For non-App Store exports, users can download your app over the web by opening your   
      distribution manifest file in a web browser. To generate a distribution manifest, the   
      value of this key should be a dictionary with three sub-keys: appURL, displayImageURL,   
      fullSizeImageURL. The additional sub-key assetPackManifestURL is required when using on demand resources.
    
    method : String
    
      Describes how Xcode should export the archive. Available options: app-store, ad-hoc,   
      package, enterprise, development, and developer-id. The list of options varies based on   
      the type of archive. Defaults to development.
    
    onDemandResourcesAssetPacksBaseURL : String
    
      For non-App Store exports, if the app uses On Demand Resources and   
      embedOnDemandResourcesAssetPacksInBundle isn't YES, this should be a base URL specifying   
      where asset packs are going to be hosted. This configures the app to download asset   
      packs from the specified URL.
    
    teamID : String
    
      The Developer Portal team to use for this export. Defaults to the team used to build the archive.
    
    thinning : String
    
      For non-App Store exports, should Xcode thin the package for one or more device   
      variants? Available options: <none> (Xcode produces a non-thinned universal app),   
      <thin-for-all-variants> (Xcode produces a universal app and all available thinned   
      variants), or a model identifier for a specific device (e.g. "iPhone7,1"). Defaults to <none>.
    
    uploadBitcode : Bool
    
      For App Store exports, should the package include bitcode? Defaults to YES.
    
    uploadSymbols : Bool
    
      For App Store exports, should the package include symbols? Defaults to YES.
    

    如果觉得本文对你有帮助,就请用微信打赏我吧_

    相关文章

      网友评论

      • CocoaH:打包成功了,但是最后上传蒲公英的时候路径不对怎么破?
        CocoaH:IOError: [Errno 2] No such file or directory: u'/Users/hankeke/Desktop/TheOnlineTax2018-05-16_17-04-58/DistributionSummary.plist\nExportOptions.plist\nPackaging.log\nTheOnlineTax.ipa'
      • 代码移动工程师:开始可以的,换了一台电脑报错。
        Traceback (most recent call last):
        File "autobuild.py", line 9, in <module>
        import requests
        ImportError: No module named request
      • f23387aa9467:workspace本地打包成功,workspace里包含一个主工程和自制静态库工程,但是脚本打包时候报错:CompileC ...... xxx.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler,具体原因是提示.m里找不到静态库的头文件...大神,请问有解决办法么?
      • iOS小洁:IOError: [Errno 2] No such file or directory: u'/Users/xyj/Desktop/BuildTest2017-12-21_17-05-03/BuildTest.ipa\nDistributionSummary.plist\nExportOptions.plist\nPackaging.log'
        上传蒲公英失败,想自己改一下的,试了半天没改好,还是看大神吧
        iLeooooo:@yajie帅 我也是三个文件拼一起了,应该怎么改啊
        iOS小洁:@CaryaLiu 知道咋回事了,文件路径获取错了,现在打完包文件夹有三个文件。文件路径把三个文件都拼上去了,中间是换行符。
        CaryaLiu:@yajie帅 你的文件路径中还有换行符?
      • YY_Lee:IDEDistributionErrorDomain Code=14 "No applicable devices found.",楼主知道这个错误是因为什么吗
      • blazer_iOS:执行 这个命令:xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/TestIpa.app -o ~/Desktop/TestIpa.ipa
        报 xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH

        Xcode版本 8.3 系统版本 10.12.5

        我在网上查了一下,说去老版本里面复制一个PackageApllication文件放到 usr/bin下面 可是新系统 放不进去
      • Metoo33:楼主,您好,[IDEDistributionProvisioning _itemToSigningInfoMap:]: Can't find any applicable signing identities for items,怎么解决?
      • cl9000:感谢大神 ,我改了下脚本可以了,还有个问题:我注释掉的脚本问什么还执行呢?
        CaryaLiu:@cl9000 注释了的应该不会执行了吧,你再仔细确认一下呢
      • cl9000:能留个微信吗?遇到些问题。谢谢
      • d67ddecd40fe:问一下,用命令打包有遇到过#ifdef 编译时候报错的问题吗?想知道怎么解决
        CaryaLiu:@coderMoe 没有遇到过呢
      • 69a8e4612fc7:使用了这个命令./autobuild.py -w yourworkspace.xcworkspace -s yourscheme -o youapp.ipa,报错 autobuild.py: error: unrecognized arguments: -o /Users/admin/***.ipa
        69a8e4612fc7:也能上传到蒲公英上下载安装
        69a8e4612fc7:应该是最新的,我今天刚下载的,不过我把-o ***.ipa去掉,直接写前面那一段,就好了,在桌面上也生成了ipa文件
        CaryaLiu:@爱吃包子的boy 你确定使用的最新的脚本?
      • 黑黝黝的搬砖王:一直提示PackageApplication不是开发工具或者路径,请问怎么解决? "xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH“
      • 56a371c74238:打包上传成功了可是下载的时候提示无法下载怎么办呢
      • GeekFounder:请问有尝试打包然后直接发布到App Store上吗?
      • YY_Lee:上传蒲公英时报如下错误:
        File "/Library/Python/2.7/site-packages/requests-2.14.2-py2.7.egg/requests/adapters.py", line 488, in send
        raise ConnectionError(err, request=request)
        requests.exceptions.ConnectionError: ('Connection aborted.', error(32, 'Broken pipe'));
        stackoverflow上的回答是:this was a problem with the gunicorn worker timing out. when you launch gunicorn you can specificy the timeout as an argument to make it longer and give enough time for the file to finish uploading,请问你知道如何解决吗
        CaryaLiu:@Gradient 网络问题,它的意思是让你把网络的timeout值设置为参数
      • aStudyer:打包成功,上传蒲公英的过程中出错,请问是什么原因造成的呢?
      • BlueEagleBoy:您好 我使用脚本** ARCHIVE SUCCEEDED **成功 但是export失败。
        IDEDistribution: -[IDEDistributionProvisioning _itemToSigningInfoMap:]: Can't find any applicable signing identities for items: (
      • 闭家锁:问下,这个自动打包是不是不必需要申请开发者证书才行,没有证书能打包adHoc的包吗
      • 旭哥哥:请问对于项目中有cocoapods,但是主体工程依赖这个cocoapods工程怎么破?怎么打这个主工程的ipa....
        CaryaLiu:@旭哥哥 看着有点绕,你的意思是A.xcworkspace依赖于B.xcworkspace?这种情况下我没有测试过
        旭哥哥:@CaryaLiu 一般来说cocoaPod管理项目A后项目的启动入口为A.xcworkspace对吧,我现在遇到的也是这样进入的项目,但是这个并不是主工程。好比A项目的入口为B.xcworkspace,但是想打A的包,某种意义B作为了A的静态库,但是想打的ipa其实是A的。这里的自动化命令有这方面知识么
        CaryaLiu:不太明白你的意思,我们项目中有cocoapod管理的私有库,不影响使用呀,都是用Podfile管理
      • 幸福的脚步2016:
        xcodebuild -workspace test.xcworkspace -scheme test -configuration Release -sdk iphoneos build CODE_SIGN_IDENTITY="证书" PROVISIONING_PROFILE="配置文件"报错:

        Provisioning profile "iOS Team Provisioning Profile: com.vpclub.hebeiyidong" is Xcode managed, but signing settings require a manually managed profile.
        Code signing is required for product type 'Application' in SDK 'iOS 10.2'
        CaryaLiu:@幸福的脚步2016 你看看脚本的第30行左右对比我的原始脚本是不是有多余的空格,换行等
        幸福的脚步2016:@CaryaLiu 谢谢,现在运行./autobuild.py -w 河北移动微店.xcworkspace -s 河北移动微店报错:
        File "./autobuild.py", line 30
        print "cleaned archiveFile: %s" %(archiveFile)
        ^
        SyntaxError: invalid syntax

        这个又是怎么回事呢
        CaryaLiu:@幸福的脚步2016 你配置的Xcode自动管理证书,打包命令把这两个参数去掉试试:CODE_SIGN_IDENTITY="证书" PROVISIONING_PROFILE="配置文件"
      • 灵儿菇凉:楼主,(用最新的xcodebuild -exportArchive)打App Store的包成功了,但是ad-hoc的包失败了,请问有什么办法解决。
        错误日志:
        ** ARCHIVE SUCCEEDED **
        2017-03-03 11:10:25.486 xcodebuild[844:15630028] [MT] IDEDistribution: -[IDEDistributionProvisioning _itemToSigningInfoMap:]: Can't find any applicable signing identities for items: (
        "<IDEDistributionItem: 0x7fad0d5dcd00 'com.xianzaishi.normandie' '<DVTFilePath:0x7fad0d4e3bc0:'/Users/zouhaiqing/Desktop/XianZaiShi2017-03-03_11.09.06/XianZaiShi1.1.7.xcarchive/Products/Applications/XianZaiShi.app'>'>"
        )
        error: exportArchive: The operation couldn’t be completed. (IDEDistributionErrorDomain error 3.)
        ** EXPORT FAILED **
        CaryaLiu:@灵儿菇凉 看日志应该是签名错误,不知道你怎么设置的参赛
        灵儿菇凉:但是用xcode打adhoc是成功了的
      • CCloud:您好, 在Linux下可以打包ipa么,或者对ipa 重签名
        CaryaLiu:不可以
      • e19fc75f0315:CompileSwift normal arm64 CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler
        (2 failures) 报这两个错 什么原因
      • _GXT:你好,我遇到一个问题:** EXPORT FAILED **

        ls: /Users/utouu/Desktop/Tailorx2016-12-28_16-28-43: No such file or directory
        ipaPath:~/Desktop/Tailorx2016-12-28_16-28-43/
        Traceback (most recent call last):
        File "autobuild.py", line 136, in <module>
        main()
        File "autobuild.py", line 133, in main
        xcbuild(options)
        File "autobuild.py", line 120, in xcbuild
        buildWorkspace(workspace, scheme)
        File "autobuild.py", line 107, in buildWorkspace
        uploadIpaToPgyer(ipaPath)
        File "autobuild.py", line 44, in uploadIpaToPgyer
        files = {'file': open(ipaPath, 'rb')}
        IOError: [Errno 2] No such file or directory: '~/Desktop/Tailorx2016-12-28_16-28-43/'
        CaryaLiu:@gaoxitai 已修复上传中文名ipa出错的问题
        CaryaLiu:@gaoxitai 有问题请留言,目前暂不支持中文文件名
        CaryaLiu:@gaoxitai 你使用最新的代码试试,刚更新了一下代码
      • Zachary_an:你好,修改了一下脚本,基本可以实现全自动打包,自动安装证书,并选择正确的证书,但是唯有一个问题,只要是新的证书,运行脚本的时候,都会弹出一个确认框:"codesign"想要访问您的钥匙串中的密钥"XXX",选择“始终允许”,“拒绝”,“允许”。您 有办法可以不让弹这个框吗?
      • d0ffe16958c7:你好,我想问下关于自动打包这块关于 security unlock-keychain 的问题,我这边在自动打包的时候会弹出询问是否要求钥匙串允许,虽然只要点一次始终允许,这个包就可以打了,但是我这边需要打100多个不同的包,不能每个都点钥匙串的始终允许,而 security unlock-keychain 这个命令并不起作用,想问下博主有没有这方面的研究。
        d0ffe16958c7: @CaryaLiu 这个只有一个证书,我这边是有从资料中自动导入证书(目前有100多个证书)进行打包,所以不能手动操作,又找不到始终允许的命令行,导致自动打包还是要手动点允许
        CaryaLiu:@CaryaLiu 参考这张图片,![](http://upload-images.jianshu.io/upload_images/1677120-150e16c7a2924b6b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240), 允许访问之前确认应该选中,且始终允许通过这些应用程序访问下应该包含codesign,不知道你那边是这样的么?如果解决了,也请留言回复一下。
        CaryaLiu:@落忧 点击始终允许之后,第二次应该不会再弹窗了啊?
      • 台灯下的小卫:Traceback (most recent call last):
        File "./autobuild.py", line 9, in <module>
        import requests
        ImportError: No module named requests 怎么解决?
        台灯下的小卫:@CaryaLiu uploading....
        Upload Fail!
        Reason:Data of file can not be empty 上传蒲公英的时候失败了! :sob:
        台灯下的小卫:@CaryaLiu 谢谢你的回复! :+1:
        CaryaLiu:@台灯下的小卫 使用 $ sudo pip install requests 或者 sudo easy_install -U requests

        参考:http://stackoverflow.com/questions/17309288/importerror-no-module-named-requests
      • 红红落叶:你这个有问题啊 当我打包命令输错参数的时候 他把我的工程文件都删掉了 希望你解决下这个问题的
        CaryaLiu:@红红落叶 请问你的打包命令是怎样的,输错的参数是什么,我好排查问题,谢谢~~
      • BestVast:你好,我想问一下,您写的脚本可以用jsp调用脚本打包吗?
      • Yang2333:请问一下,按照如下buildCmd = 'xcodebuild -project %s -target %s -sdk %s ARCHS="armv7 armv7s arm64" VALID_ARCHS="armv7 armv7s arm64" -configuration %s build' %(project, target, SDK, CONFIGURATION) configuration 为debug模式下 打包出来的ipa上传蒲公英后在5以及以下机型能正常工作,但是是5s以上点击进去就会闪退闪退,这是什么原因呢? 非常感谢~
        CaryaLiu:@Yang2333 5s以上是64位的机型,你看看是不是这方面的原因
      • 3508151aec64:你好,请问,如果我想修改bundleIdentifier,该怎么办,我的项目比较多,我想修改bundleid,同时配置对应的证书。
      • Yang2333:请问一下The following build commands failed:
        CompileC build/TestApp.build/Release-iphoneos/TestApp.build/Objects-normal/armv7/TestController.o TestApp/TestViewController.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler
        (1 failure)
        执行第一个命令行就报这样的错,是什么原因导致的呢?求解
        SOI:$ sudo xcode-select -switch /Applications/Xcode92.app

        Xcode92 i是我最新的版本Xcode, 老版本Xcode编译有问题。
        这可以解决问题,帮助后来人。
        Yang2333:@CaryaLiu 非常感谢,是的,我装一个7.3 和8.0的,问题已解决
        CaryaLiu:@Yang2333 你的电脑安装了两个版本的Xcode?使用 `xcode-select -print-path`命令检测你Xcode 安装路径
      • 言溪Lee:我好像build打包总是不成功,然后就用了archive和exportarchive,想问下怎么调用autobuild.py将已打包的ipa上传至蒲公英呀
        言溪Lee:@CaryaLiu 哦哦,恩,谢谢,你那里写的都有,是我不会用python
        CaryaLiu:@xiaoheziQH 看这里的文末,http://liumh.com/2015/11/25/ios-auto-archive-ipa/
      • 言溪Lee:你好,为什么我build success后Release-iphoneos中包含三个文件,分别是xxx , xxx.app.dSYM, xxx.wiftmodule,没有.app,第一个xxx加.app后缀生成ipa,error是not a single-bundle archive,求指教
        CaryaLiu:@小盒子QH 你再仔细看看文章吧,如果你不用我的脚本,上面的命令应该是分两步执行,如果你用我的脚本打包,可以参考我的个人博客末尾更新的使用方法:http://liumh.com/2015/11/25/ios-auto-archive-ipa/,没有同步更新到这里
        言溪Lee:@CaryaLiu 执行命令:xcrun -sdk iphoneos -v xcodebuild -exportArchive -archivePath ./build/Release-iphoneos/xxx.app -exportPath ~/Deaktop/xxx.ipa,error: the archive at path './build/Release-iphoneos/xxx.app' is not a single-bundle archive,我还没找到原因,/(ㄒoㄒ)/~~,希望作者早日看到
      • zhonglaoban:
        Build settings from command line:
        CODE_SIGN_IDENTITY = iPhone Distribution: Beijing Ruijie Networks Co.,Ltd.
        PROVISIONING_PROFILE = Relax_Distribution
        SDKROOT = iphoneos10.0

        一直停在这里
        CaryaLiu:@530421bcbfe8 Relax_Distribution这个是你对profile的命名吧,肯定不是这个值,你再看看文章末尾处获取profile的identifier
        zhonglaoban:@CaryaLiu 可是我命令行单独执行Xcodebuild能行啊,xcrun也能打包
        CaryaLiu:@530421bcbfe8 你的PROVISIONING_PROFILE值设置有问题
      • Outlander_J:大神,在吗,这个脚本怎样使用呢,用什么编译呢
        CaryaLiu:@咖啡小喵 没有证书没有必要打包了吧?
        Outlander_J:@CaryaLiu 看到了,谢谢,如果没有证书或者将证书编号CODE_SIGN_IDENTITY等的那些全局变量设置为可以通过外部文件更改的,怎么操作呢?
        CaryaLiu:@咖啡小喵 , 我在我的个人博客末尾更新了,http://liumh.com/2015/11/25/ios-auto-archive-ipa/ 请移步看一下,没有同步更新到这里
      • 请叫我何大大:我用xcodebuild -workspace 这个打包也是成功了,但是build文件夹路径变/Users/cgg/Library/Developer/Xcode/DerivedData/Test-exsyzgnpppmuckhkvthkfxmxhzlz,而不是直接在工程下边
        请叫我何大大:@CaryaLiu 好的,我去看一下
        CaryaLiu:@请叫我何大大 用这个打包的时候要修改SYMROOT的值,具体的你可以看看我脚本里的内容
      • 请叫我何大大:楼主写的棒棒哒
      • 请叫我何大大:我用你的命令可以打包ipa,成功,但是想请问下你的脚本怎么用
        Outlander_J:请问你会用脚本打包了吗?遇到一样的问题了,求助
        请叫我何大大:@CaryaLiu 谢谢大神耐心分享
        CaryaLiu:@请叫我何大大 我在我的个人博客末尾更新了,http://liumh.com/2015/11/25/ios-auto-archive-ipa/ 请移步看一下,没有同步更新到这里
      • yzhi00:你好,我打包上传成功到蒲公英之后,需要安装的时候发现需要密码,但是我并没有设置安装需要密码,请问这是怎么回事呢?谢谢!
        言溪Lee:@追寻星 请问能指教下吗?
        yzhi00:@CaryaLiu ok,谢谢!
        CaryaLiu:@追寻星 sorry, 在我的脚本里设置了安装需要密码,你搜一下脚本里的password,将其值设置为空再试试。
      • 我真的是昂子:你好,我在打包的时候报这个错,正常Xcode打包没报错的,请问怎么破?
        ld: library not found for -lAFNetworking
        clang: error: linker command failed with exit code 1 (use -v to see invocation)

        ** BUILD FAILED **


        The following build commands failed:
        Ld build/Parking_Where.build/Release-iphoneos/Parking_Where.build/Objects-normal/arm64/Parking_Where normal arm64
        (1 failure)
        CaryaLiu:@我真的是昂子 今天我同事也遇到这个问题,是他使用脚本时方式弄错了,我们使用的是workspace,应该用 -w 和 -s 传入指定参数,而他使用 -p 和 -t 了,不知道你是不是也是这个问题
        CaryaLiu:@我真的是昂子 你重新执行 pod install 后试试呢
      • d40990295f48:您好,打包完了最后报了一个错误,而且还没有生成.ipa文件,也没有直接上传到蒲公英。麻烦留个QQ详细说一下吧,太感谢了!错误如下:


        Traceback (most recent call last):
        File "autobuild.py", line 107, in <module>
        main()
        File "autobuild.py", line 104, in main
        xcbuild(options)
        File "autobuild.py", line 89, in xcbuild
        buildWorkspace(workspace, scheme, output)
        File "autobuild.py", line 74, in buildWorkspace
        uploadIpaToPgyer(output)
        File "autobuild.py", line 36, in uploadIpaToPgyer
        files = {'file': open(ipaPath, 'rb')}
        IOError: [Errno 2] No such file or directory: 'WanXueEDU.ipa'
        CaryaLiu:@wohetuolunbao python superStudy.py -w SuperStudy.xcworkspace -s SuperStudy -o ~/Desktop/SuperStudy.ipa 你只用这个命令试试,先看看桌面生成ipa文件没
        d40990295f48:@CaryaLiu 可以看到,打包是成功了的,就是最后没有上传到 蒲公英平台。
        python superStudy.py -w SuperStudy.xcworkspace -s SuperStudy -o SuperStudy.ipa
        xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/SuperStudy.app -o ~/Desktop/AppStore/SuperStudy/SuperStudy.ipa

        这是打包的命令,麻烦指教一下。 :joy:
        CaryaLiu:@wohetuolunbao 你打包的命令是怎么写的?在控制台有看到 BUILD SUCCESS字样么?
      • 肖无情:xcodebuild -project TestImg.xcodeproj -target TestImg -configuration Release

        楼主你好:我适用了着两行命令:
        xcodebuild -project TestImg.xcodeproj -target TestImg -configuration Release

        xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/TestImg.app -o ~/Desktop/TestImg.ipa
        生成了ipa 文件 但是用助手安装到手机上的时候提示安装失败
        请问这是什么原因?
        CaryaLiu:@肖无情 有提示失败的原因么?
      • 60f51e56db7a:你好,请问下,工程里包含两个target 会出错么?我在执行打包的过程中 报错:
        error:no such module ‘Alamofire’
        import Alamofire
        CaryaLiu:@60f51e56db7a 打包时指定了target的,工程里包含两个target应该不会出错的。
      • 我心飞翔121:打包报错
      • 我心飞翔121:自动打包能不能实现 我给他们手动输入路径 输入工程名,手动配置跟证书
        CaryaLiu:@我心飞翔121 同现在的做法有区别么?
      • 我心飞翔121:你好在吗 可以私信吗
      • d4713d91b2fc:xcodebuild -workspace YangDongXi.xcworkspace -scheme YangDongXi -configuration Debug -sdk iphoneos build CODE_SIGN_IDENTITY="iPhone Developer: Kangshuang Jin (284NRC8MDE)" PROVISIONING_PROFILE="7a6fb4f0-45a2-4ed9-869d-e98bd3c8294f"
        我在打包含有cocoapods的workspace时使用上面的命令,打出来的.app比自己用xcode打出来的.app打了20多M,这是为什么?
        CaryaLiu:@liaoting0725 我之前比较了一下ipa文件的大小,好像是差不多的,但是你这样比较.app文件大小,现在也不太清楚为什么会大20多M
        d4713d91b2fc:@CaryaLiu xcode真机run以后,在product位置show in finder后找到.app的大小,其实际位置和我用上面命令打出来的.app位置是一样的,只是xcode run以后.app会覆盖掉。两者前后对比用上面命令打出来的.app比xcode run以后的多了20多m
        CaryaLiu:@liaoting0725 你Xcode打出来的是.app的还是.ipa的?之前还没注意包大小的问题
      • 孤独感爆棚:收回我的上一个问题,执行这句不通是怎么回事xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/$(target|scheme).app
        CaryaLiu:@孤独感爆棚 执行不通报什么错啊,你得看看错误信息啊
        孤独感爆棚:@CaryaLiu xcodebuild -workspace Lighting.xcworkspace -scheme Lighting -configuration Release -sdk iphoneos build CODE_SIGN_IDENTITY="证书" PROVISIONING_PROFILE="描述文件" 我先执行这个,成功后执行这个xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/$(target|scheme).app,你说的这个./autobuild.py -w yourworkspace.xcworkspace -s yourscheme -o youapp.ipa,也执行不通
        CaryaLiu:@孤独感爆棚 你是怎么执行脚本的?应该是这样 `./autobuild.py -p youproject.xcodeproj -t youtarget -o youapp.ipa` 或者 `./autobuild.py -w yourworkspace.xcworkspace -s yourscheme -o youapp.ipa`, 文中已经提到了
      • 孤独感爆棚:CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 9.3'\
        这个错误什么意思啊
      • 孤独感爆棚:code signing is required for product type 'Application' in SDK 'iOS 9.3'报这个错误是什么意思啊
        Draven_Lu:你工程的适配版本有问题,大兄弟
      • 动感超人丶:能留下你qq吗?在线请教一下
      • 动感超人丶:尝试改了一下脚本,没成功,不会Python
      • 动感超人丶:options: {'project': None, 'output': None, 'scheme': None, 'target': None, 'workspace': None}, args: []
        怎么解决啊?
        CaryaLiu:@动感超人丶 在autobuild.py所在目录,使用 `./autobuild.py --help` 查看用法
      • 我心飞翔121:命令不可用
        我心飞翔121:@CaryaLiu 脚本第三行保存
        我心飞翔121:@CaryaLiu 指令保存,我在终端中运行头文件保存
        CaryaLiu:@我心飞翔121 报什么错误啊,你怎么用的?

      本文标题:iOS自动打包并发布脚本

      本文链接:https://www.haomeiwen.com/subject/hsidhttx.html