零. facebook sdk 快速开发官网网址
一. facebook sdk的使用场景
- 针对国外市场的产品,为了迎合用户的使用习惯,在用户注册和登录时一般会提供facebook(现在叫meta),或者谷歌账号登录.
- 同时如果自己产品在facebook上有官方账号,也可以通过sdk将app或者网站的用户引导向facebook关注官方账号.
- 如果产品有社交需求,可以通过sdk让用户将对应的链接,文字以及图片分享到facebook,进行引流. tips: 当然还有其他的使用场景,但是由于我只遇到这些场景,所以只针对这些场景进行描述.以下是官方的使用场景描述:
- Enables you to use the Like Button and other Social Plugins on your site.
- Enables you to use Facebook Login to lower the barrier for people to sign up on your site.
- Makes it easy to call into Facebook's Graph API.
- Launch Dialogs that let people perform various actions like sharing stories.
- Facilitates communication when you're building a game or an app tab on Facebook.
支持的浏览器:
JavaScript 版 Facebook SDK 支持以下热门浏览器的两个最新版本:Chrome、Firefox、Safari(包括 iOS)和 Internet Explorer(仅支持 11 版本)。
二. 引入facebook sdk
官网给的例子很简单:
<script>
window.fbAsyncInit = function() {
FB.init({
appId : 'your-app-id',
autoLogAppEvents : true,
xfbml : true, // 设置为true就会自动解析页面DOM,并且初始化社交插件
version : 'v12.0'
});
};
</script>
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script>
将这些代码复制到你的项目里,一般来说是放在index.html中.
如果是使用框架搭建的项目,下文中会给予相应的建议.
对应的app id请到facebook后台页面进行设置.
三. 使用facebook checkbox
官网网址:
首先,让我们来看一下facebook checbox的样式
功能方面:
这个checkbox在用户点击后,会让用户登录facebook,然后我们可以通过Facebook推送相应的信息给这个用户,比如节日优惠或者其他人性化推送.
使用方面:
找到你需要加载facebook插件的地方新建一个标签, 比如说是div. 然后你需要给这个div加上一个类, fb-messenger-checkbox, 这样sdk会自动找到这个标签进行渲染(FB.init时,xfbml要设置为true).
...
<div class="fb-messenger-checkbox"></div>
...
在创建完目标标签后, 我们还需要在标签中添加sdk中需要用到的参数,如果有一个参数设置的不对,checkbox也是不会显示的,而且对应的网址域名也要在facebook后台中配置成白名单
<div class="fb-messenger-checkbox"
origin=<PAGE_DOMAIN> // 网址域名
page_id=<PAGE_ID>
messenger_app_id=<APP_ID>
user_ref="<UNIQUE_REF_PARAM>" // 参数值必须是唯一的,可以用其他参数拼上时间戳实现
allow_login="<true>"
size="<small | medium | large | standard | xlarge>" // 样式
skin="<light|dark>" // 主题
center_align="<true|false>"> // 是否居中
</div>
这些参数都配置正确后刷新页面就能看到checkbox插件已经在页面上显示了.
四. 在vue或者react中使用facebook checbox插件
由于框架下dom的渲染是需要时间的,如果在dom渲染完成前加载facebook插件会导致找不到对应的目标标签,不显示我们需要的插件.
所以我们需要将加载facebook sdk事件封装成一个全局事件,在对应页面加载完毕后调用
window.addFaceBookJs = function() {
window.FB = null;
window.fbAsyncInit.hasRun = false;
var head = document.getElementsByTagName('head')[0]
if(document.getElementById('facebook-jssdk')){
head.removeChild(document.getElementById('facebook-jssdk'))
}
var script = document.createElement('script')
script.type = 'text/javascript'
script.defer = true
script.async = true
script.id = 'facebook-jssdk'
script.src = 'https://connect.facebook.net/en_US/sdk.js'
head.appendChild(script)
}
然后在对应页面的生命钩子函数中调用这个全局事件
// vue
mounted(){
if(window.addFaceBookJs){
window.addFaceBookJs()
}
},
// react
componentDidMount(){
if(window.addFaceBookJs){
window.addFaceBookJs()
}
}
五. checbox 插件的生命周期
如果需要在checkbox插件加载中或者加载完成后触发相应的事件,可以修改window.fbAsyncInit代码如下
window.fbAsyncInit = function () {
FB.init({
appId: facebook_appId,
autoLogAppEvents: true,
xfbml: true,
version: 'v6.0'
});
FB.Event.subscribe('messenger_checkbox', function (e) {
if (e.event == 'rendered') {
console.log('Plugin was rendered')
} else if (e.event == 'checkbox') {
var checkboxState = e.state
console.log('Checkbox state: ' + checkboxState)
} else if (e.event == 'not_you') {
console.log('User clicked 'not you'')
} else if (e.event == 'hidden') {
console.log('Plugin was hidden')
}
})
};
六. 使用注意事项
- window.fbAsyncInit事件只在引入的sdk加载完成后触发一次,如果要多次触发则需要删除对应的sdk script标签,然后重新添加这个标签,这样才能重新触发window.fbAsyncInit事件
var head = document.getElementsByTagName('head')[0];
if(document.getElementById('facebook-jssdk')){
head.removeChild(document.getElementById('facebook-jssdk'));
}
var script = document.createElement('script');
script.type = 'text/javascript';
script.defer = true;
script.async = true;
script.id = 'facebook-jssdk';
script.src = 'https://connect.facebook.net/en_US/sdk.js';
head.appendChild(script);
- 重新触发window.fbAsyncInit事件也不会跟第一次触发一样,重新创建新的插件,需要修改两个参数才能跟第一次一样, 如果需要在一个项目中触发多个插件,那么在新插件初始化之前都需要添加下面的代码进行还原.
window.FB = null;
window.fbAsyncInit.hasRun = false;
七. 使用完整代码
// index.html
<script>
window.addFaceBookJs = function() {
window.FB = null;
window.fbAsyncInit.hasRun = false;
var head = document.getElementsByTagName('head')[0]
if(document.getElementById('facebook-jssdk')){
head.removeChild(document.getElementById('facebook-jssdk'))
}
var script = document.createElement('script')
script.type = 'text/javascript'
script.defer = true
script.async = true
script.id = 'facebook-jssdk'
script.src = 'https://connect.facebook.net/en_US/sdk.js'
head.appendChild(script)
}
window.fbAsyncInit = function () {
FB.init({
appId: facebook_appId,
autoLogAppEvents: true,
xfbml: true,
version: 'v6.0'
});
FB.Event.subscribe('messenger_checkbox', function (e) {
if (e.event == 'rendered') {
console.log('Plugin was rendered')
} else if (e.event == 'checkbox') {
var checkboxState = e.state
console.log('Checkbox state: ' + checkboxState)
} else if (e.event == 'not_you') {
console.log('User clicked 'not you'')
} else if (e.event == 'hidden') {
console.log('Plugin was hidden')
}
})
};
</script>
// 代码文件中
...
<div class="fb-messenger-checkbox"
origin=<PAGE_DOMAIN> // 网址域名
page_id=<PAGE_ID>
messenger_app_id=<APP_ID>
user_ref="<UNIQUE_REF_PARAM>" // 参数值必须是唯一的,可以用其他参数拼上时间戳实现
allow_login="<true>"
size="<small | medium | large | standard | xlarge>" // 样式
skin="<light|dark>" // 主题
center_align="<true|false>"> // 是否居中
</div>
...
// vue
mounted(){
if(window.addFaceBookJs){
window.addFaceBookJs()
}
},
// react
componentDidMount(){
if(window.addFaceBookJs){
window.addFaceBookJs()
}
}