在App Store和企业中分发iOS应用程序

14

TLDR :

A. 使用企业证书导出应用出现问题:

错误:通配符应用程序ID不能用于创建内部分发配置文件

B. 在企业和AppStore上分发应用的正确方法:

多年来,我们一直在苹果的AppStore上分发应用程序,而企业则是新加入的。 - 应用程序具有Watch应用程序,并支持iOS 8+。

到目前为止已完成的工作:
- 两个不同的开发帐户和证书。
- 每个帐户上的单独分发配置文件
- 为企业和AppStore构建Config和Scheme
- 使用Scheme/Config切换设置,如bundleId等。
- 成功归档企业应用程序

我还没有创建单独的info.plist或权限(我需要吗?)

问题:当我尝试导出企业归档时,我遇到了错误

通配符应用程序ID不能用于创建内部分发配置文件<

我已经创建了适当的分发配置文件。除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?
}

你确认已经完成了以下链接中的所有步骤吗?https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/DistributingEnterpriseProgramApps/DistributingEnterpriseProgramApps.html - Sumeet
4个回答

4

使用目标

新的目标会带来一些额外开销(必须将新文件添加到所有相关目标中)。新的目标可以轻松地将文件分类,为单独的plistconfig、单元测试等提供平台。

请记住,App Store可执行文件和企业版可执行文件是两个不同的应用程序,具有不同的证书和签名。(1)


分离目标建议(来自实际产品)

  • 共享权利
  • 项目 > 目标 > 通用 > 团队 > 在那里选择不同的团队
  • < yourTarget >.xconfig(可选且方便)
  • .plist(最有可能的,但不是必需的)(2)

(1) Apple Watch可执行文件也是如此
(2) 单独的plist允许运行时魔法:通过资源控制单一代码


谢谢你的回答。我可以使用构建配置来管理不同的预配文件、证书和捆绑标识符,这使得我只需要手动管理团队。我认为这比管理两个目标更好。 - k-thorat
1
你能否发布一个带有详细信息的回答,让其他人可以借鉴你的经验? - SwiftArchitect
你可能会在某个时候拥有不同的权限,我很想知道如何处理这些问题而不需要不同的目标! - dogsgod

1
如果您能为每个应用程序创建单独的构建脚本,那么这很容易实现。不需要单独的目标。
以下是我的构建脚本: #由Nguyen Tuan于10/8/14创建。 #!/ bin / sh
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 脚本:
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中看到一个构建。


这要看情况。我的项目包含许多具有不同设置的应用程序。我也可以通过进行微小更改来重复使用脚本。 - sahara108

1
似乎配置文件没有正确设置。
最简单的方法是创建一个额外的配置文件。
在导航器中选择项目。然后复制“发布”配置文件并将其重命名为“企业分发”或“企业发布”。

enter image description here

然后选择您的目标并转到“构建设置”。在那里,您可以展开“代码签名身份”、“配置文件”等设置。您还需要使用不同的捆绑标识符。
还要检查您在存档方案中使用的配置。

这一切都已经正确设置。我为应用程序、扩展和手表目标设置了不同的捆绑标识符。我也能够进行存档。 - k-thorat

0

我们遇到了错误

通配符应用程序 ID 无法用于创建企业级预配文件

我们通过在苹果开发者门户中手动添加分发(企业级)预配文件来解决它...

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接