主頁 > 移動端開發 > 教你在Unity 2020接Facebook SDK(Android平臺)

教你在Unity 2020接Facebook SDK(Android平臺)

2021-04-22 11:13:37 移動端開發

文章目錄

      • 一、前言
      • 二、下載Facebook SDK
      • 三、匯入SDK
      • 四、切換到Android平臺
      • 五、Dependencies.xml
      • 六、執行Play Services Resolver
      • 七、Edit Settings
      • 八、介面說明
        • 1、初始化
        • 2、登錄
        • 3、快速登錄
        • 4、登出
        • 5、分享
        • 6、支付
      • 九、測驗
        • 1、制作測驗界面
        • 2、測驗腳本
        • 3、Editor環境下測驗
        • 4、發布成Android apk測驗
      • 十、結束語

一、前言

點關注不迷路,持續輸出Unity干貨文章,
嗨,大家好,我是新發,
最近需要接Facebook,那么,寫下這個程序吧,
最終效果如下:
在這里插入圖片描述
本文Demo工程已上傳到CodeChina,感興趣的同學可自行下載學習(注:Demo中的AppId需要自行修改),
地址:https://codechina.csdn.net/linxinfa/UnityFacebookSdkDemo
注:我使用的Unity版本:2020.2.7f1c1 (64-bit)
在這里插入圖片描述

二、下載Facebook SDK

Facebook為了方便Unity接入,官方做了封裝,大家直接下載For Unity版本的SDK即可,
地址:https://developers.facebook.com/docs/unity/downloads
注:訪問上面這個地址需要科學上網,
目前最新版本是9.1.0,點擊它進行下載,
在這里插入圖片描述
下載下來后,它是一個unitypackage檔案,
在這里插入圖片描述

三、匯入SDK

為了演示,我新建一個空的Unity工程,
在這里插入圖片描述
把剛剛下載的unitypackage檔案匯入到工程中,
在這里插入圖片描述
匯入成功后:
在這里插入圖片描述

四、切換到Android平臺

Build Settings中切換到Android平臺,
在這里插入圖片描述

五、Dependencies.xml

FacebookSDK/Plugins/Editor檔案夾中,有個Dependencies.xml
在這里插入圖片描述
里面配置了FacebookSDK依賴的一些庫:

<?xml version="1.0" encoding="utf-8"?>
<dependencies>
    <androidPackages>
        <androidPackage spec="com.parse.bolts:bolts-android:1.4.0" />
        <androidPackage spec="com.facebook.android:facebook-core:[9.0, 10)" />
        <androidPackage spec="com.facebook.android:facebook-applinks:[9.0, 10)" />
        <androidPackage spec="com.facebook.android:facebook-login:[9.0, 10)" />
        <androidPackage spec="com.facebook.android:facebook-share:[9.0, 10)" />
        <androidPackage spec="com.facebook.android:facebook-gamingservices:[9.0, 10)" />
    </androidPackages>
    <iosPods>
        <iosPod name="FBSDKCoreKit" version="~> 9.2" />
        <iosPod name="FBSDKLoginKit" version="~> 9.2" />
        <iosPod name="FBSDKShareKit" version="~> 9.2" />
        <iosPod name="FBSDKGamingServicesKit" version="~> 9.2" />
    </iosPods>
</dependencies>

我們在打包之前,需要先下載這些依賴的庫,下面執行Play Services Resolver便是下載這些依賴的庫檔案,

六、執行Play Services Resolver

點擊選單Assets / Play Services Resolver / Android Resolver / Resolver
在這里插入圖片描述
接著,它就會開始安裝和下載,一路點擊Yesagree,耐心等待,
在這里插入圖片描述

如果你本地沒有配置JAVA_HOME,則會彈出這個報錯
在這里插入圖片描述
需要在環境變數中配置一下JAVA_HOME環境變數:
在這里插入圖片描述
在這里插入圖片描述

如果點擊Assets / Play Services Resolver / Android Resolver / Resolver沒有任何反應,可以在Player Settings中把Api Compatibility Levell設定為.NET 4.x,然后重試,

下載完成后,即可看到Plugins/Android目錄中多了很多aar檔案,
在這里插入圖片描述
如果你是內網開發,你需要現在外網下載好這些庫檔案,然后再拷貝到內網工程中,

七、Edit Settings

點擊選單Facebook/Edit Settings
在這里插入圖片描述
如下:
在這里插入圖片描述
關鍵幾個引數說明:
App Name:專案名稱
Facebook App Id:在Facebook開發者平臺上注冊的應用ID
Package Name:專案包名,例:com.linxinfa.game
點擊Regenerate Android Manifest按鈕,會生成AndroidManifest.xml
在這里插入圖片描述

八、介面說明

1、初始化

在呼叫登錄之前,需要先執行初始化介面,官方示例:

// Include Facebook namespace
using Facebook.Unity;

// Awake function from Unity's MonoBehavior
void Awake ()
{
    if (!FB.IsInitialized) {
        // Initialize the Facebook SDK
        FB.Init(InitCallback, OnHideUnity);
    } else {
        // Already initialized, signal an app activation App Event
        FB.ActivateApp();
    }
}

private void InitCallback ()
{
    if (FB.IsInitialized) {
        // Signal an app activation App Event
        FB.ActivateApp();
        // Continue with Facebook SDK
        // ...
    } else {
        Debug.Log("Failed to Initialize the Facebook SDK");
    }
}

private void OnHideUnity (bool isGameShown)
{
    if (!isGameShown) {
        // Pause the game - we will need to hide
        Time.timeScale = 0;
    } else {
        // Resume the game - we're getting focus again
        Time.timeScale = 1;
    }
}

2、登錄

登錄介面,會拉起Facebook授權頁,

var perms = new List<string>(){"public_profile", "email"};
FB.LogInWithReadPermissions(perms, AuthCallback);

private void AuthCallback (ILoginResult result) {
    if (FB.IsLoggedIn) {
        // AccessToken class will have session details
        var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;
        // Print current access token's User ID
        Debug.Log(aToken.UserId);
        // Print current access token's granted permissions
        foreach (string perm in aToken.Permissions) {
            Debug.Log(perm);
        }
    } else {
        Debug.Log("User cancelled login");
    }
}

3、快速登錄

如果登錄過一次,本地會快取票據,可以呼叫快速登錄,
判斷本地票據是否過期:

using Facebook.Unity;

if(null != AccessToken.CurrentAccessToken &&
	AccessToken.CurrentAccessToken.ExpirationTime > System.DateTime.Now)
{
	// 本地快取票據有效,可以呼叫快速登錄介面
}

快速登錄:

FB.Android.RetrieveLoginStatus(LoginStatusCallback);

private void LoginStatusCallback(ILoginStatusResult result) {
    if (!string.IsNullOrEmpty(result.Error)) {
        Debug.Log("Error: " + result.Error);
    } else if (result.Failed) {
        Debug.Log("Failure: Access Token could not be retrieved");
    } else {
        // Successfully logged user in
        // A popup notification will appear that says "Logged in as <User Name>"
        Debug.Log("Success: " + result.AccessToken.UserId);
    }
}

4、登出

 FB.LogOut();

5、分享

FB.ShareLink(
    new Uri("https://developers.facebook.com/"),
    callback: ShareCallback
);

private void ShareCallback (IShareResult result) {
    if (result.Cancelled || !String.IsNullOrEmpty(result.Error)) {
        Debug.Log("ShareLink Error: "+result.Error);
    } else if (!String.IsNullOrEmpty(result.PostId)) {
        // Print post identifier of the shared content
        Debug.Log(result.PostId);
    } else {
        // Share succeeded without postID
        Debug.Log("ShareLink success!");
    }
}

6、支付

有三個介面:

public static void Pay(string product, string action = "purchaseitem", int quantity = 1,
						 int? quantityMin = null, int? quantityMax = null, string requestId = null,
						 string pricepointId = null, string testCurrency = null, 
						 FacebookDelegate<IPayResult> callback = null);

public static void PayWithProductId(string productId, string action = "purchaseiap", int quantity = 1, 
							int? quantityMin = null, int? quantityMax = null, string requestId = null, 
							string pricepointId = null, string testCurrency = null, 
							FacebookDelegate<IPayResult> callback = null);

public static void PayWithProductId(string productId, string action = "purchaseiap",
								 string developerPayload = null, string testCurrency = null, 
								 FacebookDelegate<IPayResult> callback = null);

呼叫示例:

FB.Canvas.Pay(this.payProduct, callback: this.HandleResult);

九、測驗

1、制作測驗界面

為了演示,我用UGUI制作一個簡單的界面,如下:
在這里插入圖片描述
對應的Hierarchy視圖如下:
在這里插入圖片描述

2、測驗腳本

寫個測驗腳本FacebookSdkTest.cs,掛到Canvas節點上,并賦值對應的ui變數:
在這里插入圖片描述
FacebookSdkTest.cs代碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Facebook.Unity;
using System;

public class FacebookSdkTest : MonoBehaviour
{
    public Text logText;

    public Button loginBtn;
    public Button logoutBtn;
    public Button payBtn;
    public Button shareBtn;

    void Awake()
    {
        // 初始化
        FB.Init(() =>
        {
            if (FB.IsInitialized)
            {
                FB.ActivateApp();
                Debug.Log("Init Ok, AppId: " + FB.AppId);
            }
            else
            {
                Debug.Log("Failed to Initialize the Facebook SDK");
            }
        });
    }

    void Start()
    {

        logText.text = "";
        Application.logMessageReceived += (string condition, string stackTrace, LogType type) =>
        {
            logText.text += condition + "\n";
        };

        loginBtn.onClick.AddListener(DoLogin);
        logoutBtn.onClick.AddListener(DoLogout);
        payBtn.onClick.AddListener(DoPay);
        shareBtn.onClick.AddListener(DoShare);

    }

    private void DoLogin()
    {
        if(FB.IsLoggedIn)
        {
            Debug.Log("You have logined!"); 
            return;
        }
        if (null != AccessToken.CurrentAccessToken && AccessToken.CurrentAccessToken.ExpirationTime > System.DateTime.Now)
        {
            // 快速登錄
            FB.Android.RetrieveLoginStatus((result) =>
            {
                if (!string.IsNullOrEmpty(result.Error))
                {
                    Debug.Log("Error: " + result.Error);
                }
                else if (result.Failed)
                {
                    Debug.Log("Failure: Access Token could not be retrieved");
                }
                else
                {
                    Debug.Log("Success: " + result.AccessToken.UserId);
                }
            });
        }
        else
        {
            // 登錄
            var perms = new List<string>() { "public_profile", "email" };
            FB.LogInWithReadPermissions(perms, (result) =>
            {
                if (FB.IsLoggedIn)
                {
                    var aToken = AccessToken.CurrentAccessToken;
                    Debug.Log(aToken.UserId);
                    foreach (string perm in aToken.Permissions)
                    {
                        Debug.Log(perm);
                    }
                }
                else
                {
                    Debug.Log("User cancelled login");
                }
            });
        }
    }

    private void DoLogout()
    {
        FB.LogOut();
        if (!FB.IsLoggedIn)
        {
            Debug.Log("Logout Successfully");
        }
        else
        {
            Debug.Log("Logout Failed");
        }
    }

    private void DoPay()
    {
        FB.Canvas.Pay("diamond", callback: (result) =>
        {
            Debug.Log(result);
        });
    }

    public void DoShare()
    {
        FB.ShareLink(new Uri("https://developers.facebook.com/"),
            callback: (result) =>
            {
                if (result.Cancelled || !String.IsNullOrEmpty(result.Error))
                {
                    Debug.Log("ShareLink Error: " + result.Error);
                }
                else if (!String.IsNullOrEmpty(result.PostId))
                {
                    // Print post identifier of the shared content
                    Debug.Log(result.PostId);
                }
                else
                {
                    // Share succeeded without postID
                    Debug.Log("ShareLink success!");
                }
            });
    }
}

3、Editor環境下測驗

Editor環境下測驗,效果如下:
在這里插入圖片描述

4、發布成Android apk測驗

發布成Android apk測驗,在模擬器上的效果如下:
在這里插入圖片描述

十、結束語

完畢,
喜歡Unity的同學,不要忘記點擊關注,如果有什么Unity相關的技術難題,也歡迎留言或私信~

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/278889.html

標籤:其他

上一篇:Android記錄:運用系統相機拍照并獲取原圖+原圖壓縮+上傳資料

下一篇:vue axios 檔案流匯出功能 表格 zip 都可以

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more