Xcode";“建立和归档”;从命令行

Xcode";“建立和归档”;从命令行,xcode,command-line,build,Xcode,Command Line,Build,Xcode 3.2在Build菜单下提供了一个非常棒的新功能,“Build and Archive”,它生成一个适合临时分发的.ipa文件。您还可以打开组织者,转到“存档的应用程序”和“将应用程序提交到iTunesConnect” 有没有办法从命令行使用“构建和归档”(作为构建脚本的一部分)?我假设xcodebuild会以某种方式参与进来,但是man页面似乎没有对此做任何说明 更新Michael Grinich要求澄清;下面是命令行构建所不能做的事情,这些功能只有在“构建并存档”之后才能使用Xc

Xcode 3.2在Build菜单下提供了一个非常棒的新功能,“Build and Archive”,它生成一个适合临时分发的.ipa文件。您还可以打开组织者,转到“存档的应用程序”和“将应用程序提交到iTunesConnect”

有没有办法从命令行使用“构建和归档”(作为构建脚本的一部分)?我假设
xcodebuild
会以某种方式参与进来,但是
man
页面似乎没有对此做任何说明

更新Michael Grinich要求澄清;下面是命令行构建所不能做的事情,这些功能只有在“构建并存档”之后才能使用Xcode的Organizer

  • 您可以单击“共享应用程序…”与测试人员共享您的IPA。正如Guillaume在下面指出的,由于Xcode的魔力,这个IPA文件不需要beta测试人员需要安装的单独分发的.mobileprovision文件;那太神奇了。没有命令行脚本可以做到这一点。例如,Arrix的脚本(5月1日提交)不符合该要求
  • 更重要的是,在对一个版本进行beta测试后,您可以单击“向iTunes Connect提交应用程序”,将完全相同的版本提交给Apple,即您测试的二进制版本,而无需重新构建。这在命令行中是不可能的,因为签署应用程序是构建过程的一部分;您可以为临时beta测试签名,也可以为提交到应用商店的数据签名,但不能两者都签名。任何基于命令行的IPA都不能在手机上进行beta测试,然后直接提交给苹果

  • 我希望有人来证明我错了:这两个功能在Xcode GUI中都非常有效,无法从命令行复制。

    转到项目根所在的文件夹,然后:

    xcodebuild -project projectname -activetarget -activeconfiguration archive
    

    转到项目根目录所在的文件夹,然后:

    xcodebuild -project projectname -activetarget -activeconfiguration archive
    

    我一直在使用自己的构建脚本来生成临时分发的ipa包

    die() {
        echo "$*" >&2
        exit 1
    }
    
    appname='AppName'
    config='Ad Hoc Distribution'
    sdk='iphoneos3.1.3'
    project_dir=$(pwd)
    
    echo using configuration $config
    
    echo updating version number
    agvtool bump -all
    fullversion="$(agvtool mvers -terse1)($(agvtool vers -terse))"
    echo building version $fullversion
    
    xcodebuild -activetarget -configuration "$config" -sdk $sdk build || die "build failed"
    
    echo making ipa...
    # packaging
    cd build/"$config"-iphoneos || die "no such directory"
    rm -rf Payload
    rm -f "$appname".*.ipa
    mkdir Payload
    cp -Rp "$appname.app" Payload/
    if [ -f "$project_dir"/iTunesArtwork ] ; then
        cp -f "$project_dir"/iTunesArtwork Payload/iTunesArtwork
    fi
    
    ipaname="$appname.$fullversion.$(date -u +%Y%m%d%H%M%S).ipa"
    zip -r $ipaname Payload
    
    echo finished making $ipaname
    

    脚本还会增加版本号。如果不需要,您可以删除该部分。希望能有所帮助。

    我一直在使用自己的构建脚本为临时分发生成ipa包

    die() {
        echo "$*" >&2
        exit 1
    }
    
    appname='AppName'
    config='Ad Hoc Distribution'
    sdk='iphoneos3.1.3'
    project_dir=$(pwd)
    
    echo using configuration $config
    
    echo updating version number
    agvtool bump -all
    fullversion="$(agvtool mvers -terse1)($(agvtool vers -terse))"
    echo building version $fullversion
    
    xcodebuild -activetarget -configuration "$config" -sdk $sdk build || die "build failed"
    
    echo making ipa...
    # packaging
    cd build/"$config"-iphoneos || die "no such directory"
    rm -rf Payload
    rm -f "$appname".*.ipa
    mkdir Payload
    cp -Rp "$appname.app" Payload/
    if [ -f "$project_dir"/iTunesArtwork ] ; then
        cp -f "$project_dir"/iTunesArtwork Payload/iTunesArtwork
    fi
    
    ipaname="$appname.$fullversion.$(date -u +%Y%m%d%H%M%S).ipa"
    zip -r $ipaname Payload
    
    echo finished making $ipaname
    

    脚本还会增加版本号。如果不需要,您可以删除该部分。希望有帮助。

    你是说验证/共享/提交选项?我认为这些是特定于Xcode的,不适合命令行构建工具

    我敢打赌,只要你聪明一点,你一定能为自己写一个剧本。看起来它们只是用UUDI和plist存储在
    ~/Library/MobileDevice/Archived Applications/
    中。我也无法想象对验证器进行反向工程会有那么困难


    我感兴趣的自动化过程是将构建发送给beta测试人员。(由于App Store提交很少发生,我不介意手动提交,特别是因为我经常需要添加新的描述文本。)通过使用Xcode的CLI执行伪构建+归档,我可以从每次代码提交中触发自动构建,使用嵌入式配置文件创建IPA文件,然后通过电子邮件发送给测试人员。

    你是说验证/共享/提交选项?我认为这些是特定于Xcode的,不适合命令行构建工具

    我敢打赌,只要你聪明一点,你一定能为自己写一个剧本。看起来它们只是用UUDI和plist存储在
    ~/Library/MobileDevice/Archived Applications/
    中。我也无法想象对验证器进行反向工程会有那么困难


    我感兴趣的自动化过程是将构建发送给beta测试人员。(由于App Store提交很少发生,我不介意手动提交,特别是因为我经常需要添加新的描述文本。)通过使用Xcode的CLI执行伪构建+归档,我可以从每次代码提交中触发自动构建,使用嵌入式配置文件创建IPA文件,然后通过电子邮件发送给测试人员。

    我从comand系列中找到了如何自动化构建和归档过程,我刚刚写了一篇文章解释了如何实现这一点

    您必须使用的命令是
    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}"
    

    您将在中找到所有详细信息。如果您有任何问题,请随时提问。

    我从comand系列中找到了如何自动化构建和归档过程,我刚刚写了一篇文章,解释了如何实现这一点

    您必须使用的命令是
    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}"
    

    您将在中找到所有详细信息。如果您有任何问题,请毫不犹豫地提问。

    您实际上可以放弃构建,就像XCode一样,这样您就可以测试并发布相同的二进制文件。例如,在我的脚本(类似于上面的脚本)中,我构建了作为临时构建签名的发布版本,然后将其作为IPA存档以进行测试,然后提交分发证书并创建一个zip文件,这就是我发送给苹果的文件。相关线路为:

    codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
    

    实际上,您可以放弃构建,就像XCode那样,这样您就可以测试并发布相同的二进制文件。例如,在我的脚本(类似于上面的脚本)中,我构建了作为临时构建签名的发布版本,然后将其作为IPA存档以进行测试,然后提交分发证书并创建一个zip文件,这就是我发送给苹果的文件。相关线路为:

    codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
    

    我发现其他一些答案很难找到。你为我做了什么。如其他答案所述,某些路径可能需要是绝对路径

    命令:

    xcrun -sdk iphoneos PackageApplication \
        "/path/to/build/MyApp.app" \
        -o "output/path/to/MyApp.ipa" \
        --sign "iPhone Distribution: My Company" \
        --embed "/path/to/something.mobileprovision"
    
    ${TARGET}.app                == Target path (ex :/Users/XXXXXX/desktop/Application/build/Release-iphoneos/MyApp.app)
    ${OUTDIR}                    == Select the output directory(Where you want to save .ipa file)
    ${IDENTITY}                   == iPhone Developer: XXXXXXX (XXXXXXXXXX)(which can be obtained from Keychain access)
    ${PROVISONING_PROFILE}   == Path to the provisioning profile(/Users/XXXXXX/Library/MobileDevice/Provisioning Profiles/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.mobileprovision”)
    
    xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'
    
    xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'
    

    我发现其他一些答案很难找到。你为我做了什么。如其他答案所述,某些路径可能需要是绝对路径

    命令:

    xcrun -sdk iphoneos PackageApplication \
        "/path/to/build/MyApp.app" \
        -o "output/path/to/MyApp.ipa" \
        --sign "iPhone Distribution: My Company" \
        --embed "/path/to/something.mobileprovision"
    
    ${TARGET}.app                == Target path (ex :/Users/XXXXXX/desktop/Application/build/Release-iphoneos/MyApp.app)
    ${OUTDIR}                    == Select the output directory(Where you want to save .ipa file)
    ${IDENTITY}                   == iPhone Developer: XXXXXXX (XXXXXXXXXX)(which can be obtained from Keychain access)
    ${PROVISONING_PROFILE}   == Path to the provisioning profile(/Users/XXXXXX/Library/MobileDevice/Provisioning Profiles/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.mobileprovision”)
    
    xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'
    
    xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'
    

    在Xcode 4.2中,您可以使用-scheme标志执行以下操作:

    xcodebuild -scheme <SchemeName> archive
    
    xcodebuild-方案归档
    

    执行此命令后,存档将显示在Xcode Organizer中。

    对于Xcode 4.2,您可以使用-scheme标志执行此操作:

    xcodebuild -scheme <SchemeName> archive
    
    xcodebuild-方案归档
    
    执行此命令后,存档将显示在
    xcode-select -switch /Applications/Xcode 9.3.1.app
    
    cd /Users/username/Desktop/MyiOSApp/
    
    xcodebuild -scheme MyiOSApp archive \
      -archivePath /Users/username/Desktop/MyiOSApp.xcarchive
    
    xcodebuild -exportArchive -exportFormat ipa \
      -archivePath "/Users/username/Desktop/MyiOSApp.xcarchive" \
      -exportPath "/Users/username/Desktop/MyiOSApp.ipa" \
      -exportProvisioningProfile "MyCompany Distribution Profile"
    
    which ipa 1>/dev/null 2>&1 || echo 'no shenzhen. to install use: sudo gem install shenzhen --no-ri --no-rdoc'
    ipa build --verbose --scheme "${schemeName}"
    
    cd MyProjectFolder
    
    xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive
    
    xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/ -exportOptionsPlist exportOptions.plist
    
    /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
    
    export PATH=$PATH:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/
    
    ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
    
    /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}" 
    
    xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'
    
    xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'
    
    Clean : codebuild clean -workspace work-space-name.xcworkspace -scheme scheme-name 
    
    Archive : xcodebuild archive -workspace work-space-name.xcworkspace -scheme "scheme-name" -configuration Release -archivePath IPA-name.xcarchive 
    
    Export : xcodebuild -exportArchive -archivePath IPA-name.xcarchive -exportPath IPA-name.ipa -exportOptionsPlist exportOptions.plist