J'ai des extensions Web qui fonctionnent actuellement sur Chrome, Firefox et Opera. Maintenant, je me demande s'il existe un moyen d'utiliser le même code pour construire Safari App Extension, peut-être quelque chose comme PhoneGap (envelopper tout le code JS existant dans le projet Safari App Extension) ou il y a des limitations comme la gestion des onglets pour javascript et certaines choses doivent simplement être écrit en code natif.
Merci
Vous devriez être en mesure de réutiliser des scripts de contenu à partir de vos extensions Web (mais vous devez réécrire le code pour pouvoir envoyer/recevoir des messages avec "arrière-plan"). Le script d'arrière-plan devra être réécrit en Swift ou Objective-C.
Vous devez développer:
Vous avez un (petit) exemple sur Apple: https://developer.Apple.com/documentation/safariservices/safari_app_extensions?changes=_2&language=objc
Vous ne devriez plus utiliser Extension Builder (accessible à partir du menu Développeur dans Safari) car il s'agit uniquement des extensions héritées (JS pur). Vous devez donc entrer dans XCode.
Dernière chose, mais non des moindres ... Les extensions d'application Safari, par rapport aux extensions héritées de Safari, sont "un peu" plus limitées (par exemple, vous ne pourrez pas ouvrir la fenêtre contextuelle de la barre d'outils par programmation, comme avec Chrome extensions Web en fait).
Vous pouvez vous référer à ceci lien sur la façon de convertir Google Chrome Extension en extension Firefox ou Safari.
Il y a actuellement un peu de travail manuel à faire.
https://github.com/kritollm/chrome-extension-api-for-safari-and-firefox
Après avoir écrit cet article pour la première fois, j'ai eu connaissance de deux autres projets très similaires.
https://code.google.com/p/adblockforchrome/source/browse/trunk/port.js et
En outre, voici le guide officiel comment convertir Chrome en module complémentaire Firefox à l'aide de WebExtensions.
Tout ne peut pas être écrit en Swift. Par exemple, j'ai essayé d'appeler dylib depuis extensionHandler, mais cela a échoué.
Si nous parlons d'une extension Safari App et non d'une extension safari héritée (déconseillée dans Safari v12), alors je comprends que le script d'arrière-plan doit être réécrit dans Swift. En ce qui concerne les scripts de contenu, ils sont toujours dans JS mais tous les messages écrits avec chrome les appels d'API doivent être réécrits à l'aide des API de l'application Safari.
Comme ci-dessus, les scripts de contenu peuvent rester les mêmes que les bundles que vous créez dans votre Firefox et les extensions Chrome. Vous n'aurez qu'à l'inclure dans votre plist. Pour éviter de réécrire toute la logique d'arrière-plan dans Swift, j'ai utilisé une bibliothèque appelée JavascriptCore
fournie par Apple. Cela vous permet de créer un contexte JavaScript et de transmettre des données de l'arrière-plan Swift à votre arrière-plan JavaScript).
Par exemple: safariExtensionHandler.Swift
a une fonction appelée messageReceived
. Cette fonction peut appeler une fonction JavaScript globale dans votre code à partir de Swift utilisant JavascriptCore
.