当前位置:主页 > 查看内容

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

发布时间:2021-09-09 00:00| 位朋友查看

简介:文章目录 一、前言 二、下载Facebook SDK 三、导入SDK 四、切换到Android平台 五、Dependencies.xml 六、执行Play Services Resolver 七、Edit Settings 八、接口说明 1、初始化 2、登录 3、快速登录 4、登出 5、分享 6、支付 九、测试 1、制作测试界面 2、……

一、前言

点关注不迷路,持续输出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://blog.csdn.net/linxinfa/article/details/115896617
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:vue axios 文件流导出功能 表格 zip 都可以 下一篇:没有了

推荐图文


随机推荐