我创建了一个连接到Facebook的路由器,以便在用户访问互联网之前获取一些信息。
首先,他们连接,获取强制门户页面,然后继续登录Facebook。 自从升级到iOS7以来,它无法加载Facebook登录页面。在我的带有强制门户助手的Mac上,它没有问题,甚至在使用iOS版本的野生动物园时在手机上也没有问题。
这里出了什么问题?Facebook是来自iOS7 Captive Portal Assistant的过滤请求,还是Apple在这里做了一些偷偷摸
摸的事情?这个问题似乎很普遍,只与Facebook有关。
更新:我与测试版合作,几周前他们工作得很好。现在使用相同的测试版,它不再了。所以Facebook解释的另一点。
问候,卡斯
自 IOS 8 以来,Apple 修复了此问题。但是由于所有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
将此域列入白名单会阻止登录掩码在 IOS 设备认为互联网按预期工作时显示。这样,如果您使用普通浏览器登录,您可以控制发生的事情,因为IOS设备不会中断任何内容。
如果您未将域列入白名单,则会发生以下情况。我在带有多个IOS设备的路由器上对其进行了调试,它们的功能基本相同:
- 如果您连接到 wifi,IOS 设备会尝试连接到上面列出的域之一。如果它可以联系其中一个域,它会尝试另一个域。如果不能,它将启动重定向,该重定向由路由器控制。有时,它会在认为互联网正在工作之前查询一个或多个域。 检查后,登录屏幕
- 将重定向到您的路由器,然后重定向到强制网络门户的登录屏幕。此行为与 IOS 6 或更早版本相同。
- 现在,您开始登录第三方提供商,如Facebook,Google或Twitter。现在差异出现了。如果您在调试模式下运行它,则可以在路由器上检查它。当IOS设备转到另一个域进行oauth登录(如 www.facebook.com(时,iPhone认为某些事情发生了变化,并开始查询上面列出的苹果域之一。用户只看到一个白屏,在后台,IOS设备尝试重复联系其中一个域。对于用户来说,这似乎是一个错误,因为屏幕保持白色或需要很长时间才能显示第三方提供商的登录信息。有时它会停止加载,并且不会永远发生任何事情。
要避免此行为,您必须将上面列出的域列入白名单。对于 IOS 用户来说,这不是常见的行为,但这样,您的浏览器就可以控制登录会话,并且 IOS 设备不会像登录屏幕那样中断它。
以下站点报告了一些浅层信息:
- https://supportforums.cisco.com/docs/DOC-36523
- http://www.cadincweb.com/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network
- https://discussions.apple.com/thread/5355766
我找不到问题的详细描述,并通过调试一些路由器和IOS设备(如iPhone和iPad(的所有部件来找到上面的问题。
我刚刚测试了各种路由器设置,并注意到当路由器的域字段为空时,iOS 7 不会尝试联系上述站点/URL。
我的猜测是,空白域指向一个消费者类型的网络设置,苹果并不期望在这样的网络上有一个强制门户。如果您有权管理路由器,请查看是否可以清除 DOMAIN 字段(并重新启动/重新测试(。
我找到了解决问题的方法。(前一阵子,但我又找到了这篇文章(
首先我发现,iOS进行了3次调用,首先检查,其次获取需要显示的页面,第三次在页面加载后再次检查。然后我发现,对于页面所做的每个 POST 或 GET 操作,关于源页面的刷新,iOS 会检查是否有活动的互联网连接。由于facebook api进行了大量调用,浏览器开始停滞(可能与路由器上的QoS结合使用(并冻结页面。
我的解决方案:
由于我控制了我使用的路由器的DNS记录,因此我将所有域重定向到我自己的服务器。
首先,我保存了检查请求,以便稍后在用户返回第三个请求时识别用户。
当第二个请求出现时,我只显示一个信息窗口,说明每件事都是正确的,用户必须单击"完成"按钮。
页面已加载,因此iOS再次检查,但我识别了用户,因此我显示Apple也显示的OK代码。根据iOS显示的"完成"按钮,用户具有"互联网"。
在我显示的页面上,我指示用户打开 Web 浏览器。当他这样做时,他会打开一个页面,并显示具有正确页面的门户(我可以根据浏览器代理检测到这一点(。然后我的脸书 api 开始做它的工作,然后我们去:-(
如果有人需要有关如何检测的更多信息,甚至在必要时需要代码示例,请告诉我。
额外信息要在您自己的服务器上捕获用户,请使用例如 .htaccess 将每个请求重定向到您的处理页面。请求是向具有子文件的域发出的,例如:http://captive.apple.com/getrT09Nx7G/YNrnUOulnDj/3cfrq3M40iR.html
要使多个用户分开,请使用设备在检查互联网时尝试联系的唯一 URL,在本例中:/getYT09Nx7G/YN1nUOulnDj/3cfMq3M40iR.html