【问题标题】:Chrome Extension : Custom Protocol?Chrome 扩展:自定义协议?
【发布时间】:2013-12-30 09:16:41
【问题描述】:

是否有方法可以像在 firefox 中一样使用 google chrome 扩展注册自定义协议:

const kSIMPLEURI_CONTRACTID = "@mozilla.org/network/simple-uri;1"; 
const kIOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1"; 
const nsISupports = Components.interfaces.nsISupports; 
const nsIIOService = Components.interfaces.nsIIOService; 
const nsIProtocolHandler = Components.interfaces.nsIProtocolHandler; 
const nsIURI = Components.interfaces.nsIURI; 

我想要协议:

xyz:

不是 xyz://

这可能吗?

【问题讨论】:

    标签: google-chrome google-chrome-extension


    【解决方案1】:

    Chrome 不提供为 xyz: 方案设置自定义处理程序的方法。

    有一些方法可以模拟这种行为:

    • 使用内容脚本为指向xyz:...的链接的点击设置事件侦听器。
    • 使用webRequest API 拦截来自默认搜索提供程序的所有请求并将其重定向到自定义 URL。我正在使用这种方法来捕获通配符搜索关键字,但它也可以用于支持虚假方案。不幸的是,该扩展程序将完全针对用户的搜索设置,因为它会执行以下操作:

      Redirect http://google.com/search?q=xyz%3Awhatever
            to chrome-extension://.../whatever
      

    不过,在这两种情况下,您都不会在多功能框中看到xyz:whatever

    navigator.registerProtocolHandler 应该是注册xyz: 处理程序的最佳方式。不幸的是,目前它非常有限。自定义协议必须以web+ 为前缀。另请查看此 API 的 list of open bugs

    【讨论】:

    • 磁铁:链接如何工作?我在 chrome 中将这些视为磁铁:xyz,它们确实在那里工作。
    • @Wesley 链接到这样的扩展?您可以使用我的Chrome extension source viewer? 轻松查看他们的源代码
    • 它没有扩展。也许是应用程序(传输)以某种方式做到了这一点?应用可以注册自定义协议吗?
    • @Wesley 是的。在 Windows 上,我相信这可以通过注册表来完成。我从来没有尝试过这样的事情,所以自己去研究答案。快速谷歌显示stackoverflow.com/q/19221677msdn.microsoft.com/en-us/library/aa767914(VS.85).aspx,我相信还有许多其他参考资料对您有用。
    • @Wesley:浏览器无法识别的任何链接都将委托给操作系统。 magnet: 有一个由安装在您计算机上的某个应用程序注册的协议处理程序 - 该应用程序本质上要求在单击此类链接时启动。以这种方式注册协议处理程序的细节取决于操作系统。
    【解决方案2】:

    新方法是使用declarativeNetRequest

    创建一个执行重定向的规则rules.json

    [
      {
        "id": 1,
        "priority": 1,
        "action": {
          "type": "redirect",
          "redirect": { 
            "regexSubstitution": "chrome-extension://xxxxxxxxxxxxxxxx/redirect.html#\\1"
          }
        },
        "condition": { 
          "regexFilter": "^https://mohamedmansour.com/join/([\\w]+)", 
          "resourceTypes": ["main_frame"]
        }
      }
    ]
    

    然后在您的redirect.html 脚本中处理它,您可以使用chrome.runtime.sendMessage 对其进行操作。

    function closeCurrentTab() {
      chrome.tabs.getCurrent(tab => chrome.tabs.remove(tab.id, () => {}))
    }
    
    if (location.hash)
      chrome.runtime.sendMessage({ command: 'AppLink', data: location.hash }, () => closeCurrentTab())
    else
      closeCurrentTab()
    

    这就是您可以在扩展程序中使用虚假 URL 链接进行应用深度链接的方法。

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多