Facebook iOS SDK:适用于不同环境的多个Facebook应用

时间:2014-07-09 18:59:56

标签: ios facebook xcode5 facebook-ios-sdk

我们正在构建一个应用程序,它在Xcode 5上使用适用于iOS 7的最新Facebook iOS SDK(3.15)。有一个关联的Web产品,我们使用3个环境进行部署:生产,登台和开发。我们为这些环境中的每个环境都有一个单独的Facebook应用程序,这些应用程序已有详细记但是,Facebook的iOS SDK需要在FacebookAppID文件中指定FacebookDisplayNameURL SchemesInfo.plist。我们的移动应用程序也设置了3个环境,为每个环境使用不同的配置。我无法让Facebook SDK在我们的Info.plist文件中使用特定于配置的值。

任何人都可以帮助我指出使用多个Facebook应用设置多个iOS应用环境的正确方向吗?

2 个答案:

答案 0 :(得分:4)

我使用的策略与Azat不同,后者适用于iOS 7/8和Facebook iOS SDK v3.21。因为除了Facebook之外我有多个特定于环境的设置,我创建了一个通用的Singleton来处理环境配置。以下是步骤:

<强> 1。为App创建配置

转到“项目设置”,“信息”选项卡,然后为每个不同的环境创建配置。我个人使用了DevelopmentStagingReleaseDebug(最后2个都用于生产环境)。

<强> 2。在Info.plist中公开配置名称

在您应用的Info.plist文件中,创建一个名为Configuration的密钥,并将值设置为${CONFIGURATION}

第3。构建Singleton以处理环境配置

完整的代码可以在this gist中找到,但这里有一个要点(没有双关语)。您将创建一个附加属性列表Environments.plist,其中包含每个配置的键,其值为包含所有特定于环境的设置的字典。接下来,您将构建一个Environment类,该类将具有单例实例,您可以通过该实例公开这些设置。基本上,您可以从应用中导入[[Environment sharedInstance] facebookAppId]的任何地方拨打Environment.h,我们将在下一步中执行此操作。

<强> 4。在您的应用代表中明确选择Facebook appId和displayName

AppDelegate.m application:didFinishLaunchingWithOptions方法中,第一行应为:

[FBSettings setDefaultAppID:[[Environment sharedInstance] facebookAppId]];
[FBSettings setDefaultDisplayName:[[Environment sharedInstance] facebookDisplayName]];

<强> 5。将Facebook URL方案添加到Info.plist

Info.plist中,您需要为您所有环境中使用的每个Facebook应用添加网址架构。请参阅here说明,但URL Schemes下只有1个项目,每个环境都有1个。

<强> 6。选择方案中的配置

要使用特定配置运行,请编辑您的方案(Mac上的⌘+<快捷方式)并选择您的配置。为了便于每次运行时不必编辑,我为每个环境创建了一个方案,并为运行,测试,配置文件和存档选择了正确的配置。

这是最后在iOS 8和Facebook iOS SDK v3.21上测试的,但我希望这里的一般策略可以应用于iOS 9及更高版本的Facebook iOS SDK。希望这有帮助!

答案 1 :(得分:1)

您可以向项目添加新的target,选择OS X&gt; Other&gt; External Build System并使用/usr/bin/python作为构建工具。

然后,在构建设置中,添加用户定义的设置,FB_APP_ID并为不同的构建配置设置应用的ID(Debug / Release /等)。

在“信息”标签的Arguments字段中,输入以下内容

fbupdate.py $(FB_APP_ID)

以下是fbupdate.py脚本:

# coding: utf-8
import os
import sys

from lxml.etree import tostring, parse

if __name__ == '__main__':
    fb_app_id = None
    new_fb_app_id = sys.argv[1]

    filename = os.path.join(os.path.dirname(__file__), '..', 'TargetName', 'Info.plist')

    tree = parse(filename)

    for el in tree.xpath('//plist/dict/key[text()="FacebookAppID"]'):
        value_el = el.getnext()
        fb_app_id = value_el.text
        value_el.text = new_fb_app_id
        break

    for el in tree.xpath('//array/string[text()="fb{fb_app_id}"]'.format(
            fb_app_id=fb_app_id)):
        el.text = 'fb' + new_fb_app_id
        break

    with open(filename, 'w') as f:
        f.write(tostring(tree, encoding='UTF-8', xml_declaration=True).encode('utf8'))

    print('FB App ID update done.')

我在项目的根文件夹中使用Scripts文件夹,因此我在“目录”字段中指定它。如果您有不同的位置,请不要忘记更改脚本以打开正确的Info.plist文件。此外,您还需要将脚本中的TargetName替换为原始目标。

然后,转到原始目标设置,并在Build Phases中将目标依赖项添加到新创建的External Build System目标。

现在这个python脚本将运行之前构建原始目标,并将正确的Facebook App ID添加到Info.plist,它将是您当前版本中需要的ID配置。

P.S。您可能需要从终端运行pip install lxml和/或安装任何其他依赖项以使该脚本在您的计算机上运行

P.P.S。我知道原始问题可能为时已晚,但对其他人可能有用