我写了一个跨平台的游戏创建库,用CMake作为框架编译成一个静态/共享库。我不需要帮助构建iOS应用程序本身,而是一个全新的苹果开发者帐户,应用ID,签名等。
以下是我初步想出的步骤:
- 框架的CMake文件需要设置目标属性
FRAMEWORK
和MACOSX_FRAMEWORK_IDENTIFIER
。 - 用户需要为自己的项目创建一个CMakeLists.txt文件。必须包含
MACOSX_BUNDLE_GUI_IDENTIFIER
、MACOSX_BUNDLE_BUNDLE_VERSION
和MACOSX_BUNDLE_SHORT_VERSION_STRING
。
我对开发人员帐户有点困惑。第三方库是否需要与之关联的开发人员帐户?对于MACOSX_FRAMEWORK_IDENTIFIER
,我可以指定任何字符串我喜欢,或者我需要注册一个应用程序ID与苹果?例如,第三方库称为可爱框架,对于标识符,我可以简单地组成像"com.cute_framework.${CF_VERSION}"
这样的字符串吗?我应该在这里附加一个版本号吗?我能用"iPhone开发工具"吗?对于框架?
对于#2,用户需要自己的开发人员帐户,并且可以自己填写MACOSX_BUNDLE_***
字段。这将允许XCode自动找出如何签署用户的应用程序和库与用户的证书?如果库是共享库呢?这里代码签名是如何工作的?
我错过了任何主要的CMake步骤吗?总的来说,我对开发人员帐户/证书如何映射到相关的CMake命令,以及第三方分布式框架和实际iOS应用程序之间的CMake差异感到困惑。
框架的Bundle ID只是一个唯一的字符串标识符,没有绑定到任何特定的开发人员帐户。用户的开发人员帐户有一个唯一的Team ID(下面有更多)。Xcode可以通过用户为框架和用户的应用自动设置代码签名来配置。
对于库/框架本身,目标属性FRAMEWORK
应该在为Apple设备构建时设置。您还应该指定框架版本和标识符(FRAMEWORK_VERSION
和MACOSX_FRAMEWORK_IDENTIFIER
)。后者被苹果用来唯一地标识框架本身。当用户对你的库进行编译时,XCode会将用户的Apple Team ID附加到框架的ID上,从而自动对框架进行签名。
set_target_properties(my_library PROPERTIES FRAMEWORK TRUE)
set_target_properties(cute PROPERTIES
FRAMEWORK_VERSION "1.0.0"
MACOSX_FRAMEWORK_IDENTIFIER "org.mylibrary.static"
)
注意——标识符中不能有下划线。
对于用户的CMake脚本,他们可以设置自己的目标属性为MacOS/iOS与MACOSX_BUNDLE_GUI_IDENTIFIER
,MACOSX_BUNDLE_BUNDLE_VERSION
和MACOSX_BUNDLE_SHORT_VERSION_STRING
。
set_target_properties(my_game PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER "com.teamname.gamename"
MACOSX_BUNDLE_BUNDLE_VERSION "1.0.0"
MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0.0"
)
初始化配置CMake时,用户需要为iOS版本指定一些设置。这里可以看到一些很好的命令行示例。例如,要在名为build
的文件夹中构建For For模拟器,用户可以使用:
cmake -G "Xcode" -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=XXXXXXXXXX -Bbuild .
对于iPhone/iPad:
cmake -G "Xcode" -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=XXXXXXXXXX -Bbuild .
CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM
来自用户的苹果开发者账户,可以通过developer.apple.com找到。这是开发者的Team ID。如果用户在Xcode中添加了开发者账号,Xcode可以在构建过程中自动设置代码签名。
同样的过程可以用来为库/框架构建任何示例应用程序,用户可以通过CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM
提供他们的Team ID来构建和签署与库/框架一起构建的任何示例应用程序。