📱

Safari Web Extensions で既存の拡張機能をiOS 15で使用する方法

2021/07/03に公開

環境

開発環境: macOS Monterey bata 12.0 (public beta)
動作環境: iOS 15.0 beta (public beta)

操作

まず、以下のサイトからXcode 13 bataをインストールしてくる必要があります。
https://developer.apple.com/support/beta-software/

Xcode インストール後、以下のコマンドで

xcrun safari-web-extension-converter "/path/to/拡張機能のあるフォルダ"

既存の拡張機能をSafari用に変換します。

https://developer.apple.com/documentation/safariservices/safari_web_extensions/converting_a_web_extension_for_safari

コマンド実行後は自動的にXcodeが開き、拡張機能用のiOSアプリと変換された拡張機能が確認できます。

あとは、署名情報などを自分のものにして実行すれば動くはずです。簡単ですね。

補足

私自身が詰まった部分なのですが、manifest.jsonはSafariと他の拡張機能で異なる部分のサポートになっているらしく、正しく設定されていないとiOS側で拡張機能の設定をONにできないみたいです。

以下のページにサポートしていないmanifest.jsonの設定やJavascript APIが記載されているので確認したほうが良さそうです。

https://developer.apple.com/documentation/safariservices/safari_web_extensions/assessing_your_safari_web_extension_s_browser_compatibility

特に気をつけたいのはbackgroundpersistentの部分でここを設定していない、または有効にしていることです。

iOS側の設定 > Safari > Extensions
で拡張機能の設定を行える部分で以下のエラーがでている場合

ERRORS FOR "アプリ名"

Extension on iOS must have a non-persistent background page.

manifest.jsonbackground部分を以下のように変更する必要があります。

  "background": {
    "persistent": false,
    "scripts": [
      "scripts/background.js"
    ]
    ...
  },

ソースコードが公開されているOSS系の拡張機能を動かした感じ、この辺りを修正すれば動くと思います。

ちなみにadblocker系に関しては、webRequestという通信の制御が使えないので軒並み動かないはずです。
webRequestが使えなくなった chrome の manifest V3 に準拠した拡張機能であれば動くと思います。(safari v14.X で動いている、Adguard for Safari (Mac) などであれば動くと思ったのですが、小手先の変更ではうまく動かなかったです。。)

forkして、OSSに貢献するのも良いと思います。

以上となります。参考になりましたら幸いです。

Discussion