hun*_*ros 4 facebook ios facebook-ios-sdk xcode5
我们正在构建一个应用程序,该应用程序在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应用程序环境?
我使用与Azat不同的策略,后者适用于iOS 7/8和Facebook iOS SDK v3.21。因为除了Facebook之外,我还有多个特定于环境的设置,所以我创建了一个通用的Singleton来处理环境配置。步骤如下:
1.为应用程序创建配置
转到“项目设置”的“信息”选项卡,然后为每个不同的环境创建配置。我个人使用Development,Staging,Release,和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.m的application: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。希望这可以帮助!
您可以target向项目添加新内容,选择OS X>>Other并External 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 我知道对于原始问题来说可能为时已晚,但对其他人可能有用
| 归档时间: |
|
| 查看次数: |
1461 次 |
| 最近记录: |