🔮

Macで外部アプリからURLを開く時、内容に応じて開くユーザーやアプリを自動切り替えする

2022/12/12に公開

Chromeで仕事/個人と使うアカウントを切り替えたい時、ユーザープロファイルを登録しておけば、ブラウザ上でいつでも切り替えて使うことができ便利です。
ただ、Slackなどの外部アプリからURLを開こうとすると、「本当は仕事のユーザーとして開きたかったのに、個人のユーザーウィンドウから開かれてしまう」なんてことがよくあります。
私は今までそういった時は、一度開いたブラウザのアドレスをコピーして、目的のユーザーでChromeを開き直し、アドレス欄にURLを貼り付けて再度アクセスしなおす、という作業をしていました。大した作業ではないものの、地味に面倒です。

また、たとえばZoomのミーティングを開くときに、
共有されたURLをクリックする → ブラウザが立ち上がる → ブラウザ上でアプリを開くリンクをクリックする → デスクトップアプリが起動する
という謎の召喚儀式を行っていたりはしませんか?

そんな迷える召喚士には Finicky がきっと役立つので、本記事で紹介したいと思います。

Finickyとは

Finickyは、すべてのリンクまたはURLに対して「どのブラウザやプロファイルで開くか」というルールを設定できるmacOS用アプリケーションです。
ルールはJavaScriptで書くことが出来るので、特にWeb開発に慣れている人や、URLによって細かく制御したい人にはオススメのアプリです。

以下が公式のGitHubのプロジェクトページです。
https://github.com/johnste/finicky

導入方法

Homebrew を使って簡単にインストールできます。

brew install --cask finicky

インストール後、 .finicky.js という名前の設定ファイルをホームディレクトリに設置します (設定ファイルの内容は後述)。

最後に、Finicky をデフォルトのブラウザとして登録します。
これで、設定ファイルに書いた通りにブラウザやユーザープロファイルをURLに応じて振り分けて開いてくれるようになります。

.finicky.js の設定内容

Chromeで指定のユーザープロファイルとして開きたい場合

URLによって開くユーザーを切り替えたい場合、以下のように設定ファイルを記述します。

~/.finicky.js
module.exports = {
  defaultBrowser: "Google Chrome",
  handlers: [
    {
      match: [
        /^https?:\/\/calendar\.google\.com\/.*$/,
        /^https?:\/\/meet\.google\.com\/.*$/,
      ],
      browser: {
        name: "Google Chrome",
        profile: "Profile 1" // ユーザーB
      }
    },
    {
      match: [
        /^https?:\/\/github\.com\/.*$/,
      ],
      browser: {
        name: "Google Chrome",
        profile: "Default" // ユーザーA
      }
    },
  ]
}

match: で正規表現で書かれたURL一覧に対して、 browser: で指定したブラウザとプロファイルを使って開くことができます。
上記の内容は、GoogleカレンダーとGoogle Meetは Profile 2 のユーザーで開き、
GitHubは Default ユーザーとして開く場合の指定です。

対応するユーザーとプロファイルの確認方法

どのプロファイルがどのユーザーに紐付いているかは、Chromeの場合は各プロファイル毎に保存された設定ファイルから確認できます。
ただ、これを一つづつ確認するのはまぁまぁ面倒です。そこで、簡単に確認できるワンライナーを作りました。
以下のコマンドをターミナル上で実行することで、どのプロファイルでどのメールアドレスを使用しているかが確認できます。

ls -1 ~/Library/Application\ Support/Google/Chrome/**/Preferences | sed 's/\(.*\)/"\1"/' | xargs grep -oE 'account_info.*?email.*?,' | sed 's/.*Chrome\/\(.*\)\/Preferences.*email":\(.*\)/"\1": \2/'

実行すると、以下のような出力結果が返されます。

"Default": "user-a@example.com",
"Profile 1": "user-b@example.com",
"Profile 2": "user-c@example.com",

たとえば user-a@example.com のユーザとしてChromeを開きたいならば、
先程の .finicky.jsprofile 欄に Default を指定し、
user-b@example.com なら Profile 1 を指定する、といった使い方をすればOKです。

特定のURLはデスクトップアプリを直接開きたい場合

以下のような記述をすれば、ZoomやNotion、Figmaのファイルをブラウザではなくそれぞれのデスクトップアプリで直接開くように指定できます。

~/.finicky.js
module.exports = {
  defaultBrowser: "Google Chrome",
  handlers: [
    {
      match: /zoom.us\/j/,
      browser: 'us.zoom.xos',
    },
    {
      match: /notion.so/,
      browser: 'Notion',
    },
    {
      match: /figma.com\/file/,
      browser: 'Figma',
    },
  ]
}

基本的にURLから開くものであれば何でも対応できるはずですが、ブラウザとアプリとで異なるURLやAPIを使用しているサービスの場合、書き換えたり変換したりする記述が別途必要なため注意しましょう。

他にも便利な使い方がたくさん

たとえば「特定のアプリ上でURLがクリックされた場合はユーザーAで開く」といったように、URLを開く元となったアプリによって開き先を変える、といったことも出来るようです。
より細かな設定については、公式Wikiの設定ページを確認してみてください。
https://github.com/johnste/finicky/wiki/Configuration

また、設定ファイルがJavaScriptなので、Finickyを活用している世界中の人が自身の設定をGitHub上で公開していることも本アプリの魅力の一つです。
GitHubの検索窓から path:**/.finicky.js でコード検索すると様々な使い方が知れるので、参考にしてみると良いでしょう。
Code search results

アプリの紹介は以上です。便利な使い方を発見したら、ぜひ教えて下さいね!

Discussion