【问题标题】:How to intercept reading of plist values in Objective-C code?如何拦截在 Objective-C 代码中读取 plist 值?
【发布时间】:2012-08-14 23:51:37
【问题描述】:

我们正在为 PhoneGap 使用新的 Urban Airship iOS plugin

在插件的 plist 文件中,我们应该输入启用推送通知所需的应用特定键。

问题是我们有两个版本,免费和付费,同一个应用程序,但 plist 文件只容纳一个版本。

本质上,我们需要修改 Objective-C 代码以读取不同的 plist 值,具体取决于它是免费版还是高级版。

我们目前使用相同的代码库和 Xcode 项目管理这两个版本。除非我们更改插件代码,否则我们似乎需要创建一个新的 Xcode 项目,而我们不想这样做。

我们如何调整 Urban Airship 的 Objective-C 文件以从 plsit 文件中读取不同的值?

【问题讨论】:

  • 为每个目标使用多个目标和自定义构建预处理器,您可以轻松拥有一个PRO 预处理器,它允许您在必要时使用简单的 if 语句。您甚至可以为每个目标设置单独的文件。我经常专门将它用于 plist。
  • 谢谢,瑞恩。如何配置 Xcode 项目以读取不同的 plist 文件?您也可以将此添加为答案吗?
  • @RyanPoolos,如果通知没有通过,因为你没有被标记,这是另一条评论,所以你知道我回复了。 :)

标签: objective-c ios cordova phonegap-plugins urbanairship.com


【解决方案1】:

对不起,让你久等了,我想给你一个非常详细的答案,而不是昨晚匆忙:)所以我们开始吧。

首先在您的项目中,我们需要添加一个新目标。转到您的项目设置并右键单击您的目标。点击复制。

您将获得一个可能名为 Target-copy 的新目标。您还将获得一个仅针对该目标的新 info.plist 文件。

接下来我们将编辑 Pro 版本的内置设置。滚动或搜索并找到 Apple LLVM 编译器 4.0 预处理。添加到您的调试和发布配置。我通常只使用简单的PRO=1。您还需要将 PRO=0 添加到您的 lite 版本,否则在您尝试构建该版本时它将未定义。

现在让我们看看如何添加自定义 plist,我相信你会需要的。首先创建两个文件夹。重要的是这些是文件夹而不是组。在每个文件夹中,我们可以创建一个文件名完全相同的 plist。

从现在开始,您可以为它们中的每一个添加一些东西。我刚刚添加了一个键 property 和一个值 pro string / lite string。最后到代码。在我制作的示例项目中,我简单地覆盖了viewDidLoad,但显然这在任何地方都可以使用。由于 plist 具有相同的名称,您可以使用一行代码加载它们。它们永远不会混淆,因为它们只会被复制到各自的目标。如果你需要做基于代码级的逻辑,你可以使用我们制作的PRO 预处理器。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // This will load the proper plist automatically.
    NSLog(@"Plist Value: %@",[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Property List" ofType:@"plist"]] objectForKey:@"property"]);

    // Also remember we set up a preprocessor PRO. you can use it as well.
    if (PRO) {
        NSLog(@"Only Show for Pro");
    } else {
        NSLog(@"Only Show for Lite");
    }

    NSLog(@"This will show for both");
}

这是我用于所有精简版/专业版应用程序的方法,因此我可以共享一个通用代码库,而无需在项目或其他复杂系统之间复制它。到目前为止,它对我来说效果很好:) 快乐编码!

来源

认为有人可以使用该项目来查看,所以这里是GitHub

【讨论】:

  • 谢谢,瑞恩!哇。这非常详细,但我认为最后一个屏幕截图是我们需要的,因为我们的目标只是将 plist 文件添加到现有插件。问题是,我们似乎无法在插件中找到 plist 文件的加载位置:github.com/urbanairship/phonegap-ua-push/tree/master/ios-sample/…
  • 语法是否有时与您使用的不同?
  • 您可能应该按照我的帖子的第一部分,在那里您有一个单独的目标并将相同命名的 plist 添加到不同的目标。然后你不需要查看它的加载位置,它会自动加载正确的。
  • 然后你就可以为每个目标有一个AirshipConfig.plist,每个目标都有自定义值。
  • 谢谢,瑞恩!在添加插件之前,我们已经有了单独的目标。这是否意味着我们需要将插件添加到每个目标?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2014-12-31
  • 1970-01-01
  • 2010-12-09
  • 2011-03-30
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多