【发布时间】:2013-04-29 07:47:45
【问题描述】:
我为 iOS 和 Android 开发了一个应用程序,它使用应用程序内浏览器 (Webview) 从我的网络服务器访问 HTML 文件。
我不希望用户在不使用应用程序的情况下访问此文件。是否有可能检测用户是使用应用程序访问文件还是直接通过此智能手机/平板电脑/计算机上的浏览器访问文件?我认为使用 PHP 的解决方案要好得多,因为可以关闭 Javascript。至少 Google Analytics 可以区分 Safari 和 Safari(应用内)。它应该适用于所有版本的 iOS 和 Android。
感谢您的帮助。
解决方案
经过多次尝试,我终于找到了适合我的解决方案!
iOS: 您可以使用用户代理检测 Safari 和应用内浏览器之间的差异。可能有更好的解决方案,但它确实有效。
// Safari (in-app)
if ((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false) {
echo 'Safari (in-app)';
}
安卓:
应用程序的包名称存储在 PHP 变量 $_SERVER['HTTP_X_REQUESTED_WITH'] 中。
// Android (in-app)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") {
echo 'Android (in-app)';
}
正如 Tim van Elsloo 已经指出的那样,HTTP 标头可以被伪造,这并不是绝对安全的。
【问题讨论】:
-
如果从其他浏览器打开页面,iOs 解决方案将失败。经过一些测试,我对其进行了一些改进。在这里查看:stackoverflow.com/questions/2738766/…
-
这个方法对 IOS11 是否仍然有效,因为在 IOS 11 中,即使在应用程序浏览器中,我们也会返回包含 Safari 单词的 HTTP_USER_AGENT 值。我们得到了这个:Mozilla/5.0(iPhone;CPU iPhone OS 11_3,如 Mac OS X)AppleWebKit/605.1.15(KHTML,如 Gecko)版本/11.0 Mobile/15E148 Safari/604.1 用于应用程序 safari。所以我假设这个方法将不再适用于IOS11?
标签: php javascript android ios xcode