我在这个网站上搜索过这个问题,但并没有真正指出我正确的方向,我希望我应该解决这个问题,因为我似乎更具体一点。
我的FB JS对话框被浏览器中的弹出窗口阻止程序阻止,我知道为什么因为我没有直接调用FB.Login()函数。相反,在我请求许可之前,我正在进行一系列检查,因此它最大限度地减少了推送到服务器的呼叫量,并且不会使用户烦恼。
如果满足某些条件,我只想要求此publish_actions权限,即 1.他们已登录 以前没有问过 3. cookie已经过了日期再次询问
但似乎这是不可能的。
发表评论按钮:
<input class="interaction-button-post" onclick="post_comment(4297,"OOS-4297");return false;" type="submit" value="Post">
使用facebook登录检查向服务器端发表评论的功能:
function post_comment(card_cache_id,offset)
{
// get content
if(jQuery("#comment-form-"+offset).closest(".wall-card").hasClass("facebook"))
{
FB.getLoginStatus(function(response) {
if (response.status === 'connected')
{
check_permissions();
}
});
}
//posts the comment to the database using ajax
}
//ask permission and if granted, make post to update DB
function get_perms() {
FB.login(function(response) {
console.log(response);
if (response.authResponse && response.authResponse.grantedScopes.toLowerCase().indexOf("publish_actions") >= 0) {
set_permission();
}
else {
date = new Date();
date.setDate(date.getDate() + 1);
createCookie('fb-publish-actions', date + ',2', 365);
}
}, {scope:"publish_actions",
auth_type: 'rerequest',
return_scopes: true});
}
function set_permission(){
jQuery.ajax({
url : "/social_networking/SetFbPermission",
type : 'POST',
error : function (xhr, ajaxOptions, thrownError){
console.log(xhr.status);
console.log(thrownError);}
});
}
以下功能基本上读取了一组条件。如果cookie不存在,它将要求获得FB许可,cookie中的日期超过当前日期,它将要求获得FB许可,前提是它已被拒绝。如果已经授予许可,那么只需正常进行。
function check_permissions() {
var currentDate = new Date();
if(readCookie('fb-publish-actions') != null)
{
thiscookie=readCookie('fb-publish-actions','0');
aftersplit = thiscookie.split(",");
fbJsonString = {};
for (var i = 0; i < aftersplit.length; i++){
fbJsonString = {
"date" : aftersplit[0],
"count": aftersplit[1]
};
}
date = fbJsonString["date"];
}
else{
date = currentDate.setDate(currentDate.getDate());
}
date = new Date(date);
currentDate.setDate(currentDate.getDate());
if(currentDate > date || readCookie('fb-publish-actions') == null)
{
FB.api('/me/permissions', function (response) {
var perms = response.data;
var exists = false;
for(var i=0;i<perms.length;i++)
{
if(perms[i].permission =='publish_actions')
{
if(perms[i].status == 'declined')
{
if(readCookie('fb-publish-actions') == null)
{
date = new Date();
date.setDate(date.getDate() + 1);
createCookie('fb-publish-actions', date + ',2', 365);
}
else {
count = fbJsonString["count"];
console.log("something exists");
date = new Date();
date.setDate(date.getDate() + +count);
if(count < 14)
{
createCookie('fb-publish-actions', date + ','+ (+count + +1), 365);
}
else {
createCookie('fb-publish-actions', date + ','+ count, 365);
}
}
}
else if(perms[i].status == 'granted')
{
console.log("its granted");
exists=true;
}
break;
}
}
if(!exists)
{
get_perms();
}
});
}
}
我们有一个评论系统,因此用户可以发布关于链接到Facebook的帖子的评论,我们只想在FB链接的帖子上请求publish_actions权限。
这看起来有可能吗?
答案 0 :(得分:1)
我设法让这个工作。
因此,根据CBroe的说法,这是有道理的。我想我必须只在标签的onClick部分显示Login(),如果设置了一组条件,则但仅。
基本上,我在页面加载上做了大部分上述操作并设置了两个全局标志。然后当生成输入按钮时,它将查看两个标志以查看它们是否为真,然后它将把Login()放入onClick
这是我所做的代码:
在会话开始时设置两个全局标记ask
以确定是否要求权限,loggedIn
检查它们是否已登录到我们的FB应用程序
var ask;
var loggedIn;
在页面加载时运行这些,在回调后运行checkLoginStatus,check_permissions()
jQuery(window).load(function(){
checkLoginStatus(function() {
if(loggedIn)
{
check_permissions();
}
});
checkLoginStatus()
:
function checkLoginStatus(callback){
FB.getLoginStatus(function(response) {
(response.status === 'connected')? loggedIn=true : loggedIn=false;
callback();
});
}
check_permissions()
仅在登录FB时运行,防止JS中的某些读取错误。在此函数中,如果满足条件,则多个ask = false或true setter:
function check_permissions() {
if(currentDate > date || readCookie('fb-publish-actions') == null)
{
FB.api('/me/permissions', function (response) {
var perms = response.data;
ask=true;
for(var i=0;i<perms.length;i++)
{
if(perms[i].permission =='publish_actions')
{
if(perms[i].status == 'declined')
{
//ask is still true
}
else if(perms[i].status == 'granted')
{
//ask is now false
ask=false;
}
break;
}
}
});
}
else {
//if date is still greater than current date, dont ask
ask=false;
}
}
}
最后,代码确定是否添加登录功能:
if(ask && loggedIn)
{
html+=" <input class='interaction-button-post' onclick='add_comment();get_perms();return false;' type='submit' value='Post'/>";
}
else {
html+=" <input class='interaction-button-post' onclick='add_comment();return false;' type='submit' value='Post'/>";
}
}