将Web扩展转换为Safari App Extension

Boj*_*n V 8 google-chrome-extension safari-extension firefox-addon-webextensions safari-app-extension

我有网络扩展,目前运行在Chrome,Firefox和Opera上.现在我想知道是否有一种方法可以使用相同的代码来构建Safari App Extension,可能类似于PhoneGap(在Safari App Extension项目中包装所有现有的JS代码),或者有一些限制,例如javascript的标签处理和一些事情只需要用本机代码编写.

谢谢

Emm*_*ier 10

您应该能够重用Web扩展中的内容脚本(但您需要重写代码才能发送/接收带有"背景"的消息).必须在Swift或Objective-C中重写后台脚本.

你需要开发:

  • Mac主机应用程序(将作为扩展程序的伴侣):Swift或Objective-C(此应用程序必须具有通过Apple审核的最低功能 - 请查看Apple应用程序的Apple指南)
  • 扩展:在Swift或Objective-C + HTML/JS中(和其他浏览器一样)Swift(或Obj-C)中用于扩展的代码相当于Web Extensions中的后台页面.它将控制工具栏按钮,扩展的生命周期,并可以与注入的脚本交谈.

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

您不应再使用Extension Builder(可从Safari中的Developer菜单访问),因为这仅适用于旧版(纯JS)扩展.所以你需要进入XCode.

最后,但并非最不重要的是......与Safari旧版扩展程序相比,Safari App Extensions"有点"受限(例如,您无法以编程方式打开工具栏弹出窗口,就像使用Chrome网络扩展程序一样其实).


小智 8

现在官方支持这种转换:

为 Safari 转换 Web 扩展

  • 好的,我们刚刚为此写了一篇博客,以防对其他人有所帮助:https://bartsolutions.medium.com/how-to-convert-an-chrome-extension-into-a-safari-web-extension-并上传到 mac-app-store-69c0f7142178 (2认同)

pra*_*nan 5

分享我的发现可能为时已晚,但仍然如此。

将 Web 扩展程序转换为 safari 应用程序扩展程序的可能性的 简短回答Yes。这绝对有可能,但很难做到。

我很难找出将 Web 扩展程序移植到 safari 应用程序扩展程序的最佳和最小方法。

移植 Web 扩展的问题

  1. Safari App-Extension 不提供用于选项卡/窗口管理的 API。(即,当添加、删除或更新选项卡或窗口时,窗口和选项卡的唯一标识符)
  2. 需要一些学习或使用 swift/objective -c 的经验才能实现后台功能。
  3. 调试成为开发过程中的痛点。

解决方案

编写一些 swift/objective-c 代码是不可避免的。但是在 swift/objective C 中编写桥接代码来促进内容脚本和背景脚本之间的通信使生活更轻松。

在图中,Content-script 保持不变,background-script 是通过创建 webview 注入的。现在从内容脚本收到的任何消息都转发到 webView 背景脚本。还使用设置浏览器扩展 APIevaluvateJavascript

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

Electron JS 使用简单的 HTML、CSS 和 JavaScript 等网络技术。除非您想做一些高级的事情,否则它不需要本地技能。它可以为单个浏览器设计。它的文件系统属于 Node.js API,适用于 Linux、Mac OS X、Windows。

通过使用本机节点模块,您可以使用 C++ 和 ObjectiveC(或 Swift)编写,并使用 v8 向 node.js 公开 API。这为您提供了很大的灵活性和功能,但需要最多的开发时间,并且仍然需要通过在电子上下文中运行来重用您的背景脚本。

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

如果您想在 safari 应用程序扩展中进行窗口/标签管理,请参阅WindowTabManagement

更新

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