Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用xcodebuild构建不同的平台_Ios_Xcode_Xcodebuild - Fatal编程技术网

Ios 使用xcodebuild构建不同的平台

Ios 使用xcodebuild构建不同的平台,ios,xcode,xcodebuild,Ios,Xcode,Xcodebuild,我有一个框架项目,我正试图使用脚本构建阶段构建一个fat文件(iphoneos+iphonesimulator),但它不起作用。剧本简单;它检查当前正在构建的平台,如: if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]] then SF_OTHER_PLATFORM=iphonesimulator else SF_OTHER_PLATFORM=iphoneos fi 然后使用xcodebuild来构建它: xcrun xcodebuild -project "${

我有一个框架项目,我正试图使用脚本构建阶段构建一个fat文件(iphoneos+iphonesimulator),但它不起作用。剧本简单;它检查当前正在构建的平台,如:

if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
SF_OTHER_PLATFORM=iphonesimulator
else
SF_OTHER_PLATFORM=iphoneos
fi
然后使用xcodebuild来构建它:

xcrun xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -sdk ${SF_OTHER_PLATFORM} -configuration "${CONFIGURATION}" BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" $ACTION
为了简单起见,省略了脚本的其他细节

如果我选择最初的目标作为模拟器,那么它工作得很好,模拟器和设备二进制文件都会生成,我使用lipo来获取fat文件。当我用另一种方法构建设备文件时,问题就出现了,因此,iphonesimulator SDK调用了xcodebuild。生成失败,出现以下错误:

CodeSign error: entitlements are required for product type 'Framework' in SDK 'Simulator - iOS 8.4'. Your Xcode installation may be damaged.
如果我更改
-sdk
选项,我会得到构建,但不会得到模拟器构建,这正是我所需要的。这(有点)不错,但为了发布(归档)构建,我需要将设备设置为主要目标,否则xcode不会给我这个选项


我该怎么办?

看起来您需要将脚本放入聚合目标类型中:一次构建中有两个不同的目标

我要做的是创建一个新的目标(Other->Aggregate type),并向其中添加一个脚本,然后使用该目标创建一个fat发布产品

以下是我使用的脚本:

xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -sdk iphonesimulator -configuration Release
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -sdk iphoneos -configuration Release

mkdir -p ${TARGET_BUILD_DIR}/../MyApp${CURRENT_PROJECT_VERSION}

cp -r ${TARGET_BUILD_DIR}/../Release-iphoneos/ ${TARGET_BUILD_DIR}/../MyApp${CURRENT_PROJECT_VERSION}

lipo -create "${TARGET_BUILD_DIR}/../Release-iphoneos/MyApp.framework/MyApp" "${TARGET_BUILD_DIR}/../Release-iphonesimulator/MyApp.framework/MyApp" -output "${TARGET_BUILD_DIR}/../MyApp${CURRENT_PROJECT_VERSION}/MyApp.framework/MyApp"
工作起来很有魅力。它创建了一个文件夹,其中包含版本号(您在新目标中设置了版本号)和fat框架

编辑:

为什么这对你不起作用

开发者可以免费分发iOS框架,而无需对其进行代码签名 因为消费者无论如何都会重新进行代码设计,但开发者是被迫的 Xcode在为iOS设备构建时对其框架进行代码设计


当您使用设备目标时,您将被迫进行代码签名,即使您不必这样做。这就是为什么它可以与聚合目标一起工作->您不需要进行协同设计,也不需要进行协同设计来发布框架。

选择模拟器,该过程可以正常工作,因为我认为您使用的是调试配置

在项目导航器中,选择您的项目。现在选择您的目标,并在“生成设置”选项卡下,选中“代码签名标识”Settings

如果展开该行,您应该看到在项目中设置的每个配置的一行(如果没有,您应该看到默认的调试和发布行)

现在,在“发布”行下进行检查(这是调用存档命令时使用的默认设置),该行设置了正确的标识(这取决于您在“设置配置文件”下选择的内容)


如果您想了解有关配置文件、签名身份等的更多信息,请向苹果咨询新加入xcode的人员

。。。您不能为-sdk部分使用if吗?那可能会解决你的问题你什么意思?if会做什么?我的想法是(不知道它是否可能)当你运行时,如果它是通过模拟器运行的,你会运行一个代码(skd代码),如果它的iphoneos你会运行另一个。再一次,对xcode来说真的很陌生,不知道这是否可能是一个外部构建系统目标?Other->Aggregate targetNevermind!我在正确的文件夹中,但它现在正在生成
i386
x86\u 64
!谢谢(“你可以在22小时内奖励你的赏金”:P)嗯,实际上“为什么”部分是有道理的。虽然从苹果的末日开始就很不幸