Facebook.com和iOS7强制门户检测

我创build了一个连接到Facebook的路由器来获取一些信息,然后用户可以访问互联网。

首先他们连接,获得强制门户页面,然后继续Facebooklogin。 由于升级到iOS7,它无法加载Facebooklogin页面。 在我使用Captive Portal Assistant的Mac上,没有任何问题,甚至在使用iOS版Safari浏览器的情况下,也没有任何问题。

这里怎么了? 是来自iOS7 Captive Portal Assistant的Facebook过滤请求,还是苹果在这里做了一些鬼鬼祟祟的东西?

看起来这个问题很普遍 ,只和facebook有关。

更新:我与testing版一起工作,他们在几个星期前工作得很好。 现在使用相同的testing版本,现在已经不复存在了。 所以,另一点为Facebook的解释。

问候,Cas

自IOS8以来,这个问题已被苹果解决。但是,由于所有的iPhone 4用户都无法升级到IOS 8,所以这个问题依然存在。

IOS 7设备检查以下域名:

www.appleiphonecell.com captive.apple.com captive.apple.com www.apple.com www.itools.info www.ibook.info www.airport.us www.thinkdifferent.us 

将这个域列入白名单将阻止login掩码在IOS设备认为正在出现,互联网正在按预期工作。 这样你可以控制发生的事情,因为IOS设备不会中断任何事情,如果你使用普通的浏览器进行login。

如果您没有将域列入白名单,则会发生以下情况。 我在具有多个IOS设备的路由器上进行debugging,它们大部分都是一样的:

  1. 如果连接到wifi,IOS设备将尝试连接到上面列出的其中一个域。 如果可以联系其中一个域,则会尝试另一个域。 如果不能,则启动由路由器控制的redirect。 有时候,在它认为互联网正在工作之前,它会查询一个或多个域名。
  2. 检查之后,login屏幕将redirect到路由器,然后redirect到强制门户的login屏幕。 这个行为和IOS6或之前的一样。
  3. 现在您开始oauthlogin到Facebook,Google或Twitter等第三方提供商。 现在差别出现了。 如果您在debugging模式下运行它,您可以在路由器上检查它。 当IOS设备进入oauthlogin的其他域名(例如www.facebook.com)时,iPhone认为有些变化,并开始查询上面列出的苹果域名之一。 用户只能看到一个白色的屏幕,在后台iOS设备会尝试重复联系其中一个域。 对于用户来说,这似乎是一个错误,因为屏幕保持白色或需要很长时间才能显示第三方提供商的login信息。 有时它停止加载,并没有发生永远。

为了避免这种行为,您必须将上面列出的域列入白名单。 这对IOS用户来说不是一个常见的行为,但是这样,你的浏览器就可以控制login会话,IOS设备不会像login屏幕那样中断它。

在以下网站上报告了一些浅层信息:

我找不到问题的详细描述,并通过debugging所有部件与iPhone和iPad的一些路由器和IOS设备find了自己的上面。

如果您是苹果注册开发者,请填写错误报告。 我能帮你。 我希望苹果能很快修复它。

我刚刚testing过各种路由器设置,并注意到当路由器的DOMAIN字段为空时iOS 7不会尝试联系上述网站/ URL。

我的猜测是,空白域指向一个消费types的networking设置和苹果不期望在这样的networking的强制门户网站。 如果您有权限pipe理路由器,请查看是否可以清除DOMAIN字段(并重新启动/重新testing)。

我find了解决我的问题的方法。 (前一阵子,但我发现这个post了)

首先我发现,iOS打了3个电话,先检查一下,第二个拿到需要显示的页面,第三个在页面加载后再次检查。 然后我发现,对于页面所做的每个POST或GET操作,关于源页面被刷新,iOS会检查一个活动的Internet连接。 由于facebook api调用了很多,浏览器开始拖延(可能与我的路由器上的QoS结合)并冻结页面。

我的解决scheme

由于我在控制我使用的路由器的DNSlogging,因此我将所有域redirect到我自己的服务器。

首先,我保存了检查请求,以便稍后在第三个请求返回时识别用户。

当第二个请求到来时,我只是显示一个信息窗口,每一件事情是正确的,用户必须点击“完成”button。

该页面被加载,所以iOS再次检查,但我认识到用户,所以我显示的OK代码苹果也显示。 根据iOS,我们显示“完成”button,用户有“互联网”。

在我显示的页面上,我指示用户打开网页浏览器。 当他这样做,他打开一个页面,我的门户网站显示正确的页面(我可以检测到基于浏览器代理)。 然后我的Facebook的API开始做的工作,我们去:-)

让我知道如果有人需要更多的信息,如何检测或甚至如果有必要的代码示例。

附加信息要在自己的服务器上捕获用户,请使用例如.htaccess将每个请求redirect到处理页面。 该请求是对具有子文件的域进行的,例如: http : //captive.apple.com/getrT09Nx7G/YNrnUOulnDj/3cfrq3M40iR.html

要让多个用户分开,请使用设备在检查互联网时尝试联系的唯一url,在这种情况下:/getYT09Nx7G/YN1nUOulnDj/3cfMq3M40iR.html