[Swift]Appleウォレットでマイナンバーカード利用開始によるアプリの実装を言及する

## はじめに

Appleで日本のマイナンバーカードがウォレットで取り込まれることが発表されたのでアプリ実装について言及します。2025年春以降になるそうです。

```引用
Appleは、日本のデジタル庁と協力し、来春の後半から日本に住むみなさんがAppleウォレットでマイナンバーカードを利用できるよう準備を進めています。Appleウォレットの身分証明書機能を米国外で展開するのは日本が初となります。この機能によって日本に住むみなさんは、iPhoneのAppleウォレットにマイナンバーカードをシームレスに追加し、物理的なカードと同じようにコンビニエンスストアで公的な証明書等を発行したり、「マイナポータル」iOSアプリにアクセスしてオンラインの行政サービスを受けるなど、常にiPhoneのセキュリティ、利便性とともに、安全に利用できるようになります。
「Appleウォレットの身分証明書機能の米国外への展開は、従来の物理的な財布を、簡単かつ安全で、プライベートなモバイルウォレットに置き換えるという私たちのビジョンにおいて重要なステップです。私たちは、来春の後半からAppleウォレットでマイナンバーカードを利用できるようにして、iPhoneに組み込まれたセキュリティとプライバシー保護の機能を最大限に活用しながら、身分証明書を提示するシームレスで便利な方法を日本に住むみなさんに提供することを大変嬉しく思います」と、AppleのApple PayおよびAppleウォレット担当バイスプレジデント、ジェニファー・ベイリーは述べています。
「岸田文雄総理大臣とApple社CEOティム・クック氏のリーダーシップのもと、マイナンバーカードの機能をスマートフォンへ搭載するという大胆な取組に、Apple社とともに協働していくこととなり、大変嬉しく思っています。現在、日本のIDカードであるマイナンバーカードは、1億人以上の国民のみなさまに申請いただき、様々な官民のオンラインサービスをはじめ、約6万を超えるコンビニで行政サービスを受けられるなど、日常生活で広く利用され、災害や救急でも利用できます。デジタル庁は、スマートフォンを基盤とした世界をリードする安全で便利なデジタル社会を、構築してまいります」と、河野太郎デジタル大臣は述べています。
```

引用元：https://www.apple.com/jp/newsroom/2024/05/apple-announces-first-international-expansion-of-ids-in-apple-wallet-in-japan/

## 実際のマイナンバーカードと比較したユーザーエクスペリエンス
ユーザーからするとAppleウォレットに取り込まれるということは今まで物理的マイナンバーカードを持ち歩いていたものが必要なく、スマホをかざすと今までのマイナンバーカードをかざすのと同じ状況になるということで楽ちんです。そしてカードを持ち歩かない分、マイナンバーカードを落とした時の個人情報流出のリスク軽減になりそうです（スマホ端末のためロックもかかるため）。
病院の保険証でマイナンバーカードを提出していたものも不要になるため、４情報（氏名、性別、生年月日、住所）と個人番号が掲載されたものを直接渡すことや機械にかざすことがなくなるため、ショルダーハッキングやスタッフの盗み身など物理的にできなくなるのでセキュアさはリアルでも上がります。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/ba443016-08d9-ff06-7ca6-0f1e94937cdb.png)
引用元:https://www.digital.go.jp/assets/contents/node/information/field_ref_resources/ed0adc91-4d86-4cf6-a551-4961a07b00a2/c0c35fbb/20240531_news_smartphone-certification_01.pdf

## マイナンバーカードの読み取りアプリのユーザーエクスペリエンス
マイナンバーカードをアプリ上で読み込むアプリとして例えば、マイナポータルなどでログインする際に利用者証明書電子証明書パスワード（４桁のもの）を入れてマイナンバーカードを端末に接触させてログインしていた面倒な手間がウォレットにマイナンバーカードを登録することでなくなります。これで端末だけで完結してログインができるようになるため非常に煩わしさがなくなり便利になります。

## マイナンバーカード読み取りアプリへの影響
今後は物理的なマイナンバーカード利用者と、iPhoneのウォレットを使ったマイナンバーカード読み取りの２パターンが存在する状況になるため、実装側からすると手間が発生することになります。みんながiPhoneユーザーでウォレットを登録しているとは限らないからです。

そのため２パターンの分岐で実装が必要になるはずです。

## iPhoneウォレットを使ったアプリについて

Appleのドキュメントで関連APIが追加されました。passkitを使いウォレットのマイナンバーカードにアクセスするようです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/7895f235-99a7-ceee-feb1-590e69ec43b5.png)

引用元：https://developer.apple.com/documentation/passkit_apple_pay_and_wallet

## iPhoneウォレットを使ったアプリの実装方法を言及

正確には判断しかねるため、ドキュメントのAPIから予想を含めて実装について言及します。

アプリでマインバーカードの情報で署名を行う場合は、APIを呼び出す必要があります。
そして公的個人認証、利用者証明書電子証明書などでは実装が異なります。

公的個人認証JPKIを使った場合も利用者証明書電子証明書パスワード（４桁のもの）を使った場合も流れとしては、APIを呼び出しウォレットアプリからマイナンバーを呼び出し顔認証を行い、その後にそれぞれのパスワードを入れる必要がありそうです。

通常のマイナンバーカードをかざしてパスワードを入れるフローが、マイナンバーカードをかざすところが省略されウォレットから読み取るのみでそれ以降のフローは変わらなそうです。

PKJapanIndividualNumberCardMetadataを使いパスワードを入力するメソッドがありました。

おそらくjpki用のパスワード取得プロパティ
https://developer.apple.com/documentation/passkit_apple_pay_and_wallet/pkjapanindividualnumbercardmetadata/4360337-authenticationpassword

おそらく利用者証明書電子証明書パスワード（４桁のもの）※券面事項入力補助暗証番号も含む？
https://developer.apple.com/documentation/passkit_apple_pay_and_wallet/pkjapanindividualnumbercardmetadata/4360341-signingpassword

公的個人認証(jpki)の場合は、おそらくこんな感じの実装かと思います
```swift
func jpki() {
    let lib = PKPassLibrary()
    if let passes = lib.passes(of: .idCard), let pass = passes.first(where: { $0.passTypeIdentifier == "com.apple.japan.individualnumbercard" }) {
        if let metadata = pass.userInfo as? PKJapanIndividualNumberCardMetadata {
            metadata.authenticationPassword = "JPKI暗証番号"
            // 署名してコールバックで返してあげたら良さそう？
        }
    }
}
```

券面事項入力補助の場合は、おそらくこんな感じの実装かと思います
```swift
func myNumberCardRead() {
    let lib = PKPassLibrary()
    if let passes = lib.passes(of: .idCard), let pass = passes.first(where: { $0.passTypeIdentifier == "com.apple.japan.individualnumbercard" }) {
        if let metadata = pass.userInfo as? PKJapanIndividualNumberCardMetadata {
            metadata.signingPassword = "券面事項暗証番号"
            // 4情報取得
            let info = metadata.getBasicInfo()
            print("氏名: \(info.name)")
            print("住所: \(info.address)")
            print("生年月日: \(info.birthdate)")
            print("性別: \(info.gender)")
        }
    }
}
```

## iOS18ベータ版
ウォレットにマイナンバーカードを登録できるのはiOS18以降のみです。
ios18のベータ版が2024年6月11日（日本時間）でリリースされました。
おそらくここではまだマイナンバーカードをウォレットには追加できないはずです。
実際の動作確認などはまだしばらくはできなそうですね。ただAPIのテスト的な実装であればできそうなので先を越して準備などはいいかもです。
と言いつつ、APIがあるのでウォレットの登録もできるのかな？でないと意味ないような。降参。

## さいごに
とても簡単に実装でき物理マイナンバーカードと同様にアプリに取り込めそう感が出てます。
いずれにせよ実装は物理マイナンバーカードとウォレットマイナンバーカードのパターンが出るため、分岐が必要になる分、実装で気をつける点は増えそうな印象です。

記事掲載時点ではまだわからないので情報がもう少し出てきたら追記していこうと思います。