实现 Facebook 集成

本指南讨论如何在 Corona 应用中实现常见的 Facebook 任务和流程。

注意

如果您只需要执行基本任务,例如发布 Facebook 用户的状态更新,则使用 Social Popup 插件 (Android) 或 Activity Popup 插件 (iOS) 是最简单的方法。但是,如果您需要执行更高级的任务或在应用中创建更完整的 Facebook 集成,请按照本指南中的说明进行操作。

包含插件

重要

要开始使用 Facebook 插件,您必须先在 Facebook 开发者平台注册 为 Facebook 开发者并配置您的应用。请参阅 Facebook 门户设置 指南以获取此过程的帮助 — 它需要一些**非常**精确的信息,并且务必仔细遵循每个步骤。

与所有 Corona 插件一样,您必须在 `build.settings` 的 `plugins` 表中包含 Facebook 插件。

settings = {

    plugins =
    {
        ["plugin.facebook.v4a"] =
        {
            publisherId = "com.coronalabs"
        },
    },
}

然后,您必须在需要访问其方法和属性的任何模块中 `require()` 该插件。

local facebook = require( "plugin.facebook.v4a" )

用户体验

Facebook 插件不同组件的用户体验取决于是否存在原生 Facebook 应用。在许多情况下,如果设备上存在原生 Facebook 应用,则诸如登录或显示 分享对话框 之类的操作可能会尝试将繁重的工作重定向到 Facebook 应用。在 Facebook SDK 的历史记录中,重定向到 Facebook 应用的情况发生了很大变化,因此您的应用应准备好暂停 Facebook 操作并在 Facebook 操作完成后恢复您的应用。

注意

在 Android 上,原生 Facebook 应用可以是标准的 Facebook 应用Facebook Lite 应用。每个原生应用都可能导致不同的用户体验。

登录注意事项

在使用 Facebook Graph API 之前,应用必须成功登录 Facebook。然后,它必须收集所需的验证信息和应用所需的特定权限。

  • 如果移动设备上安装了原生 Facebook 应用,您的应用将启动它并请求必要的权限。发生这种情况时,您的应用将暂时挂起并置于后台,而原生 Facebook 应用将运行。完成后(用户已授予权限或已取消),Facebook 应用将尝试恢复您的应用并将其置于前台,并附带有关您的权限请求的信息。

  • 如果移动设备**未**安装原生 Facebook 应用,它将使用 Facebook 的网站登录。这是通过 Web 视图完成的,因此您的应用实际上从未挂起到后台。一般来说,基于Web 的登录方法非常可靠,但您(开发者)无法控制应用的用户是否安装了原生 Facebook 应用。因此,您必须支持这两种方法。

  • Facebook 鼓励开发者将登录 Facebook 的时间延迟到必要时,并由用户选择。不建议在 `main.lua` 中自动登录用户。

注意
  • Facebook v4 插件使用 SFSafariViewController 在 iOS 9 及更高版本上登录。

  • 在低端 Android 设备上,Facebook 应用在用于登录时更有可能无法恢复您的应用。这可能是由于 Android 操作系统因内存不足而终止您的应用造成的。

iOS 要求

如果您的应用适用于 iOS,则必须在 `build.settings` 文件中包含特定方面,以确保原生 Facebook 应用正常运行。有关详细信息,请参阅 插件文档

注意

如果您想发布多个使用相同 Facebook 应用 ID 的 iOS 应用,例如同一应用的试用版和完整版,可以通过 `build.settings` 的`iphone` → `plist`表中的 `FacebookUrlSchemeSuffix` 键以及下面提到的其他次要编辑来完成。有关更多信息,请参阅 Facebook 的 iOS SDK 常见问题解答

settings = {

    iphone =
    {
        plist =
        {
            FacebookUrlSchemeSuffix = "suffix",
            ["URL types"] =
            {
                item =
                {
                    ["URL Schemes"] = { ["Item 0"] = "fbXXXXXXXXXXsuffix" },  -- Replace XXXXXXXXXX with your Facebook App ID
                },
            },

            MinimumOSVersion = "8.0",
            UIApplicationExitsOnSuspend = false,
            FacebookAppID = "XXXXXXXXXX",  -- Replace XXXXXXXXXX with your Facebook App ID
            CFBundleURLTypes =
            {
                { CFBundleURLSchemes = { "fbXXXXXXXXXXsuffix", } }  -- Replace XXXXXXXXXX with your Facebook App ID
            },
        }
    }
}

Android 要求

在 Android 上,Facebook 使用您的应用**包名称**,例如 `com.yoursite.yourapp`。为确保原生 Facebook 应用正常运行,您必须向 Facebook 门户提供两条重要信息 — 其中包括 `com.ansca.corona.CoronaActivity` 的**类名**和从您构建应用所用的密钥库中收集的**密钥哈希**。这些内容在 Facebook 门户设置 指南中进行了讨论。

此外,Facebook v4 插件需要了解您唯一的 Facebook 应用 ID (`facebookAppId`)

settings =
{
    android =
    {
        facebookAppId = "XXXXXXXXXX",  -- Replace XXXXXXXXXX with your Facebook App ID
    },
}

初始化

当您第一次 require 插件时,Facebook 插件开始初始化。根据网络条件,这可能需要几秒钟。在您的 `main.lua` 文件中,您可以创建一个侦听器函数,以便在初始化完成后通知您,并在 facebook.init() 中引用该函数。

local function facebookListener( event )

    if ( "fbinit" == event.name ) then

        print( "Facebook initialized" )

        -- Initialization complete; call "facebook.publishInstall()"
        facebook.publishInstall()

    elseif ( "fbconnect" == event.name ) then

        if ( "session" == event.type ) then
            -- Handle login event and try to share the link again if needed
        elseif ( "dialog" == event.type ) then
            -- Handle dialog event
        end
    end
end

-- Set the "fbinit" listener to be triggered when initialization is complete
facebook.init( facebookListener )
注意

此侦听器函数可以与您将用于 Facebook 请求、对话框和登录的函数相同,但如果您希望对这些方面使用不同的函数,只需在 facebook.login() 中指定该函数引用即可。

登录/注销

登录 Facebook 是通过 facebook.login() 完成的。如果您尚未通过 facebook.init()facebook.setFBConnectListener() 设置 侦听器 函数,则可以通过将侦听器引用作为第一个参数传递给 facebook.login() 来设置它。

其次,通过 facebook.login(),您可以请求一系列 权限。 readonly 和**publishable** 权限都可以指定,但有一些需要注意的事项,这些事项在 facebook.login() 文档中进行了概述。只读和可发布

将这两个方面放在一起,登录调用可能如下所示

facebook.login( facebookListener, { "email", "user_birthday" } )

将用户注销更容易。要断开应用与 Facebook 服务的连接,只需调用 facebook.logout()。但是请注意,这**不会**将设备的用户完全退出 Facebook — 如果用户通过原生 Facebook 应用或设备的浏览器登录 Facebook,他们将通过这些方式保持登录状态。

facebook.logout()

Facebook 监听器

所有 Facebook 请求都将调用您传递给 facebook.init()facebook.login() 或通过 facebook.setFBConnectListener() 设置的侦听器函数。例如

local function facebookListener( event )

    if ( "fbinit" == event.name ) then

        print( "Facebook initialized" )

    elseif ( "fbconnect" == event.name ) then

        -- Event type of "session" covers various login/logout events
        if ( "session" == event.type ) then
            -- Handle login event and try to share the link again if needed

        -- Event.type of "request" handles calls to various Graph API functionalities
        elseif ( "request" == event.type ) then
            if not event.isError then
                -- Process response data here
            end

        -- Event.type of "dialog" indicates standard popup boxes that can be displayed
        elseif ( "dialog" == event.type ) then
            -- Handle dialog event
        end
    end
end

发起请求

要发出不同的 Graph API 请求,请使用 facebook.request() 调用。默认情况下,此调用向 Facebook 发出HTTP GET请求。如果您希望使用其他方法,请将第二个参数 (`httpMethod`) 设置为 facebook.request() 文档中概述的值。

facebook.request( path [, httpMethod] [, params] )

唯一需要的参数是 `path`,它基于 Facebook Graph API 路径。这通常是您要访问的 REST 对象。例如,以下命令将从用户的帐户 Feed 中检索最新的帖子。

facebook.request( "me/feed" )

某些 Graph API 调用还需要将参数传递给 facebook.request()。这是通过可选的 `params` 表完成的,例如

facebook.request( "me/feed", "POST", { message="Hello Facebook" } )

要将照片上传到您的 Facebook 相册,可以根据 此处 找到的标准 Graph API 参数填写 `params` 表。

local attachment = {
    caption = "Corona icon file",
    url = "https://solar2d.cn/wordpress/wp-content/uploads/2020/04/Solar2D-App-Icon-RGB-512.png",
}
facebook.request( "me/photos", "POST", attachment )

facebook.request() 调用完成后,您的 Facebook 侦听器函数将被调用,`event.type` 为 `"request"`。Facebook 通常将您的数据作为 `event.response` 返回,这是一个JSON 编码的数据表。要将其转换为 Lua 表,请调用 json.decode(),记住首先要 `require()` JSON 库。

要详细了解 Facebook 提供的请求、参数和数据,请参阅 Facebook Graph API 文档。

使用对话框

Facebook 要求某些任务通过他们控制的对话框完成。要使用对话框,请调用 facebook.showDialog() 函数。

facebook.showDialog( action, params )

对于此调用,`action` 参数指定对话框类型。

facebook.showDialog( "link",
{
    name = "Implementing Facebook with Corona",
    link = "https://docs.solar2d.cn/guide/social/usingFacebook/index.html"
})
facebook.showDialog( "requests",
{
    message = "You should download this game!",
    filter = "APP_NON_USERS"
})

观察 `params` 参数是如何传递给 Facebook API 调用的键/值对表。您传递的键对应于对话框可用的特定选项。有关详细信息,请参阅 facebook.showDialog() 文档。

已发布安装

虽然**已发布安装**不是 Graph API 的一部分,但它是应用参与 Facebook 移动广告活动的一种方式,可以向 Facebook 报告应用已安装。此过程很简单,无需回调信息,也无需调用 facebook.login() — 只需调用 facebook.publishInstall() 即可。

facebook.publishInstall()