Facebook 应用程序的深层链接(使用 fb: 协议)在 Facebook 应用程序内浏览器中不起作用

Deeplink to Facebook App (using fb: protocol) not working from Facebook in-app browser

我正在写一个移动网页,它有一个重定向和两个手动备份 links(当重定向不起作用时)到 Facebook 页面。

link 的形式为:

fb://page/[PAGE ID NUMBER]

重定向和 link 在 Chrome Mobile 和 Firefox Mobile 中工作,但(令人惊讶)它们在 Facebook 浏览器中不起作用,反而给我错误:

Page can't be loaded.

我很困惑 link 在 Facebook 浏览器中无法使用 Facebook 应用程序。

我该如何解决这个问题?是否有任何创造性的解决方案或变通方法...或者我错过了一些明显的东西?


附加信息: 看起来重定向 在 [=165= 上的至少一个版本的 Facebook 浏览器中工作]Facebook iOS 应用。所以这个问题可能被隔离到 Facebook Android App.


更新 1

我取得了一些进步。我发现 Facebook 的应用程序内浏览器并不总是(或从来没有?)确认/加载/执行外部脚本文件

已添加: (要找出原因,请参阅下面的 更新 8...)

在这种情况下,link 中的 href 属性被外部脚本 fb:// 协议 link 重新填充 页面加载后.

我已将相关 javascript 函数从外部脚本移动到实际页面的底部。我已经测试了这些功能,我可以看到它们现在正在激活。尽管 link 仍然不起作用。


更新 2

令我震惊的是,幕后可能有一些安全机制不允许任何 javascript 驱动的 href 属性的重新填充,而不是 fb:// 协议 link 不起作用,可能是初始的默认 http://www.facebook.com/ link 甚至从未被替换过,它是 那些 http:// 协议 link 不起作用。

所以我更新了 PHP 模板,所以初始默认 links 是 fb:// 而不是 http:// links(所以传送到 Facebook 应用程序内浏览器的页面中的任何内容都不需要任何客户端脚本在任何时候进行更新。

没有。还是不行。


更新 3

我在页面底部添加了一个普通的香草 link,linking 到站点的主页。 link 完全正常运行。

后来,我把原来的link指向了一个外域。他们没有用。

所以...我得出的结论是 http:// 协议 link 到 相同的域 可以工作,这就是为什么 link 指向外部域或 fb:// 协议地址时无法工作的原因。

错误的结论。

我将原始的 link 指向站点的主页,它们仍然不起作用


更新 4

一时灵机一动,我删除了对外部脚本的引用,该脚本是为将 link 自定义为 OS + 浏览器环境而设置的(即使此脚本引用根据 FB 调试工具,Facebook 完全忽略了它。

link有效。

所以我之前添加的普通香草 link 起作用的原因与它指向的位置无关,而只是与脚本从未尝试访问的事实有关它或更新它。

添加: (这不是原因。请参阅下面的 更新 8...)

我把原来的link指向外域。他们工作了。

我将原始 link 指向 fb:// 协议。 他们没有工作。


更新 5

现在我已经摆脱了外部脚本引用,我可以将原始协议 links 指向 any http:// 协议地址和他们工作。

包括我试图在 Facebook 应用程序中打开的页面的 http://www.facebook.com 网络等效内容。

让我们回顾一下:

Facebook 网站 正在 Facebook 应用内浏览器中打开。

我知道,对吧?


更新 6 [.HTACCESS 重定向]

我将 link 目的地更改为 /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 Mobile.

但在 Facebook 应用内浏览器中,它 returns 同样的错误:

Page can't be loaded.

更新 8

我刚刚发现 - 这并非无关紧要 - 当 Facebook 调试器工具 (https://developers.facebook.com/tools/debug/sharing/) 刷新给定页面的 Facebook 缓存时,它刷新.html.

再次抓取 不会刷新任何外部资源,如.css.js文件。

相反,Facebook 继续引用这些文件自己的缓存版本,而不管 .html 文件缓存是否刚刚更新。

解决方法(至少在 PHP 中)是在每次加载页面时为文件路径附加一个随机生成的新查询字符串:

<link rel="stylesheet" href="/styles/mystyles.css?'.uniqid().'" />

现在 Facebook 应用内浏览器正在获取我的 .css.js 文件的最新版本。

这解释了我在 更新 1 中的初步观察:

I've made some progress. I've discovered that Facebook's in-app browser doesn't always (or doesn't ever?) acknowledge / load / execute external script files.

我要得出结论,Facebook 应用内浏览器 解析外部 .js 文件引用时间,但它反复访问该文件的旧缓存版本。


然而,即使在上面所有的假设和实验之后,我仍然没有接近发现 为什么 fb: 协议深度 link 不在 Facebook 应用程序的应用程序内浏览器中无法工作

我放弃了

Apple 应用是沙盒化的。这意味着他们无法访问其他应用程序和执行代码。 Facebook 是 运行 一个浏览实例,当您尝试调用 fb:// 协议时,iPhone 阻止您这样做以尝试创建一个无限的应用程序加载循环。也就是说,你在 FB 浏览器中打开一个页面,它在 FB 浏览器中打开它自己,它在 FB 浏览器中打开它自己...