--- title: Defold Facebook 扩展 brief: 本手册介绍了如何在 Defold 游戏中设置和整合 Facebook 功能. --- API 文档位于 [这里](https://defold.github.io/extension-facebook/). # Facebook Facebook API 作为 [原生扩展](/manuals/extensions/) 提供. 此扩展使得 iOS、Android 和 HTML5 游戏可以使用 Facebook 的在线交互功能. Defold Facebook 扩展对于 iOS、Android 和 HTML5(基于 Facebook Canvas)不同平台封装了统一的 Facebook API 函数库. 要在游戏中使用 Facebook 在线交互功能,首先需要有一个 Facebook 账户. ## 安装扩展 要使用 Facebook 扩展,需要在 *game.project* 文件中设置依赖. 最新稳定版的 URL 是: ``` https://github.com/defold/extension-facebook/archive/master.zip ``` 推荐使用 [指定版本](https://github.com/defold/extension-facebook/releases) 的 zip 包链接作为依赖。 Facebook API 文档位于 [fb 扩展主页](https://defold.github.io/extension-facebook/)。 ## 注册成为 Facebook 开发者 开发 Facebook 应用首先要注册成为 Facebook 开发者。这样你的 Defold 游戏就能与 Facebook 应用交互了。 * 访问 [Facebook 开发者网站](https://developers.facebook.com) 进行注册 * 登入你的 Facebook 账户。 * 注册激活你的开发者身份。 ![注册成为开发者](images/facebook/register_dev.png) ![验证开发者身份](images/facebook/register_verify.png) ## 创建 Facebook 应用 下一步要创建一个 Facebook 应用。右上角 My Apps 菜单列出了你的应用,以及 Add a New App 按钮。 ![添加新应用](images/facebook/add_new_app_menu.png) 然后是选择目标平台界面。点击 *basic setup* 可以略过引导界面。 ::: sidenote 引导界面里绝大多数内容与开发 Defold 游戏无关。而且,一般不需要自己修改 *Info.plist* 或者 *AndroidManifest.xml* 文件。Defold 会自动完成。 ::: ![添加新应用平台](images/facebook/add_new_app_platform.png) 在 dashboard 里可以随意添加、删除应用或者更改平台设置。接下来需要设置 *Display Name*、*Namespace* 和 *Category*。这些也都可以在 dashboard 里设置。设置完后,Facebook 会给你的应用创建唯一 ID。*App ID* 是不可修改的。 ![新应用 ID](images/facebook/new_app_id.png) ![应用仪表板设置](images/facebook/add_platform.png) 点击 *Settings* 面板。这里显示了 *App ID*。你要在 Defold 游戏的 [项目设置](/manuals/project-settings) 里输入这个 ID。从 *资源面板* 里打开 *game.project* 文件,滚动到 *Facebook* 部分,在 `Appid` 这里填入 *App ID*。 现在回到 Facebook 网站的 *Settings* 页面,点击 *+ Add Platform* 来为应用设置目标平台。针对每个平台都有不同的设置。 ![选择平台](images/facebook/select_platform.png) ## iOS iOS 平台需要填写和 *game.project* 里一样的 `bundle_identifier`。 ![iOS 设置](images/facebook/settings_ios.png) ## Android Android 平台需要填写 *Google Play Package Name*,也就是 *game.project* 里的 *package* ID。还要在 *Key Hashes* 里填入证书的 Hashes。可以使用 openssl 从 *certificate.pem* 文件生成 Hashes: ```sh $ cat certificate.pem | openssl x509 -outform der | openssl sha1 -binary | openssl base64 ``` (关于签名文件详细信息参见 [制作 keystore](/manuals/android/#制作 keystore)。) ![Android 设置](images/facebook/settings_android.png) ## Facebook Canvas 对于 HTML5 游戏,过程略有不同。Facebook 需要直接在线访问你的游戏内容。两个办法: ![Facebook Canvas 设置](images/facebook/settings_canvas.png) 1. 使用 Facebook 的 *Simple Application Hosting*。点击 *Yes* 使用在线托管。选择 *uploaded assets* 打开托管资源管理器。 ![简单托管](images/facebook/simple_hosting.png) 托管类型选择 "HTML5 Bundle": ![HTML5 包](images/facebook/html5_bundle.png) 把你的 HTML5 游戏包压缩为一个 .7z 或者 .zip 包上传至 Facebook。点击 *Push to production* 即可在线发布。 2. 另一个办法就是把你的 HTML5 游戏包托管到你自己选择的服务器上通过 HTTPS 访问。*Secure Canvas URL* 这里填写你的游戏地址。 至此 Facebook 就能通过 *Canvas Page* 发布你的游戏了。 ## 小测试 可以通过创建一个小测试来看看扩展工作是否顺利。 1. 新建游戏对象然后在上面添加一个脚本。 2. 脚本里加入如下代码(需要 Facebook 扩展 v.2 版及以上): ```lua local function get_me_callback(self, id, response) -- 响应表包含所有响应数据 pprint(response) end local function fb_login(self, data) if data.status == facebook.STATE_OPEN then -- 登录成功。让我们尝试通过 HTTP graph API 读取一些 "me" 数据。 local token = facebook.access_token() local url = "https://graph.facebook.com/me/?access_token=" .. token http.request(url, "GET", get_me_callback) elseif data.status == facebook.STATE_CLOSED_LOGIN_FAILED then -- 执行一些操作以指示登录失败 end if data.error then -- 发生错误 else -- 没有错误 end end function init(self) -- 使用读取权限登录。 local permissions = { "public_profile", "email" } facebook.login_with_permissions(permissions, facebook.AUDIENCE_EVERYONE, fb_login) end ``` 直接运行,控制台输出大概这样: ```txt DEBUG:SCRIPT: { status = 200, headers = { connection = keep-alive, date = Fri, 04 Nov 2016 13:54:33 GMT, etag = "0725a4f703fe6af27da183cfec0bb22637e331e0", access-control-allow-origin = *, content-length = 53, expires = Sat, 01 Jan 2000 00:00:00 GMT, content-type = text/javascript; charset=UTF-8, x-fb-debug = Pr1qUssb8Xa3x3r1t913hHMdefh69DSYYV5vcxeOB7O33mcfShIw+r7BoLpn147I2wzLF2CZRTpnR3/VYOtFpA==, facebook-api-version = v2.5, cache-control = private, no-cache, no-store, must-revalidate, pragma = no-cache, x-fb-trace-id = F03S5dtsdaS, x-fb-rev = 2664414, } response = {"name":"Max de Fold ","id":"14159265358979323"}, } ``` * 完整的 Defold Facebook API 文档在 [这里](https://defold.github.io/extension-facebook/)。 * Facebook Graph API 在这里:https://developers.facebook.com/docs/graph-api ## Facebook Analytics Facebook Analytics 可以对游戏相关信息汇总统计并提供适当建议,比如开启游戏人数、付款频率和其他各种信息。 ### 配置 使用 Facebook Analytics 之前你得创建好 Facebook 应用。然后就是把分析功能整合进去: ![添加 Facebook Analytics](images/facebook/add_facebook_analytics.png) 分析功能也有很多配置选项。详情请见: ![Facebook Analytics 设置](images/facebook/facebook_analytics_settings.png) ### 使用 分析功能配置好之后就可以通过发布分析事件来进行信息统计了: ```lua function init(self) -- 发布消费积分事件 local params = { [facebook.PARAM_LEVEL] = 30, [facebook.PARAM_NUM_ITEMS] = 2 } facebook.post_event(facebook.EVENT_SPENT_CREDITS, 25, params) -- 发布自定义事件 local level = 19 local params = { kills = 23, gold = 4, xp = 890 } facebook.post_event("level_completed", level, params) end ``` 各种事件和参数详情请见 [Facebook 扩展 API 文档](https://defold.github.io/extension-facebook/)。这些应该与 Facebook 的 [标准事件](https://developers.facebook.com/docs/analytics/send_data/events#standard) 和 [参数](https://developers.facebook.com/docs/analytics/send_data/events#parameter) 文档相一致。 除了分析统计事件,Defold 使用 Facebook SDK 时也会自动产生一些事件,比如装机次数、启动次数之类的。详情请见 Facebook 的 [自动日志事件](https://developers.facebook.com/docs/analytics/send_data/events#autologged) 文档。 事件汇总后会在 Facebook Analytics dashboard 中显示出来,点击 *View Analytics* 按钮查看分析信息: ![打开 Facebook Analytics](images/facebook/facebook_analytics_open_dashboard.png) 通过页面里 *Events* 选项可以看到各种事件: ![显示事件](images/facebook/facebook_analytics_show_events.png) ### Facebook 的事件分享 你可以选择是否向 Facebook 分享你的事件数据。通过 [`enable_event_usage()`](https://defold.github.io/extension-facebook/#enable_event_usage) 和 [`disable_event_usage()`](https://defold.github.io/extension-facebook/#disable_event_usage) 函数控制。默认不分享。