Facebook iOS SDK:针对不同环境的多个Facebook应用程序

hun*_*ros 4 facebook ios facebook-ios-sdk xcode5

我们正在构建一个应用程序,该应用程序在Xcode 5上使用针对iOS 7的最新Facebook iOS SDK(3.15)。存在一个关联的Web产品,并且我们使用3种环境进行部署:生产,登台和开发。对于每种环境,我们都有一个单独的Facebook应用程序,该应用程序有据可查,并且在网络上运行良好。然而,Facebook的iOS版SDK需要指定FacebookAppIDFacebookDisplayName以及URL Schemes在我们的Info.plist文件。我们的移动应用程序还设置了3种环境,每种环境使用不同的配置。我无法使Facebook SDK与我们Info.plist文件中特定于配置的值配合使用。

谁能帮我指出正确的方向,以使用多个Facebook应用程序设置多个iOS应用程序环境?

hun*_*ros 5

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

1.为应用程序创建配置

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

2.在Info.plist中公开配置名称

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

3.构建Singleton以处理环境配置

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

4.在您的应用程序委托中明确选择Facebook appId和displayName

在您AppDelegate.mapplication:didFinishLaunchingWithOptions方法中,第一行应显示为:

[FBSettings setDefaultAppID:[[Environment sharedInstance] facebookAppId]];
[FBSettings setDefaultDisplayName:[[Environment sharedInstance] facebookDisplayName]];
Run Code Online (Sandbox Code Playgroud)

5.将Facebook URL方案添加到Info.plist

在中Info.plist,您需要为所有环境中使用的每个Facebook应用添加URL方案。请参阅此处的说明,但URL Schemes对于每个环境,您将只有1个,而不是下一个。

6.在方案中选择配置

要使用特定配置运行,请编辑方案(?+<在Mac上为快捷方式),然后选择配置。为了使每次运行时都不必进行编辑,我为每个环境创建了一个方案,并为运行,测试,配置文件和存档选择了适当的配置。


上次在iOS 8和Facebook iOS SDK v3.21上进行了测试,但我希望此处的一般策略可以适用于iOS 9和更高版本的Facebook iOS SDK。希望这可以帮助!


Aza*_*zat 1

您可以target向项目添加新内容,选择OS X>>OtherExternal Build System用作/usr/bin/python构建工具。

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

在“信息”选项卡的字段中Arguments输入以下内容

fbupdate.py $(FB_APP_ID)
Run Code Online (Sandbox Code Playgroud)

这是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.')
Run Code Online (Sandbox Code Playgroud)

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

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

现在,这个 python 脚本将在构建原始目标之前运行,并将正确的 Facebook 应用程序 ID 放入其中Info.plist,这将是您当前构建配置中需要的 ID。

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

PPS 我知道对于原始问题来说可能为时已晚,但对其他人可能有用