Facebook 应用程序的深层链接(使用 fb: 协议)在 Facebook 应用程序内浏览器中不起作用
Posted
技术标签:
【中文标题】Facebook 应用程序的深层链接(使用 fb: 协议)在 Facebook 应用程序内浏览器中不起作用【英文标题】:Deeplink to Facebook App (using fb: protocol) not working from Facebook in-app browser 【发布时间】:2019-12-24 14:30:15 【问题描述】:我正在编写一个移动网页,其中包含一个重定向和两个手动备份链接(当重定向不起作用时)到 Facebook 页面。
链接采用以下形式:
fb://page/[PAGE ID NUMBER]
重定向和链接在 Chrome Mobile 和 Firefox Mobile 中有效,但(令人惊讶的是)它们在 Facebook 浏览器中不起作用,相反,它给了我错误:
Page can't be loaded.
我很困惑 Facebook 应用程序的链接在 Facebook 浏览器中不起作用。
我该如何解决这个问题?是否有任何创造性的解决方案或变通方法...或者我错过了一些明显的东西?
其他信息:看起来重定向正在在 Facebook iOS 应用程序上的至少一个版本的 Facebook 浏览器中工作。因此问题可能与 Facebook Android 应用有关。
更新 1
我已经取得了一些进展。我发现 Facebook 的应用内浏览器并不总是(或者从来没有?)确认/加载/执行外部脚本文件。
已添加: (要了解为什么不这样做,请参阅下面的更新 8...)
在这种情况下,链接中的href
属性会在页面加载后由外部脚本用fb://
协议链接重新填充。
我已将相关的 javascript 函数从外部脚本移至实际页面的底部。我已经测试了这些功能,我可以看到它们现在正在激活。虽然链接仍然不起作用。
更新 2
让我感到震惊的是,幕后可能存在一些安全机制,它不允许任何 javascript 驱动的 href
属性重新填充,而不是 fb://
协议链接不起作用,它可能的情况是,最初的默认 http://www.facebook.com/
链接甚至从未被替换,而 那些 http://
协议链接不起作用。
所以我更新了 php 模板,因此初始默认链接是 fb://
而不是 http://
链接(因此传递到 Facebook 应用内浏览器的页面中的任何内容都不需要由任何客户端更新-side 脚本在任何时候)。
不。还是不行。
更新 3
我在页面底部添加了一个普通的链接,链接到该网站的主页。链接功能完全正常。
后来,我将原始链接指向了一个外部域。他们没有工作。
所以...我的结论是只有 http://
协议链接到相同的域 可以工作,这就是为什么链接不会'如果它们指向外部域或fb://
协议地址,则无法正常工作。
错误的结论。
我将原始链接指向该网站的主页,但它们仍然不起作用。
更新 4
在灵感的瞬间,我删除了对外部脚本的引用,我设置该脚本以自定义指向 OS + 浏览器环境的链接(尽管 Facebook 完全忽略了这个脚本引用,根据 FB调试工具。
链接有效。
所以我之前添加的普通链接起作用的原因与它指向的位置无关,而只是因为脚本从未尝试访问或更新它。
已添加: (这不是原因。请参阅Update 8,如下...)
我将原始链接指向外部域。他们工作了。
我将原始链接指向fb://
协议。 他们没有工作。
更新 5
现在我已经摆脱了外部脚本引用,我可以将原始协议链接指向 any http://
协议地址,它们就可以工作了。
包括http://www.facebook.com
web 等效项,相当于我尝试在 Facebook 应用程序中打开的页面。
让我们回顾一下:
Facebook 网站正在 Facebook 应用内浏览器中打开。
我知道,对吧?
更新 6 [.HTACCESS 重定向]
我将链接目标更改为/fb-custom-redirect/
。
然后我在.htaccess
文件的mod_rewrite
部分添加了一行:
RewriteRule ^fb-custom-redirect fb://page/[PAGE ID NUMBER]
服务器自然不明白我的要求。
更新 7 [PHP 重定向]
我为/fb-custom-redirect/
创建了一个index.php
并添加了以下内容:
<?php
header('Location: fb://page/[PAGE ID NUMBER]');
?>
你猜怎么着?这适用于 Firefox Mobile。它也适用于 Chrome 移动版。
但在 Facebook 应用内浏览器中,它返回相同的错误:
Page can't be loaded.
更新 8
我刚刚发现 - 这并非无关紧要 - 当 Facebook 调试器工具 (https://developers.facebook.com/tools/debug/sharing/) 刷新 Facebook 对给定页面的缓存时,它只 刷新.html
。
按再次抓取 不会刷新任何外部资源,例如.css
和.js
文件。
尽管.html
文件缓存刚刚更新,Facebook 仍会继续引用其自己的缓存版本。
解决方法(至少在PHP
中)是每次加载页面时都在文件路径中附加一个新的、随机生成的查询字符串:
<link rel="stylesheet" href="/styles/mystyles.css?'.uniqid().'" />
现在 Facebook 应用内浏览器正在获取我的 .css
和 .js
文件的最新版本。
这解释了我在 Update 1 中的初步观察:
我已经取得了一些进展。我发现 Facebook 的应用内 浏览器并不总是(或从来没有?)确认/加载/执行 外部脚本文件。
我将得出结论,Facebook 应用内浏览器是每次都解析外部 .js
文件引用,但它反复访问一个旧的,该文件的缓存版本。
尽管如此,即使经过上述所有假设和实验,我仍然无法发现 为什么fb:
协议深层链接在 Facebook 应用的应用内浏览器中不起作用 .
我放弃了。
【问题讨论】:
一种可能的解决方案可能是检测 Facebook 应用内浏览器(使用if (navigator.userAgent.indexOf('FBAV') > -1) ...
),然后在外部浏览器中重新打开同一页面,但我什至不确定这是否是可能...?
第 9 次更新在哪里?
@Tuckbros 不,这个问题不是链接的骗子,OP 询问 facebook 应用内浏览器仅为什么它仍然使用缓存版本。
@Accountantم - 哈。好东西。更新 9 是(目前)“我实际上已经放弃了。我简直不敢相信 Facebook 应用内浏览器可以显示来自 Facebook 网站的页面,但不会自动将用户发送到实际应用中的等效地址,这通过打开应用内浏览器,用户显然已经在使用了。”
您也可以尝试在更新 7 中使用不同的标头。参考:en.wikipedia.org/wiki/URL_redirection#HTTP_status_codes_3xx 和 php.net/manual/en/function.header.php 强制执行“303”http 响应。
【参考方案1】:
Apple 应用程序是沙盒的。这意味着他们无法访问其他应用程序并执行代码。 Facebook 正在运行一个浏览实例,当您尝试调用 fb:// 协议时,iPhone 会阻止您执行此操作以尝试创建无限的应用程序加载循环。即,您在 FB 浏览器中打开一个页面,它在 FB 浏览器中打开自己,并在 FB 浏览器中打开自己...
【讨论】:
我明白你在说什么(有点),但我真的不明白为什么要打开 Facebook 页面(或 Facebook 群组 ) 将导致 Facebook 也打开/重新打开其应用内浏览器。 不一定。我所说的内置保护可防止应用内浏览器打开未经批准的自身实例。这是一个包罗万象的东西。 啊...所以这实际上不是特定于 FB 的问题?这是操作系统范围的问题? 是的。这正是它的本质。 太棒了。那么,这回答了我一年半以来的一个问题。谢谢你,@Goman60。以上是关于Facebook 应用程序的深层链接(使用 fb: 协议)在 Facebook 应用程序内浏览器中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
深度链接 Facebook android / ios 问题
无法通过 iOS 应用程序发布到 Facebook 的深层链接