見出し画像

【12/1】Keychain sharingでアプリ間で秘匿情報を共有してみよう

つい最近Marvelに入社したばかりの本柳(もとやなぎ)と申します。
アドベントカレンダー初日ということで、何か面白いことをしようと思ったのですが締め切りギリギリまでネタが温められず、オーソドックスなiOSアプリ開発についての話になりました。
面白いことを考えるのは難しいですね…


iOSアプリ開発ではKeychainというサービスを利用してアプリ内に秘匿情報を保存することが出来ます。
この機能を使ってAPIキーなどを保存しておくような実装がよく行われます。

実は、Keychainは端末に保存された秘匿情報を異なるアプリでも利用出来る機能が提供されています。
この機能によって、アプリAでAPIキーを取得しておくと、同様のAPIを利用するアプリBではAPIキーの取得をスキップするなんてことが可能になります。

実装してみよう

Keychainに保存した値を異なるアプリ間で共有するためには幾つかのステップを踏む必要があります。

設定

始めに、Keychainを共有するという設定を行います。
XcodeのProject設定画面からSigning & Capabilitiesを選び、Keychain sharingのCapabilityを追加します。

Capabilityを追加するとSigning & Capabilitiesの画面にKeychain sharingの項目が追加されるので、ここにKeychainを共有するための識別子を登録します。
bundleIdentifierなどで使うような逆ドメインの識別子にしておくのが無難かなと思います(com.company.app-keychain-groupみたいな感じ)。

実装

Foundationが提供する機能をそのまま利用すると実装が複雑になるため、[KeychainAccess](https://github.com/kishikawakatsumi/KeychainAccess)というライブラリを利用します。
SPMを利用してインストール出来るので、XcodeのPackage Dependencesからライブラリをインストールしましょう。

ここではKeychainにアクセスするためのクラスを1つ実装することにします。

import KeychainAccess
import Foundation

class SecretStorage {
    static let shared = SecretStorage()

    private let keychain: Keychain

    init() {
        guard let bundleIdentifier = Bundle.main.bundleIdentifier else {
            // エラー処理
        }
        self.keychain = Keychain(service: "\(bundleIdentifier)-keychain",
                                 accessGroup: "[TeamID].[capabilityで設定したkeychain共有の識別子]")
    }
}

`Keychain`を初期化する際に、accessGroupを指定する必要があります。
このaccessGroupには開発に利用するAppleAccountのTeamIDをPrefixに付ける必要があるため、TeamIDを調べて置く必要があります。

あとは適当に取得と保存処理を追加してあげれば完成です、とても簡単ですね!

class SecretStorage {
        .
        .
        .
    func get(key: String): String? {
        return self.keychain[key]
    }

    func set(key: String, value: String) {
        self.keychain[key] = value
    }
}

ということで、Keychain sharingを利用する方法についての紹介でした。
ここに書いた内容は公式サイトのドキュメントを参考にしているので、より詳しく知りたい方は公式のドキュメントも覗いてみるとより理解が深まるのではないかと思います。
https://developer.apple.com/documentation/xcode/configuring-keychain-sharing

おしまい

アドベントカレンダーに参加するときは何故かいつも初日の記事を担当することが多いのですが、記事を書く時間がないまま締め切りだけが迫ってきていつもヒーヒー言いながら書いています。
(たぶん、初日担当でなくても同じことしてる気はします;)
もう初老と言われる年齢なので、もっと計画的に、落ち着いた紳士のように物事に望みたいものです。

明日もきっと素敵な記事が上がってくることと思うので、楽しみですね!
ということで、Marvelアドベントカレンダー1日目の記事でした、ここまでお読み頂きありがとうございます!!


Marvelでは今年も『Marvelアドベントカレンダー2024』をやります🎄🎅Marvelのエンジニアがクリスマスまで記事のバトンを繋ぎます🦌🛷
是非毎日のお楽しみとしてご覧ください🎁
★Marvelのアドベントカレンダーはこちら
https://note.com/marvel_engineer/m/ma7e8d8ae4288

Marvelが少しでも気になった方は是非Wantedlyもご覧ください🙌


いいなと思ったら応援しよう!