我们正在构建一个应用程序,它在Xcode 5上使用适用于iOS 7的最新Facebook iOS SDK(3.15)。有一个关联的Web产品,我们使用3个环境进行部署:生产,登台和开发。我们为这些环境中的每个环境都有一个单独的Facebook应用程序,这些应用程序已有详细记但是,Facebook的iOS SDK需要在FacebookAppID
文件中指定FacebookDisplayName
,URL Schemes
和Info.plist
。我们的移动应用程序也设置了3个环境,为每个环境使用不同的配置。我无法让Facebook SDK在我们的Info.plist
文件中使用特定于配置的值。
任何人都可以帮助我指出使用多个Facebook应用设置多个iOS应用环境的正确方向吗?
答案 0 :(得分:4)
我使用的策略与Azat不同,后者适用于iOS 7/8和Facebook iOS SDK v3.21。因为除了Facebook之外我有多个特定于环境的设置,我创建了一个通用的Singleton来处理环境配置。以下是步骤:
<强> 1。为App创建配置
转到“项目设置”,“信息”选项卡,然后为每个不同的环境创建配置。我个人使用了Development
,Staging
,Release
和Debug
(最后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。我知道原始问题可能为时已晚,但对其他人可能有用