javascript - 深层链接到 Facebook 应用程序(使用 fb : protocol) not working from Facebook in-app browser

标签 javascript php html facebook .htaccess

我正在编写一个移动网页,它有一个重定向和两个手动备份链接(当重定向不起作用时)到 Facebook 页面。
链接采用以下形式:

fb://page/[PAGE ID NUMBER]
重定向和链接在 Chrome Mobile 和 Firefox Mobile 中工作,但(令人惊讶)它们在 Facebook 浏览器中不起作用,相反,给了我错误:
Page can't be loaded.
我很困惑 Facebook 应用程序的链接在 Facebook 浏览器中不起作用。
我该如何解决这个问题?是否有任何创造性的解决方案或解决方法......或者我错过了一些明显的东西?

附加信息:看起来重定向在 上的 Facebook 浏览器的至少一个版本中有效。 Facebook iOS 应用 .所以这个问题可能与有关。 Facebook安卓应用 .

更新 1
我取得了一些进展。我发现 Facebook 的应用内浏览器并不总是(或从来没有?)确认/加载/执行 外部脚本文件 .
补充: (要找出原因,请参阅 更新 8 ,下面...)
在这种情况下,href链接中的属性正在重新填充 fb://页面加载后由外部脚本协议(protocol)链接。
我已将相关的 javascript 函数从外部脚本移动到实际页面的底部。我已经测试了这些功能,我可以看到它们现在正在激活。虽然链接仍然不起作用。

更新 2
令我震惊的是,幕后可能有一些安全机制不允许任何 javascript 驱动的 href 重新填充。属性而不是 fb://协议(protocol)链接不工作,可能是初始的,默认的 http://www.facebook.com/链接甚至从未被替换过,而且是那些 http://无效的协议(protocol)链接。
所以我更新了 PHP 模板,所以初始默认链接是 fb://而不是 http://链接(因此传送到 Facebook 应用程序内浏览器的页面中的任何内容都不需要在任何时候由任何客户端脚本更新)。
不。还是行不通。

更新 3
我在页面底部添加了一个普通的链接,链接到网站的主页。链接完全正常运行。
后来,我将原始链接指向外部域。他们没有工作。
所以...我得出的结论是 只有 http://到同一个域的协议(protocol)链接将起作用,这就是为什么如果链接指向外部域或 fb:// 将不起作用的原因。协议(protocol)地址。
错误的结论。
我指出了网站主页上的原始链接和他们仍然没有工作 .

更新 4
在灵感的时刻,我删除了对外部脚本的引用,我设置该引用以自定义指向 OS + 浏览器环境的链接(即使根据 FB 调试工具,该脚本引用已被 Facebook 完全忽略。
链接有效。
所以我之前添加的普通链接有效的原因与它指向的位置无关,只是与脚本从未尝试访问或更新它的事实有关。
补充: (这不是原因。见 更新 8 ,下面...)
我将原始链接指向外部域。他们工作了。
我将原始链接指向 fb://协议(protocol)。他们没有工作。

更新 5
现在我已经摆脱了外部脚本引用,我可以将原始协议(protocol)链接指向任何 http://协议(protocol)地址,他们工作。
包括http://www.facebook.com相当于我试图在 Facebook 应用程序中打开的页面的网页。
让我们回顾一下:
Facebook 网站正在 Facebook 应用内浏览器中打开。
我知道,对吧?

更新 6 [.HTACCESS 重定向]
我将链接目的地更改为 /fb-custom-redirect/ .
然后我在 mod_rewrite 中添加了一行我的 .htaccess 部分文件:
RewriteRule ^fb-custom-redirect fb://page/[PAGE ID NUMBER]
服务器自然不明白我的要求。

更新 7 [PHP 重定向]
我创建了一个 index.php/fb-custom-redirect/并添加了以下内容:
<?php
header('Location: fb://page/[PAGE ID NUMBER]');
?>
你猜怎么着?这适用于 火狐手机 .它也适用于 Chrome手机 .
但在 Facebook 应用内浏览器中,它返回相同的错误:
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:协议(protocol)深层链接不起作用 在 Facebook 应用程序的应用程序内浏览器中。
我放弃。

最佳答案

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

关于javascript - 深层链接到 Facebook 应用程序(使用 fb : protocol) not working from Facebook in-app browser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555570/

相关文章:

php - Laravel 检查给定 url 的路由是否存在于路由中

html - 指定列宽为h :panelGrid

javascript - .innerHTML 不会在 div 内打印任何内容

javascript - 侧边栏 "category"选择并显示 PHP 功能

javascript - 有没有办法在 closeNav 函数上轻松地将我的汉堡包菜单图标改回三行?

javascript - Browserify with jQuery >= 2 产生 "jQuery requires a window with a document"

javascript - Jquery 水平 Accordion Webkit 错误

javascript - 使用异步/等待返回值意外获取 API

javascript - 无论旋转如何获取元素尺寸

php - 将视频剪辑存储到 phpmyadmin