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') &gt; -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 页面的深层链接

深度链接 Facebook android / ios 问题

通过 Facebook 分享深度链接到 iOS 应用

无法通过 iOS 应用程序发布到 Facebook 的深层链接

无法使用延迟深层链接从 Facebook 实时广告中获取安装引荐来源网址值

如何为我的 iOS 应用创建深层链接以在 Facebook 中使用?