Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用浏览器重定向创建Facebook风格的应用程序内身份验证?_Ios_Objective C_Authentication_Safari_Url Scheme - Fatal编程技术网

Ios 如何使用浏览器重定向创建Facebook风格的应用程序内身份验证?

Ios 如何使用浏览器重定向创建Facebook风格的应用程序内身份验证?,ios,objective-c,authentication,safari,url-scheme,Ios,Objective C,Authentication,Safari,Url Scheme,我希望能够通过定制的iPhone应用程序验证Safari网站上的交易,然后通过回调将用户带回同一Safari窗口。。。有点像Facebook OAuth风格的登录 用户在网页上,点击按钮进行交易 Safari使用方案和参数()启动我们的定制应用程序 应用程序验证用户身份 用户通过一些回调被重定向回Safari,通知网页事务已成功(最好在同一窗口中) 这是第四步,我不知道怎么做。我想我可以很容易地将用户重定向回另一个窗口中的浏览器,但是否可以通过回调将他们发送回以前所在的同一个窗口?更新: 这是有

我希望能够通过定制的iPhone应用程序验证Safari网站上的交易,然后通过回调将用户带回同一Safari窗口。。。有点像Facebook OAuth风格的登录

  • 用户在网页上,点击按钮进行交易
  • Safari使用方案和参数()启动我们的定制应用程序
  • 应用程序验证用户身份
  • 用户通过一些回调被重定向回Safari,通知网页事务已成功(最好在同一窗口中)
  • 这是第四步,我不知道怎么做。我想我可以很容易地将用户重定向回另一个窗口中的浏览器,但是否可以通过回调将他们发送回以前所在的同一个窗口?

    更新: 这是有可能的,经过一些实验后,我在Safari的行为中发现了一些有趣的东西。如果Safari打开了一个选项卡,但url不在站点的根目录下,那么如果您的应用程序再次请求相同的url,Safari将不会打开新选项卡

    因此,在你的情况下,如果你来自facebook.com/auth,并且你的应用程序已打开,那么该选项卡将被重新使用!您也可以安全地传递web参数;这些将在选项卡处理决策中被忽略。我还没有测试http和https,看看这是否也被忽略,但这是需要注意的

    旧答案:

    是的,这是可能的,但是只有记录在案的打开Safari的方式会导致为您的“请求”打开一个新选项卡

    有文档记录的方法是使用如下URL方案:

    if( [[UIApplication sharedApplication] canOpenURL:myURL] )
    {
        [[UIApplication sharedApplication] openURL:myURL];
    }
    

    我之所以说这是可能的,是因为谷歌地图在iOS 8上做到了这一点。 如果您使用mobile Safari搜索地址,然后选择生成的地图视图,它将打开谷歌地图应用程序(如果已安装)。谷歌地图应用程序将在页面顶部有一条横幅,上面写着“返回SAFARI”。如果您单击此横幅,它将带您返回Safari,而不会以您喜欢的方式打开新选项卡

    同样的行为也扩展到了Chrome。此处的文档还说明,除非您多次调用,否则在Chrome中打开URL时将创建一个新选项卡:

    当然,Chrome是他们自己的应用程序,在这种情况下,他们完全有权使用未记录的功能。我不能说谷歌是如何通过Safari实现这一点的


    我建议最好找到一种方法来支持这两种浏览器,就像谷歌在地图应用程序中所做的那样,给用户一个一致的体验,并尊重他们对浏览器的选择。在我看来,这个功能当然是合理的;如果Safari启动了您的应用程序,为什么您不能将用户返回到该页面。

    您不能在有效负载中发送userAgent信息吗?这样你就可以计算出正在使用的应用程序,并将用户返回到那里。。。您将在AppDelegate的委托回调中获得调用应用程序的bundle ID——假设一切都公平,Safari也应该发回它的ID。Safari中奇怪的、未记录的行为。太棒了!:)