【问题标题】:How do I create an xcode project with multiple targets for different platforms (iPhone & Mac OS X)?如何为不同平台(iPhone 和 Mac OS X)创建具有多个目标的 xcode 项目?
【发布时间】:2011-01-10 22:32:22
【问题描述】:

我编写了几个 Core Data iPhone 应用程序,但遇到了一个一致的问题,我希望这将成为 iPhone 开发的常见模式。也就是说,我有一个或多个命令行数据加载器来创建 Core Data 数据库,然后我有我的 iPhone 应用程序。由于模型文件是共享的,并且加载器是项目的一个组成部分,我希望它是一个单独的项目。

使用 iPhone OS 目标和命令行目标创建项目的正确方法是什么?我所有的尝试都没有奏效——我遇到了代码签名、调试和配置问题。

这是我迄今为止最好的尝试:

  • 创建一个 iPhone 项目
  • 添加新的 Cocoa Shell 工具目标
  • 在目标的构建配置中将基础 SDK 更改为“当前 Mac OS”

此时我没有可执行文件。 (相比之下,如果您创建一个新的命令行实用程序项目,那么可执行文件会自动与您的目标关联。)

如果我创建一个自定义可执行文件,那么我会遇到一些麻烦:(1)更改目标不会更改可执行文件,因为您无法将自定义可执行文件链接到目标,(2)调试命令行程序是有问题,因为在 XCode 中设置的断点没有被注册(调试可执行文件时行号处的 V 形变为橙色),所以我必须闯入正在运行的代码,然后从控制台手动处理调试,(3)最令人沮丧的是,如果我为我的 iPhone 应用程序创建了正确配置的分发版本,那么将 iPhone 应用程序传输到设备会失败,并抱怨配置文件与代码签名权利不匹配。绝对不是这种情况,因为我为 iPhone 目标的分发版本设置了配置文件和授权文件,但无论我如何摆弄我都无法在设备上安装目标。 (如果我使用相同的代码和代码签名而不使用命令行工具创建一个新项目,那么我可以安装一个 AdHoc 配置的应用程序。)

那么...还有其他一些我应该遵循的模式吗? Xcode 配置是严重的巫术。

【问题讨论】:

  • 嗨,我也遇到了同样的问题——你找到解决办法了吗?
  • 我也遇到了同样的问题。从谷歌搜索来看,Xcode 似乎可能有一个 PLATFORM_NAME 环境变量。我不知道除了 'iphonesimulator' 之外它的有效值是什么。

标签: iphone xcode macos


【解决方案1】:

好的,我认为你的问题需要重新定义。

正如你所说:

也就是说,我有一个或多个命令行数据加载器来创建 Core Data 数据库

您的要求是为您的核心数据 iPhone 应用程序预填充数据库,并且您还希望让该工具与您最新的核心数据模型保持一致我说的对吗?

如果我的理解是正确的。我想,与其创建专用的命令行工具来预填充数据库,不如在单元测试目标中执行它会是一个更好的选择。

我的解决方案

这就是我正在使用我的核心数据 iOS 应用程序所做的事情。

  1. 创建具有核心数据支持和逻辑测试支持的项目。
  2. 编写一个简单的测试用例来访问 MOC 和模型以填充数据库文件。
  3. 同时,编写另一个测试用例读取数据文件,完成繁重的导入工作。

如果您没有太多要导入的数据,可以将 2 和 3 集成到一个测试用例中。

一些好处

  1. 您可以使用⌘ + k 删除之前创建的所有内容。
  2. 您可以使用⌘ + u 再次运行测试用例并用数据重新填充数据库。
  3. 始终访问最新版本的核心数据模型。
  4. 最重要的是,所有这些都是由 Xcode 的默认项目模板提供的。您无需做任何额外的工作即可确保两个目标都能正常工作。

注意一些事情。

  1. 如果您使用的是Xcode 4.1,我建议您升级到Xcode 4.2+ 甚至Xcode 4.3,因为Xcode 4.1,您直接访问MOC 和模型文件会有些麻烦。 (至少,根据我的经验)并且 Xcode 4.2 支持单元测试应用程序直接访问您的文档文件夹中的数据库文件。之后您需要做的就是找到 sqlite 文件并覆盖项目中的那个。
  2. 如果您无法迁移到 Xcode 4.2+,请记住将核心数据建模文件添加到您的逻辑测试目标,并使用[NSBundle bundleForClass:{Your testcase class name}] 获取正确的包路径,这样您就可以加载核心数据模型并创建MOC 实例。

真实样本

您可以在 github 上的开源项目中看到我是如何做到这一点的

这是来自我的测试用例的简短代码。

- (void)setUp
{
  [super setUp];

  // Set-up CoreData
  yourMocObj = ...;
}

- (void)tearDown
{
  // Tear-down code here.
  [yourMocObj save];
  [super tearDown];
}

- (void)test_PopulateData{
  // Get the path for the data file.
  NSString *plistPath = [[NSBundle bundleForClass:[algorithms_iOSTests class]] pathForResource:@"AlgorithmsMasterViewData" ofType:@"plist"];
  NSArray *dataArray = [NSArray arrayWithContentsOfFile:plistPath];

  NSEntityDescription *yourEntity = [NSEntityDescription entityForName:.. inManagedObjectContext:yourMocObj];

  [dataArray enumerateObjectsUsingBlock:^(NSDictionary *aCategoryDict, NSUInteger idx, BOOL *stop) {
    // Category is a custom subclass of NSManagedObject.
    Category *aCategory = [[Category alloc] initWithEntity:yourEntity insertIntoManagedObjectContext:yourMocObj];
    [aCategory safelySetValuesForKeysWithDictionary:aCategoryDict];

  }];

}

【讨论】:

    【解决方案2】:

    根据我自己的经验,如果您的项目以 iOS 项目开始,那么您将陷入痛苦的世界,就像您已经发现的那样。当然,您可以将 OS X 目标添加到您的 iPhone 项目中,但构建的可执行文件不会自动添加到 Xcode 中。然后,您可以添加自定义可执行文件,但配置存在于特定于用户的项目文件中,如果您使用源代码控制并与其他人协作,这可能会破坏交易。此外,正如您所发现的,它与调试器等的集成并没有达到应有的水平。

    如果您想要一个更易于管理的项目,我建议您从 OS X 项目开始,然后添加您的 iOS 目标。这对我来说效果更好。

    这在 Xcode 4 中可能会得到改进,但在 3.2 中这些问题确实是一个拖累。至少你知道你并不孤单。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。出于完全相同的原因:我的主要项目是一个基于 coredata 的 iphone 应用程序,我需要一个实用程序来将数据加载到 coredata 数据库中。

      经过一番搜索,我发现这个网站有一个答案:

      http://blog.vucica.net/2010/09/single-xcode-project-for-ios-and-mac-os-x.html

      基本上,它归结为:当您选择“Overview”弹出窗口(您选择 Active Config、Active Target、Active Exec、Active Arch)时按住选项键。我选择了“Use Base SDK”,它似乎很喜欢。不幸的是,每次从目标切换到目标时都必须这样做。

      当我尝试编译 OSX 目标时,它对我有用。现在我只需要修复应用程序中的所有实际错误...

      【讨论】:

        【解决方案4】:

        注意一件有趣的事情。

        如果你制作了一个 Mac OS X 应用项目,并添加了一个新的 iOS 应用目标,你可以同时切换它们!您甚至可以编译这两个 Mac OS X/iOS 目标。

        但是!!!

        仅适用于 iOS 设备平台。 如果你选择了一次模拟器,项目就固定在 iOS 应用上,再也不会为 Mac OS X 编译了。 (您仍然可以选择 Mac OS X 应用程序目标,但它不再被编译)

        所以它无法使用。

        还有一件事......

        关闭你的 Xcode。 如果您在.xcodeproj 文件夹中看到,您可以看到几个文件。你可以找到一个.pbxuser 文件。用文本编辑器打开,找到一行activeSDKPreference=... 如果存在,请擦除该行并保存文件。 用 Xcode 重新打开项目。哎呀!它被重置了!您可以再次编译 Mac OS X 目标!

        【讨论】:

        • 当你在 Xcode 的工具栏中使用方案/目标选择器时,只要按住 option 键,你就可以做同样的事情。
        猜你喜欢
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 2015-03-16
        • 1970-01-01
        • 2016-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多