Unity - Facebook iOS 登入權限設定

簡單紀錄一下如何透過Unity提供的PostProcessBuild Attribute功能,
設定臉書SDK 串接登入功能所需的Info.plist設定值

前情提要

由於到了新創,從原先Gameplay研發變成了一站式(開發、打包、發行)的開發負責

其中客戶的需求就有了需要把最終的XCode Project給它們,但不要Unity原始檔的這種買櫝還珠的簡易需求

為此,配合公司仍未看見的CI /CD流程,在Build iOS版本的時候順便把未來可能用到的自動化做簡單的處理

查找所需參數

對應不同版本的SDK,臉書登入所需的參數,可以透過以下步驟找到

  1. 開啟已建立的臉書應用程式 (如果還沒有建立對應的臉書應用,請直接點擊 這個臉書開發人員的連結)
  2. 主控版產品中找到想要加入的功能區塊,這邊舉Facebook登入功能當例子

  3. 然後點選快速入門,依照指示就能看到所需的參數
    就登入功能的例子來說,我們目前會在官方的快速入門說明中的步驟4找到以下內容

 

轉換邏輯

為了使用前面所提到的Unity所提供的PostProcessBuild Attribute,藉以在Unity Build的時候就自動填入設定好的內容

我們來分析前面所需的幾個參數的欄位類型

  • CFBundleURLSchemes:在Array中的string欄位
  • FacebookAppID:單純的string欄位
  • FacebookDisplayName :單純的string欄位

依目前版本的SDK中,主要可以把需求分成兩種:

  1. 新增Array,並新增一個string欄位
  2. 單純新增string欄位

確定目標後,再回過頭來看Unity所提供的功能如何使用

首先,為了讀取 / 生成XCode所需的info.plist,基本上會使用到 UnityEditor.iOS.Xcode 的內容
我們會用到 PlistDocument 在程式碼中存取這個檔案,並透過繼承 PlistElement 的物件來操作對應型別的欄位內容

有興趣的人可以再透過官方網站深入

以下直接將所需的欄位內容使用Unity提供的方法進行轉換

#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.Callbacks;
#if UNITY_IOS
using System.IO;
using UnityEditor.iOS.Xcode;
#endif

public class XcodeAssistant
{
	[PostProcessBuild]
	public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
	{
#if UNITY_IOS
		// Read plist
		var plistPath = Path.Combine(path, "Info.plist");
		var plist = new PlistDocument();
		plist.ReadFromFile(plistPath);

		PlistElementDict rootDict = plist.root;
		// Update value - Facebook Info
		rootDict.SetString("FacebookAppID", /*你的APP_ID,只有數字部分*/);
		rootDict.SetString("FacebookDisplayName", /*你的APP_NAME*/);

		// Update value - Facebook Permission
		PlistElementArray QueriesSchemes = plist.root["LSApplicationQueriesSchemes"] as PlistElementArray;
		if (QueriesSchemes == null)
		{
			QueriesSchemes = plist.root.CreateArray("LSApplicationQueriesSchemes");
		}

		// Update value - Facebook URLTypes
		PlistElementArray urlTypes = plist.root["URL Types"] as PlistElementArray;
		if (urlTypes == null)
		{
			urlTypes = plist.root.CreateArray("URL Types");
		}
		PlistElementDict dict = urlTypes.AddDict();
		PlistElementArray urlSchemes = dict.CreateArray("URL Schemes");
		urlSchemes.AddString(/*你的APP_ID,要加fb前綴*/);

		
		// Write plist
		File.WriteAllText(plistPath, plist.WriteToString());
#endif
	}

}

#endif

這樣基本上就能將所需的參數在Build XCode Project的階段就直接設定好了

注意事項

大體上比較值得注意的還有幾點

  1. Info.plist 檔案 有可能在其他第三方套件有可能會使用,如果發現衝突
  2. 同上,LSApplicationQueriesSchemes 有可能會在其他SDK,使用前最好確認是否已經設定了
  3. 由於會用到UnityEditor 與 UnityEditor.Callbacks,如果沒有放置在Editor資料夾的話,記得加上UNITY_EDITOR的preprocessor 
  4. 同上,UnityEditor.iOS.Xcode只有在iOS平台才能使用,這部分就一定要記得包含對info.plist的操作片段都要用 UNITY_IOS 的preprocessor 作處理

 


感謝觀看,若你能夠留下一些建議與感想
都會成為我寫文章的動力,感謝!!