我对我已实现的应用程序有一个奇怪的行为,并在访问时捕获用户的信息。 如果从Facebook URL外部访问该应用程序,则会正确弹出JavaScript权限对话框。 但是当我将此应用程序作为选项卡应用程序插入到Facebook页面时,权限请求对话框不再弹出。此外,我还在FB.getLoginStatus()实现中检测用户在Facebook中的当前登录状态,如果用户未登录则使用JavaScript警报弹出窗口。当从“外部”调用应用程序时警报被触发。当应用程序在Facebook页面选项卡上时,它不会。 这是正确的行为吗?如果是这样,我如何在Facebook选项卡应用程序中启用权限请求。我正在使用JS和PHP Facebook SDK。
编辑1(跟随CBroe评论): 我在应用程序的content.php标记中使用以下调用(在页面加载时执行):
<!-- Facebook JS SDK initialization -->
<div id="fb-root"></div>
<script>initFacebookJSSDK();</script>
<!-- End of Facebook JS initialization -->
<script>checkAccessPermission();</script>
<?php include_once 'sites/www.mysite.com/custom_code/custom_index.php';?> // I'm doing
custom code under Drupal
JavaScript函数在custom.js文件中实现,如下所示:
function initFacebookJSSDK() {
window.fbAsyncInit = function() {
FB.init({
appId : 'xxxxxxxxxxxxxxxxxx', // Application's ID
channelUrl : 'www.appsite.com/channel.html', // Channel File
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true, // parse XFBML
oauth : true // enable OAuth
});
.........
});
.........
}
function getPerms() {
FB.login(function(response) {
if (!response.authResponse) {
//user refused to grant permissions, redirect to the 'index' page
window.location = "/index";
}
}, {scope:"email"}); // I request the permission to get the email address
}
function checkAccessPermission() {
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
//user has granted permissions to the application
var uid = response.authResponse.userID; // not used
var accessToken = response.authResponse.accessToken; // not used
}
else if (response.status === 'not_authorized')
// user is logged into Facebook but didn't grand permissions to the app
getPerms();
else {
//user has not granted permissions, redirect to the 'index' page
alert('Please connect with your Facebook account');
window.location = "/index";
}
});
}
PHP脚本 - 文件'custom_index.php'包含以下代码段:
$config = array();
$config["appId"] = FB_APP_ID;
$config["secret"] = FB_SECRET_ID;
$config["cookie"] = true;
$facebook = new Facebook($config);
// get user UID
$fb_user_id = $facebook->getUser();
// user's first visit, force the permission request window
if ($fb_user_id == 0) {
$location = $facebook->getLoginUrl(array('scope' => 'email'));
..........
}
// user already gave permission, get the profile and process
if ($fb_user_id != 0) {
$access_token = $facebook->getAccessToken();
$user_profile = $facebook->api('/me', array('access_token'=>$access_token));
..........
}
同样,当用户访问Facebook外部的网站时它非常有效,但是当它作为Facebook标签应用程序(Facebook内部框架)运行时,权限请求弹出窗口不会显示。要注意的是,关于我以前的帖子,现在是JavaScript语句:
alert('Please connect with your Facebook account');
在这两种情况下都会执行,包括当应用程序作为Facebook内的选项卡应用程序运行时(我只需要清除浏览器的缓存)。
答案 0 :(得分:1)
这是解决方案。 上面的所有代码都是正确的并保持不变。 我刚刚在链接上添加了一个jQuery函数,它提取了'content.php'页面,如下所示(类'.open-content-page'位于'content.php'的父页面上):
$(document).ready(function () {
$(".open-content-page").click(function() {
checkAccessPermission();
});
});
})(jQuery);
答案 1 :(得分:0)
你在没有任何用户交互的情况下调用你的JS函数 - 你确定它不仅仅是你的浏览器的弹出窗口阻止程序阻止对话框出现吗? (也许它区分了从“简单”页面调用的弹出窗口与嵌入在其他域中的iframe中的页面的弹出窗口。)
由于您不能依赖于您的网站的用户他们的弹出窗口阻止程序设置非常宽松,因此通常最好在用户交互上调用facebook对话框,例如:当用户点击链接/按钮时。调用用户交互的弹出窗口比想要自己打开的弹出窗口更不容易被阻止。