2014-07-09 107 views
3

我們正在構建一個應用程序,該應用程序在Xcode 5上爲iOS 7使用最新的Facebook iOS SDK(3.15)。有一個關聯的Web產品,我們使用3個環境進行部署:生產,分期和發展。我們爲這些環境中的每一個都有一個單獨的Facebook應用程序,這些應用程序已經過詳細記錄並且可以在網絡上正常運行但是,Facebook的iOS SDK需要在我們的Info.plist文件中指定FacebookAppIDFacebookDisplayNameURL Schemes。我們的移動應用程序也與3個環境一起設置,對每個環境使用不同的配置。我一直無法使用我們的Info.plist文件中的配置特定值來與Facebook SDK配合使用。Facebook iOS SDK:適用於不同環境的多個Facebook應用程序

任何人都可以幫助我指出正確的方向來設置多個iOS應用程序環境與多個Facebook應用程序?

+0

你解決了這個問題嗎? – Esqarrouth

+0

@Esq我最近面臨同樣的問題,請檢查我的回答下面 – Azat

+0

@Esq我剛剛發佈我的答案使用與Azat不同的策略。請檢查下面,對於延遲抱歉,希望它有幫助。 – hunteros

回答

1

您可以新target添加到您的項目,選擇OS X>Other>External Build System和使用/usr/bin/python作爲構建工具。

然後,在Build Settings中,添加用戶定義設置FB_APP_ID併爲不同的構建配置(Debug/Release/etc)設置您的應用程序的ID。

在信息選項卡,在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將Target Dependencies添加到新創建的External Build System目標。

現在這個python腳本將之前運行你原來目標的構建,並把正確的Facebook應用程序ID的Info.plist,這將是該ID,你在你的當前版本的配置需要。

P.S.您可能需要從終端運行pip install lxml和/或安裝任何其他依賴項以使該腳本在您的機器上運行

P.P.S.我知道對於原始問題可能太遲了,但它可能對其他人有用

3

我使用了與Azat不同的策略,它適用於iOS 7/8和Facebook iOS SDK v3.21。因爲我擁有超過特定環境的Facebook的多個設置,所以我創建了一個通用的Singleton來處理環境配置。以下是具體步驟:

1.應用

轉到您的項目設置,信息標籤創建的配置,併爲每個不同的環境中創建的配置。我個人使用了Development,Staging,ReleaseDebug(生產環境的最後兩個)。

2.暴露配置名稱在Info.plist中

在您的應用程序的Info.plist文件,創建一個名爲Configuration鍵和值設置爲${CONFIGURATION}

3.生成辛格爾頓以處理環境配置

完整的代碼可以在this gist找到,但這裏是它的要點(沒有雙關語意)。您將爲每個配置創建一個附加屬性列表Environments.plist,其中每個配置的值都是包含所有環境特定設置的字典。接下來,您將構建一個Environment類,該類將擁有一個單例實例,通過它可以公開這些設置。基本上,您可以從您的應用程序中的任何地方撥打[[Environment sharedInstance] facebookAppId],您已導入Environment.h,我們將在下一步中執行此操作。

4.明確表示選擇Facebook的應用標識和顯示名在應用程序委託

在你AppDelegate.mapplication:didFinishLaunchingWithOptions方法,第一個行應改爲:

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

5.添加Facebook網址方案Info.plist

在您的Info.plist,您需要添加URL您爲所有環境使用的每個Facebook應用程序的方案。請參閱here說明,但不是URL Schemes下的1項,而是針對每種環境都有1項。

6.選擇配置方案

要使用特定的配置中運行,修改您的方案(⌘+<快捷鍵在Mac)並選擇配置。爲了讓每次運行時都無需編輯,我爲每個環境創建了一個方案,併爲運行,測試,配置文件和存檔選擇了適當的配置。


這是最後一次在iOS 8和Facebook的iOS SDK v3.21測試,但我希望這裏的一般策略可以應用到iOS 9和Facebook的iOS版SDK的更新版本。希望這可以幫助!

相關問題