web-dev-qa-db-fra.com

Convertir l'extension Web en extension d'application Safari

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

9
Bojan V

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:

  • une application hôte Mac (qui sera un compagnon de l'extension): Swift ou Objective-C (cette application doit avoir des fonctionnalités minimales pour passer Apple review - vérifiez les Apple directives pour Mac Apps)
  • l'extension: en Swift ou Objective-C + HTML/JS (comme pour les autres navigateurs) Le code en Swift (ou Obj-C) pour l'extension est l'équivalent de la page d'arrière-plan que vous avez dans les extensions Web. Il contrôlera le bouton de la barre d'outils, le cycle de vie de l'extension et pourra parler avec des scripts injectés.

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).

10
Emmanuel Sellier

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

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

En outre, voici le guide officiel comment convertir Chrome en module complémentaire Firefox à l'aide de WebExtensions.

0
abielita

Tout ne peut pas être écrit en Swift. Par exemple, j'ai essayé d'appeler dylib depuis extensionHandler, mais cela a échoué.

0
Йохан К.

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.

0
addeective.com

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.

0
RawiSader