Распространение приложения iOS на App Store и Enterprise

TL;DR:

A. Проблема при экспорте приложения с сертификатом предприятия

Ошибка: идентификатор приложения подстановочного знака не может использоваться для создания в доме Профили

В. Правильный подход к распространению приложения в Enterprise и AppStore

Мы уже много лет распространяем приложения в Apple AppStore, Enterprise - новое дополнение. - Приложение имеет приложение наблюдения и поддерживает iOS 8 +.

Что сделано до сих пор:
- Две разные учетные записи и сертификаты разработчиков.
- Отдельные профили обеспечения для каждой учетной записи
- Создайте конфигурацию и схему для предприятия AppStore
- используя Scheme/Config для переключения между настройками, такими как bundleId и т.д.
- Успешно Архивировать корпоративное приложение

Я НЕ создал отдельный info.plist или права (мне нужно?)

Проблема. Когда я пытаюсь экспортировать Enterprise Archive, я получаю ошибку

идентификатор группового приложения не может использоваться для создания в доме Профили <

У меня создаются профили профилей. Ни один из них не является подстановочным знаком, кроме созданного Xcode.

Я прочитал этот пост, в котором говорится, что нужно создавать разные цели. Это накладные расходы на сохранение обеих целей в синхронизации.

Вопрос:

bool itIsPossible = Can this be achieved with Configuration/Schemes?

if (itIsPossible){
– What else I need to create separate entitlements etc?
}else{
– Do I have to create new target to support Enterprise App?
– Separate Target for Watch and Extension? 
– What else I need to create separately Info.plist, entitlements etc?
}

Ответы

Ответ 1

Использование целей

Новые цели действительно создают некоторые накладные расходы (новые файлы должны быть добавлены ко всем соответствующим целям). Новые цели позволяют легко разделить файл, где есть, предоставить платформу для отдельных plist и config, Unit Tests и т.д.

Помните, что исполняемый файл App Store и Enterprise - это два разных приложения с разными сертификатами и сигнатурами. (1)


Отдельные целевые рекомендации (от реального продукта)

  • Общие права
  • ПРОЕКТ > ЦЕЛИ > Общие > Командa > выберите отдельные команды там.
  • <yourTarget> . xconfig (необязательно и удобно)
  • .plist (скорее всего, но не обязательно) (2)

(1) То же самое можно сказать о исполняемых файлах Apple Watch
(2) Разделить plist позволяет манеру времени выполнения: один код управляется ресурсами.

Ответ 2

Это довольно легко сделать, если вы можете создать отдельную сборку script для каждого приложения. Нет необходимости иметь отдельную цель.

Вот моя сборка script:   # Создано Nguyen Tuan 10/8/14.   #!/Bin/ш

AP_NAME="$1"
echo "App name $AP_NAME"
FILE_NAME="$2"
echo "FILE_NAME $FILE_NAME"
SCHEME="$3"
echo "SCHEME $SCHEME"
PROVISIONING_NAME="$4"
echo "provisioning $PROVISIONING_NAME"
BUNDLE_ID="$5"
echo "BUNDLE_ID $BUNDLE_ID"
AP_ICON="$6"
echo "AP_ICON $AP_ICON"
PARENT_FOLDER="$7"
echo "PARENT_FOLDER $PARENT_FOLDER"
CONFIG="$8"
echo "CONFIG $CONFIG"

PROJECT_HOME_DIR="$9"

#Goto working folder
MY_PATH="`dirname \"$0\"`"
cd $MY_PATH
echo "build sh: This is the current working directory: $MY_PATH"
SCRIPT_FOLDER=$(basename "$MY_PATH")

MY_NAME=$(whoami)
echo "Script Folder $SCRIPT_FOLDER"
sudo sh sudo.sh
echo "Global PATH: \n$PATH"

#Go up to Project folder
cd ../../
rm -r -f build/$PARENT_FOLDER

PLIST=$PROJECT_HOME_DIR/Info.plist
echo "Please enter build number"
#BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PLIST")
#BUILD_NUMBER=$(expr $BUILD_NUMBER + 1)
BUILD_NUMBER=`git rev-list HEAD --count`
echo "Get provisioning file: UUID + name for $PROVISIONING_NAME"

if test -d ~/Library/MobileDevice/Provisioning\ Profiles/; then
    ProfilesDir=~/Library/MobileDevice/Provisioning\ Profiles/
else
    ProfilesDir=/Library/Developer/XcodeServer/ProvisioningProfiles/
fi

array=$(ls "$ProfilesDir")
provi=""
for i in $array; \
do output=$(/usr/libexec/PlistBuddy -c 'Print :Name' /dev/stdin <<< $(security cms -D -i "$ProfilesDir/${i%%/}") 2>&1); \
echo $output; \
if [ "$output" == "$PROVISIONING_NAME" ]; then provi=$(/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i "$ProfilesDir/${i%%/}") 2>&1); break; fi;\
done

#echo PROVISIONING_UUID=$provi >> provisioning.properties
echo "selected profile $provi"

/usr/libexec/Plistbuddy -c "Set CFBundleVersion $BUILD_NUMBER" "$PLIST"
/usr/libexec/Plistbuddy -c "Set CFBundleIdentifier $BUNDLE_ID" "$PLIST"
xcodebuild -alltargets -configuration "$CONFIG" clean
xcodebuild -scheme $SCHEME PRODUCT_BUNDLE_IDENTIFIER=$BUNDLE_ID ONLY_ACTIVE_ARCH=NO ARCHS="armv7 arm64" PROVISIONING_PROFILE=$provi PRODUCT_NAME="$AP_NAME" ASSETCATALOG_COMPILER_APPICON_NAME=$AP_ICON archive -archivePath "build/$PARENT_FOLDER/$FILE_NAME.xcarchive" 
#xcodebuild -exportArchive  -archivePath "build/$PARENT_FOLDER/$FILE_NAME.xcarchive" -exportPath "build/$PARENT_FOLDER"
#-exportOptionsPlist $PLIST
echo "export ipa file"
rm -r -f build/$PARENT_FOLDER/$FILE_NAME.ipa
sh $MY_PATH/create_ipa.sh build/$PARENT_FOLDER/$FILE_NAME.xcarchive build/$PARENT_FOLDER/$FILE_NAME.ipa
mv build/$PARENT_FOLDER/**You need to change this to your app name**/.ipa build/$PARENT_FOLDER/$FILE_NAME.ipa
rm -r -f $HOME/Dropbox/$FILE_NAME.ipa
cp build/$PARENT_FOLDER/$FILE_NAME.ipa $HOME/Dropbox/$FILE_NAME.ipa

rm -r -f "build/$CONFIG-iphoneos"

echo "copy xcarchive file into organizer"
sh $MY_PATH/copy_resource.sh build/$PARENT_FOLDER/$FILE_NAME.xcarchive $MY_NAME

И затем создайте две команды сборки: одну для сборки предприятия и одну для сборки магазина приложений, что-то вроде этого:

AP_NAME="ABCD"
FILE_NAME="An App Name"
SCHEME="Scheme for enterprise build"
PROVISIONING_NAME="Expected provisioning profile, what is shown in XCode"
BUNDLE_ID="app bundle Id"
AP_ICON="custom icon if need?"
PARENT_FOLDER="the folder that will contains the build"
CONFIG="Release"

#Goto working folder
MY_PATH="`dirname \"$0\"`"
sh $MY_PATH/build.sh "$AP_NAME" "$FILE_NAME" "$SCHEME" "$PROVISIONING_NAME" "$BUNDLE_ID" "$AP_ICON" "$PARENT_FOLDER" "$CONFIG"

Если вам нужен copy_resource script:

path=$1
user=$2
echo $path
filename=$(basename "$path")
extension="${filename##*.}"
filename="${filename%.*}"
now=`date +%Y-%m-%d`
et=`date +%H:%M:%S`
PATH="/Users/$user/Library/Developer/Xcode/Archives/$now"
echo $PATH
/bin/mkdir -p $PATH
PATH=$PATH/$filename$et.$extension
/bin/mv $path $PATH

С этого момента просто запустите команду, и вы увидите сборку в рабочей папке или в Xcode Organizer

Ответ 3

Кажется, что профиль обеспечения настроен неправильно.

Самый простой способ сделать это - создать дополнительную конфигурацию.

Выберите проект в навигаторе. Затем дублируйте конфигурацию Release и переименуйте ее в Распространение предприятия или Enterprise Release.

введите описание изображения здесь

Затем выберите цель и перейдите в Настройки сборки. Там вы можете развернуть настройки для Идентификация подписи кода, Профилирование профиля. Вам также необходимо использовать другой идентификатор пакета.

Проверьте, какую конфигурацию вы используете в схеме архива.

Ответ 4

У нас была ошибка

Идентификатор приложения подстановочного знака нельзя использовать для создания в доме Профили

Мы решили это, вручную добавив профиль разработчика Распространение (In House) в портале разработчиков Apple...

введите описание изображения здесь