我终于找到了与Sascha提供的解决方案类似的解决方案,但是做了一些调整,因为我在PHP中明确设置了cookie:
// excecute this code if user has not authorized the application yet
// $facebook object must have been created before
$accessToken = $_COOKIE['access_token']
if ( empty($accessToken) && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {
$accessToken = $facebook->getAccessToken();
$redirectUri = 'https://URL_WHERE_APP_IS_LOCATED?access_token=' . $accessToken;
} else {
$redirectUri = 'https://apps.facebook.com/APP_NAMESPACE/';
}
// generate link to auth dialog
$linkToOauthDialog = $facebook->getLoginUrl(
array(
'scope' => SCOPE_PARAMS,
'redirect_uri' => $redirectUri
)
);
echo '<script>window.top.location.href="' . $linkToOauthDialog . '";</script>';
这是在浏览器为Safari浏览器时检查cookie是否可用。下一步,我们在应用程序域上,即上面提供为URL_WHERE_APP_IS_LOCATED的URI。
if (isset($_GET['accessToken'])) {
// cookie has a lifetime of only 10 seconds, so that after
// authorization it will disappear
setcookie("access_token", $_GET['accessToken'], 10);
} else {
// depending on your application specific requirements
// redirect, call or execute authorization code again
// with the cookie now set, this should return FB Graph results
}
因此,在重定向到应用程序域后,将显式设置cookie,然后将用户重定向到授权过程。
就我而言(因为我使用的是CakePHP,但它应该可以与任何其他MVC框架配合使用),我再次调用login操作,在该操作中再次执行FB授权,由于现有的cookie,这次成功。
一次性授权应用程序后,将应用程序与Safari(5.1.6)一起使用时,我再也没有任何问题
希望对任何人都有帮助。