我有Web扩展程序,当前可在Chrome,Firefox和Opera上运行。 现在,我想知道是否有一种方法可以使用相同的代码来构建Safari App Extension,例如PhoneGap(将Safari App Extension项目中的所有现有JS代码包装起来)或存在一些限制,例如javascript的制表符处理,以及某些事情用本机代码编写。
谢谢
答案 0 :(得分:9)
您应该能够重用Web扩展中的内容脚本(但是您需要重写代码才能使用“背景”发送/接收消息)。 后台脚本必须用Swift或Objective-C重新编写。
您需要开发p:
您在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)
现在对此转换有官方支持:
答案 2 :(得分:5)
分享我的发现可能为时已晚,但是。
将网络扩展程序转换为Safari应用程序扩展程序的可能性的简短答案是 是。绝对有可能,但是很难做到。
我很难解决将Web扩展移植到Safari应用程序扩展的最佳方法。
移植Web Extension的问题
解决方案
写一些swift / objective-c代码是不可避免的。但是,使用快速/目标C编写桥代码以促进内容脚本和背景脚本之间的通信会简化生活。
在图中,内容脚本保持不变,背景脚本是通过创建Web视图来注入的。现在,从内容脚本收到的任何消息都将转发到webView背景脚本。另外,使用evaluvateJavascript
webView.evaluateJavaScript("chrome.runtime.id=function() { return "+ extensionId + " }")
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)
您实际上可以很容易做到这一点。
答案 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 和
此外,这是如何使用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函数。