能否通过Cordova获取Chrome/Safari的URL历史或用户当前访问的URL?
嘿,直接给你结论吧:你想要的那种在用户打开Cordova应用后,直接获取他们之前在Chrome/Safari里浏览的历史记录或当前URL的方案,是完全不可行的,核心原因是移动端系统的隐私安全限制,下面分平台给你掰扯清楚:
为什么不行?系统隐私墙在挡着
不管是iOS还是Android,现在的操作系统都把每个应用的私有数据牢牢锁在自己的沙盒里,Chrome和Safari的浏览历史、当前会话的URL都是它们的敏感私有数据,第三方应用(包括你的Cordova应用)根本没有权限去读取这些内容——这是为了保护用户的隐私不被随便窃取,毕竟浏览记录可是相当私人的信息。
iOS(Safari)这边
iOS的沙盒机制严得离谱,Safari的所有数据都存在自己的专属沙盒里,别的应用连碰都碰不到。而且Apple的App Store审核规则也明确禁止这种试图获取其他应用私有数据的行为,就算你搞出什么歪门邪道,提交审核的时候绝对会被打回来,甚至可能直接不让你的应用上架。
Android(Chrome)这边
Android的权限机制虽然比iOS灵活一点,但Chrome的浏览历史属于敏感隐私数据,需要READ_HISTORY_BOOKMARKS权限,可这个权限是签名级权限——意思是只有和Chrome用同一个开发者签名的应用才能拿到这个权限,普通第三方应用(比如你的Cordova应用)根本申请不到。再加上从Android 10(API 29)开始,系统又收紧了对其他应用数据的访问权限,就算你能拿到权限,也读不到Chrome的历史。
唯一可行的例外场景:从浏览器跳转进你的App
如果你的需求是用户在Chrome/Safari里点击某个链接,直接跳转打开你的Cordova应用,这种情况下你是可以获取到那个跳转的URL的,这是合法且能实现的,具体步骤如下:
第一步:给你的Cordova应用配置URL Scheme
简单说就是给你的App分配一个专属的“协议”,比如myapp://,这样浏览器就能通过这个协议唤起你的App。
iOS配置:在项目的
config.xml里加这段代码:<platform name="ios"> <config-file parent="CFBundleURLTypes" target="*-Info.plist"> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> </array> </dict> </array> </config-file> </platform>Android配置:同样在
config.xml里加这段:<platform name="android"> <config-file parent="/manifest/application/activity[@android:name='MainActivity']" target="AndroidManifest.xml"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" /> </intent-filter> </config-file> </platform>
第二步:用插件处理深度链接,获取跳转URL
我们可以用cordova-plugin-deeplinks这个插件来处理跳转事件,拿到对应的URL:
先安装插件:
cordova plugin add cordova-plugin-deeplinks --variable URL_SCHEME=myapp --variable DEEPLINK_SCHEME=https --variable DEEPLINK_HOST=yourdomain.com注意把
yourdomain.com换成你实际的域名,如果不需要域名限制也可以调整参数。在你的JS代码里监听跳转事件:
document.addEventListener('deviceready', function() { // 处理App启动时的深度链接(比如用户直接从浏览器点击链接打开App) window.plugins.deepLinks.route(function(path, query) { console.log('收到跳转链接路径:' + path); console.log('链接参数:', query); // 这里就能拿到跳转的URL相关信息,按需处理就行 }, function(error) { console.error('处理深度链接出错:', error); }); // 处理App已经在后台运行时收到的跳转链接 window.addEventListener('deeplink', function(event) { console.log('App运行中收到跳转链接:', event.url); }); }, false);
最后再总结一下
- 直接获取Chrome/Safari的历史记录或用户之前浏览的当前URL:完全不行,系统隐私权限卡死了这条路。
- 用户从浏览器跳转进你的Cordova应用时获取跳转URL:可行,按上面的步骤配置就能实现。
内容的提问来源于stack exchange,提问作者Keinan Goichman

