将Web Extension转换为Safari App Extension

时间:2018-09-24 08:18:52

标签: google-chrome-extension firefox-webextensions safari-extension safari-app-extension

我有Web扩展程序,当前可在Chrome,Firefox和Opera上运行。 现在,我想知道是否有一种方法可以使用相同的代码来构建Safari App Extension,例如PhoneGap(将Safari App Extension项目中的所有现有JS代码包装起来)或存在一些限制,例如javascript的制表符处理,以及某些事情用本机代码编写。

谢谢

8 个答案:

答案 0 :(得分:9)

您应该能够重用Web扩展中的内容脚本(但是您需要重写代码才能使用“背景”发送/接收消息)。 后台脚本必须用Swift或Objective-C重新编写。

您需要开发p:

  • Mac主机应用程序(将作为扩展程序的伴侣):Swift或Objective-C(此应用程序必须具有通过Apple审核的最低功能-请查看Mac应用程序的Apple准则)
  • 扩展名:在Swift或Objective-C + HTML / JS中(对于其他浏览器) Swift(或Obj-C)中用于扩展的代码等同于Web扩展中的后台页面。它将控制工具栏按钮,扩展程序的生命周期,并可以与注入的脚本进行通话。

您在Apple网站上有一个(小型)示例:https://developer.apple.com/documentation/safariservices/safari_app_extensions?changes=_2&language=objc

您不应再使用Extension Builder(可从Safari中的Developer菜单访问),因为它仅适用于旧版(纯JS)扩展。因此,您需要输入XCode。

最后,但并非最不重要的是……与Safari旧版扩展相比,Safari应用程序扩展“有限”得多(例如,您将无法像Chrome一样以编程方式打开工具栏弹出窗口实际上是网络扩展)。

答案 1 :(得分:7)

现在对此转换有官方支持:

Converting a Web Extension for Safari

答案 2 :(得分:5)

分享我的发现可能为时已晚,但是。

将网络扩展程序转换为Safari应用程序扩展程序的可能性的简短答案是 。绝对有可能,但是很难做到。

我很难解决将Web扩展移植到Safari应用程序扩展的最佳方法。

移植Web Extension的问题

  1. Safari App-Extension不提供用于标签/窗口管理的API。 (即,添加,删除或更新标签页或窗口时,窗口和标签页的唯一标识符)
  2. 需要具备一些快速学习/目标化-c的学习知识或经验,才能实现背景功能。
  3. 调试成为开发过程中的痛点。

解决方案

写一些swift / objective-c代码是不可避免的。但是,使用快速/目标C编写桥代码以促进内容脚本和背景脚本之间的通信会简化生活。

在图中,内容脚本保持不变,背景脚本是通过创建Web视图来注入的。现在,从内容脚本收到的任何消息都将转发到webView背景脚本。另外,使用evaluvateJavascript

设置浏览器扩展API
webView.evaluateJavaScript("chrome.runtime.id=function() { return "+ extensionId + " }")
  • 方法2:使用电子驱动的浏览器扩展

Electron JS使用Web技术,例如简单的HTML,CSS和JavaScript。除非您想进行高级操作,否则不需要本机技能。可以为单个浏览器设计。其文件系统属于Node.js API,可在Linux,Mac OS X和Windows上运行。

通过使用native node modules,您可以使用C ++和ObjectiveC(或Swift)进行编写,并使用v8将API公开给node.js。这为您提供了很大的灵活性和功能,但需要最多的时间来开发,并且仍然需要通过在电子环境中运行来重复使用背景脚本。

使用此方法构建的示例应用程序 https://github.com/AdguardTeam/AdGuardForSafari

如果您想在Safari应用扩展中执行“窗口/标签管理”,请参考WindowTabManagement

更新

如果您打算使用零本机代码(Objective-c / swift)移植旧版扩展。请关注此仓库 https://github.com/avast/topee

答案 3 :(得分:2)

您实际上可以很容易做到这一点。

  • 请记住,您需要Xcode v.12和Safari 12才能正常工作。
  1. 从Chrome存储区下载.crx文件。
    1. 我用了这个:https://crxextractor.com
  2. 使用终端“ 解压缩»”解压缩。
  3. 从终端键入 xcrun safari-web-extension-converter / path / to / manifest / 并运行它-在询问是否快速时输入。这应该打开Xcode。
  4. 从Xcode-编译并运行。
  5. 现在要激活它:
    1. 转到野生动物园,首选项,启用开发模式。
    2. 然后转到新的“开发”标签-书签旁边。
    3. «允许未签名的扩展名»
  6. 然后转到首选项和扩展名,您应该会看到扩展名。

答案 4 :(得分:1)

关于如何将Google Chrome扩展程序转换为Firefox或Safari扩展程序,您可以参考此link

  

当前需要完成一些手动工作。

     

https://github.com/kritollm/chrome-extension-api-for-safari-and-firefox

     

在我第一次写这篇文章之后,我知道了另外两个项目   两者非常相似。

     

https://code.google.com/p/adblockforchrome/source/browse/trunk/port.js   和

     

https://github.com/jetpack-labs/chrome-tailor-jetpack

此外,这是如何使用WebExtensions将Chrome扩展程序转换为Firefox附件的official guide

答案 5 :(得分:0)

如果我们要谈论的是Safari App扩展而不是旧版safari扩展(在Safari v12中已弃用),那么我的理解是需要快速重写后台脚本。 关于内容脚本,它们仍然在JS中,但是所有使用chrome API调用编写的消息传递都必须使用Safari应用程序API进行重写。

答案 6 :(得分:0)

并非所有事物都可以用Swift编写。例如,我尝试从extensionHandler调用dylib,但失败了。

答案 7 :(得分:0)

如上所述,内容脚本可以与您在Firefox和Chrome扩展程序中创建的捆绑包相同。您只需要将其包括在您的plist中即可。 为了避免在Swift中重写所有后台逻辑,我使用了Apple提供的名为JavascriptCore的库。这样,您就可以创建JavaScript上下文并将数据从Swift后台传递到JavaScript后台包。

例如:safariExtensionHandler.swift具有一个名为messageReceived的功能。此函数可以使用JavascriptCore在Swift中的代码中调用全局JavaScript函数。