Я наконец-то выбрал решение, подобное тому, которое предоставил Саша,
однако с некоторыми небольшими изменениями, так как я устанавливаю куки явно в PHP:
// 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>';
Для этого нужно проверить, доступен ли файл cookie, когда браузер работает в режиме сафари.
На следующем шаге мы находимся в домене приложения, а именно в URI, указанном выше как URL_WHERE_APP_IS_LOCATED.
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), я снова вызываю действие входа в систему, где авторизация FB выполняется в другой раз, и на этот раз это происходит успешно из-за существующего печенье.
После авторизации приложения у меня больше не было проблем с использованием приложения с Safari (5.1.6)
Надеюсь, что это может кому-нибудь помочь.