如何避免在iOS上使用FB.ui时出现“不支持的浏览器…”的问题?有什么解决方法吗?

10
当我在iPhone上使用FB.ui API尝试打开共享对话框时,出现“不支持的浏览器:chrome for ios doesn't support this feature. Please use safari and try again”的错误提示信息。
我猜这个问题和Facebook OAuth "Unsupported" in Chrome on iOS有关,但我只是想分享而不是仅仅进行身份验证(即使用户登录了也不影响我的操作)。

看看这里我是如何解决这个问题的! - Abhishek
1个回答

3
我知道这是一个老问题,但如果有人遇到类似的问题(我的意思是某些搜索带我来到这里),Facebook分享对话框不需要登录即可分享。通常情况下,您会使用js sdk,如下所示:https://developers.facebook.com/docs/sharing/reference/share-dialog
FB.ui({
  method: 'share',
  href: 'https://developers.facebook.com/docs/',
}, function(response){});

不幸的是,在iOS上,这种方法在Chrome浏览器中无法正常工作,但幸运的是,有一个解决办法(如果您正在使用php);

$isIosChrome = (strpos($_SERVER['HTTP_USER_AGENT'], 'CriOS') !== false) ? true : false;
if ($isIosChrome == true) {
    $iosChromeShareLink = 'https://www.facebook.com/dialog/share
        ?app_id='.$settings['facebook']['appId'].'
        &display=popup
        &href='.urlencode($THE_SITE_U_WANT_TO_SHARE).'
        &redirect_uri='.urlencode($settings['facebook']['redirectUrl']);
}

基本上,您需要检测用户是否在iOs上使用Chrome,然后将触发FB.ui函数的元素替换为“FB sharer”链接。因为您不想始终使用sharer,只有在js sdk无法工作时才使用。
由于Facebook将互联网上的每个站点都视为OG对象,因此您只需确保您的站点包含正确的OG标签即可。
但是,如果您的Facebook应用程序(或站点)需要登录以进行其他目的,并且您面对Chrome的“不受支持的浏览器”消息,则可以通过php重定向登录登录您的用户(这要求您使用php sdk)。
use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;

/**
*FIXES CHROME ON IOS BUG
*
*
*/
$isIosChrome = (strpos($_SERVER['HTTP_USER_AGENT'], 'CriOS') !== false) ? true : false;
if ($isIosChrome == true) {

    FacebookSession::setDefaultApplication(
        $settings['facebook']['appId'],
        $settings['facebook']['secret']
        );
    $helper = new FacebookRedirectLoginHelper($settings['facebook']['redirectUrl']);
      $session = $helper->getSessionFromRedirect();
    if ($session) {
      //var_dump($session);
        $user_profile = (new FacebookRequest(
          $session, 'GET', '/me'
        ))->execute()->getGraphObject(GraphUser::className());
        $uid=$user_profile->getID;
        echo $uid;
    }
    else{
      $loginUrl = $helper->getLoginUrl();
      header("location:".$loginUrl);
      exit;
    }
}

2
这个问题绝对不过时,你的解决方法应该是可行的,但它的问题在于它是基于服务器端的,这将无法与缓存一起使用。可能很容易全部在JS中完成。现在对我来说优先级较低,但稍后会尝试一下。 - Mark Kaplun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接