如何使用PHP代码检测MacOS应用内webview访问 普通浏览器需强制登录
问题解答
1. 关于your.app.id是否为产品包标识符的说明
默认情况下MacOS应用的WebView不会自动将产品包标识符(bundle identifier)作为HTTP_X_REQUESTED_WITH请求头发送,这个请求头属于自定义请求头,你代码里的your.app.id是需要你自己在WebView端主动设置的自定义值,你可以把它设为你的包标识符com.apple.test,但前提是要手动给WebView请求加上这个头。
2. 始终返回NO的核心原因
- 你没有在MacOS应用的WebView中手动添加
X-Requested-With自定义请求头,服务端根本收不到对应值,自然判断不通过 - 你现有PHP代码存在逻辑错误:在
header跳转前输出了echo 'NO',会直接导致header跳转失效,因为HTTP头必须在任何实际输出之前发送。
3. 具体解决方案
3.1 给MacOS WebView添加自定义请求头
以常用的WKWebView为例,在初始化WebView、发起请求时添加自定义头,Swift代码示例:
let webConfig = WKWebViewConfiguration() let request = URLRequest(url: URL(string: "你的目标URL")!) // 给请求设置X-Requested-With头,值为你的包标识符 request.setValue("com.apple.test", forHTTPHeaderField: "X-Requested-With") webView.load(request)
如果使用Objective-C开发,逻辑一致,给NSURLRequest添加对应头字段即可。
3.2 修正PHP端代码
修复输出提前导致的header失效问题,补充请求头存在性判断,避免未定义索引报错:
<?php $allowAccess = false; // 先判断自定义头是否存在且值匹配 if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == "com.apple.test") { $allowAccess = true; } if($allowAccess) { echo 'YES'; // 此处放置WebView用户可直接访问的业务内容 } else { session_start(); if (!isset($_SESSION['username'])) { header("location:login.php"); exit(); // 跳转后终止后续代码执行 } else { echo "Welcome " . $_SESSION['username']; } } ?>
3.3 调试排查方法
如果修改后还是不生效,可以临时在PHP端输出所有收到的请求头,确认WebView是否正确携带了自定义头:
<?php var_dump(getallheaders()); ?>
内容的提问来源于stack exchange,提问作者Kênh Vui Để Học
相关产品推荐
相关产品推荐

