[xcode] 명령 행에서 Xcode“빌드 및 아카이브”

Xcode 3.2는 빌드 메뉴에서 “빌드 및 아카이브”라는 새로운 기능을 제공하여 Ad Hoc 배포에 적합한 .ipa 파일을 생성합니다. Organizer를 열고 “아카이브 응용 프로그램”및 “iTunesConnect에 응용 프로그램 제출”로 이동할 수도 있습니다.

명령 행에서 “빌드 및 아카이브”를 사용하는 방법이 있습니까 (빌드 스크립트의 일부로)? 나는 xcodebuild어떻게 든 관련이 있다고 가정 하지만 man페이지는 이것에 대해 아무 말도하지 않는 것 같습니다.

업데이트 Michael Grinich는 설명을 요청했습니다. 커맨드 라인 빌드로 할 수없는 것, “빌드 및 아카이브”후에 Xcode의 오거나이저로만 할 수있는 기능입니다.

  1. “애플리케이션 공유 …”를 클릭하여 IPA를 베타 테스터와 공유 할 수 있습니다. Guillaume이 아래에 지적한 바와 같이, 일부 Xcode 매직으로 인해이 IPA 파일에는 베타 테스터가 설치해야하는 별도로 배포 된 .mobileprovision 파일이 필요하지 않습니다. 그것은 마술이다. 명령 줄 스크립트로는 할 수 없습니다. 예를 들어 Arrix의 스크립트 (5 월 1 일 제출)는 해당 요구 사항을 충족하지 않습니다.
  2. 더 중요한 것은, 빌드를 베타 테스트 한 후에 “응용 프로그램을 iTunes Connect에 제출”을 클릭하면 테스트를 빌드하지 않은 테스트 한 바이너리 인 EXACT와 동일한 빌드를 Apple에 제출할 수 있습니다. 앱 서명은 빌드 프로세스의 일부이기 때문에 명령 줄에서는 불가능합니다. Ad Hoc 베타 테스트를 위해 비트에 서명하거나 App Store에 제출하도록 비트에 서명 할 수 있지만 둘 다에 서명 할 수는 없습니다. 명령 줄에 구축 된 IPA는 전화에서 베타 테스트를 거친 다음 Apple에 직접 제출할 수 없습니다.

누군가가 와서 나를 잘못 알고 싶어합니다.이 두 기능 모두 Xcode GUI에서 훌륭하게 작동하며 명령 줄에서 복제 할 수 없습니다.



답변

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 4.2에서는 -scheme 플래그를 사용하여이를 수행 할 수 있습니다.

xcodebuild -scheme <SchemeName> archive

이 명령이 끝나면 Xcode Organizer에 Archive가 나타납니다.


답변

Xcode 9 및 Swift로 답변 업데이트

보관

xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace \
  -scheme <schemeName> clean archive -configuration release \
  -sdk iphoneos -archivePath <ProjectName>.xcarchive

IPA 내보내기 ( 내보내기 옵션 plist 참고 )

xcodebuild -exportArchive -archivePath  <ProjectName>.xcarchive \
  -exportOptionsPlist  <ProjectName>/exportOptions.plist \
  -exportPath  <ProjectName>.ipa

exportOptions.plist에 대해 모른다면
https://blog.bitrise.io/new-export-options-plist-in-xcode-9


teamcity / jenkins와 같은 CI / CD 도구로 프로젝트를 빌드하는 데 이것을 사용하는 사람들은 빌드 에이전트에 설치된 올바른 xcode를 아카이브 및 내보내기에 사용하고 있는지 확인하십시오.

아래 두 가지 옵션 중 하나를 사용할 수 있습니다.

  1. xcodebuild의 전체 경로를 사용하십시오.
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
  1. xcode-select를 사용하십시오.
xcode-select -switch /Applications/Xcode 9.3.1.app

아래는 내 옛 대답입니다

다음은 아카이브 및 IPA 예제 작성을위한 명령 행 스크립트입니다. Desktop / MyiOSApp 폴더에있는 iPhone xcode 프로젝트가 있습니다.

다음 명령을 하나씩 실행하십시오.

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"

이것은 Xcode 5로 테스트되었으며 제대로 작동합니다.


답변

자체 배포 스크립트를 사용하여 임시 배포 용 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

스크립트는 또한 버전 번호를 증가시킵니다. 필요하지 않은 경우 해당 부분을 제거 할 수 있습니다. 도움이 되길 바랍니다.


답변

xcodebuild도구는 -exportArchive를 사용하여 아카이브 제품을 빌드하고 내보낼 수 있습니다. 플래그 (Xcode 5 기준)를 . 내보내기 단계는 이전에는 Xcode Organizer UI를 통해서만 가능했습니다.

먼저 앱을 보관하십시오.

xcodebuild -scheme <scheme name> archive

주어진 $ARCHIVE_PATH( .xcarchive 의 경로 파일), 다음 중 하나와 아카이브에서 응용 프로그램을 내보낼 수 :

iOS .ipa 파일 :

xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile"

Mac .app 파일 :

xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company"

두 명령 모두에서 -exportProvisioningProfile-exportSigningIdentity 인수는 선택 사항입니다. man xcodebuild의미에 대한 자세한 내용은. 이 예제에서 iOS 빌드의 프로비저닝 프로파일은 AdHoc 배포 프로비저닝 프로파일을 지정했으며 Mac 앱의 서명 ID는 써드 파티 애플리케이션 (Mac App Store를 통해 분배되지 않음)으로 내보낼 개발자 ID를 지정했습니다.


답변

우리는 XCode 4.2.1로 iPad 앱을 개발했으며 OTA 배포를 위해 빌드를 지속적인 통합 (Jenkins)에 통합하려고했습니다. 내가 생각해 낸 해결책은 다음과 같습니다.

# Unlock keychain
security unlock-keychain -p jenkins /Users/jenkins/Library/Keychains/login.keychain

# Build and sign app
xcodebuild -configuration Distribution clean build

# Set variables
APP_PATH="$PWD/build/Distribution-iphoneos/iPadApp.app"
VERSION=`defaults read $APP_PATH/Info CFBundleShortVersionString`
REVISION=`defaults read $APP_PATH/Info CFBundleVersion`
DATE=`date +"%Y%m%d-%H%M%S"`
ITUNES_LINK="<a href=\"itms-services:\/\/?action=download-manifest\&url=https:\/\/xxx.xxx.xxx\/iPadApp-$VERSION.$REVISION-$DATE.plist\">Download iPad2-App v$VERSION.$REVISION-$DATE<\/a>"

# Package and verify app
xcrun -sdk iphoneos PackageApplication -v build/Distribution-iphoneos/iPadApp.app -o $PWD/iPadApp-$VERSION.$REVISION-$DATE.ipa

# Create plist
cat iPadApp.plist.template | sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATE}/$DATE/" -e "s/\${REVISION}/$REVISION/" > iPadApp-$VERSION.$REVISION-$DATE.plist

# Update index.html
curl https://xxx.xxx.xxx/index.html -o index.html.$DATE
cat index.html.$DATE | sed -n '1h;1!H;${;g;s/\(<h3>Aktuelle Version<\/h3>\)\(.*\)\(<h3>&Auml;ltere Versionen<\/h3>.<ul>.<li>\)/\1\
${ITUNES_LINK}\
\3\2<\/li>\
<li>/g;p;}' | sed -e "s/\${ITUNES_LINK}/$ITUNES_LINK/" > index.html

그런 다음 Jenkins는 ipa, plist 및 html 파일을 웹 서버에 업로드합니다.

이것은 plist 템플릿입니다.

<?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>items</key>
    <array>
        <dict>
            <key>assets</key>
            <array>
                <dict>
                    <key>kind</key>
                    <string>software-package</string>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa</string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>full-size-image</string>
                    <key>needs-shine</key>
                    <true/>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp.png</string>
                </dict>
                <dict>
                    <key>kind</key>
                    <string>display-image</string>
                    <key>needs-shine</key>
                    <true/>
                    <key>url</key>
                    <string>https://xxx.xxx.xxx/iPadApp_sm.png</string>
                </dict>
            </array>
            <key>metadata</key>
            <dict>
                <key>bundle-identifier</key>
                <string>xxx.xxx.xxx.iPadApp</string>
                <key>bundle-version</key>
                <string>${VERSION}</string>
                <key>kind</key>
                <string>software</string>
                <key>subtitle</key>
                <string>iPad2-App</string>
                <key>title</key>
                <string>iPadApp</string>
            </dict>
        </dict>
    </array>
</dict>
</plist>

이를 설정하려면 배포 인증서 및 프로비저닝 프로파일을 지정된 사용자의 키 체인으로 가져와야합니다.


답변

나는 여기에 가기 어려운 다른 답변 중 일부를 발견했습니다. 이 기사 는 저에게 도움이되었습니다. 다른 답변에서 언급했듯이 일부 경로는 절대적이어야 할 수도 있습니다.

명령 :

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"