カテゴリー
テックブログ

[Tech#5]FlutterでApple WalletのPassを自作する

この記事では、Apple Walletで自作のPassを発行するアプリを作ります。

下記を前提とします。

  • Flutterインストール
  • Apple Developer Program加入

証明書の発行

Passを作るためには、証明書が必要です。

Pass IDを作成

Apple Developer Programの「 Identifiers」ページを開きます。

https://developer.apple.com/account/resources/identifiers/list/passTypeId

新規作成ボタンを押して、Pass Type IDsを選択します。

任意の説明書きとIdentifierを入力します。

これで登録できます。

証明書を作成

Apple Developer Programの「 Certificate」ページを開きます。

https://developer.apple.com/account/resources/certificates/list

「Pass Type ID Certificate」を選択します。

任意の名前と、先程作成したPass Type IDを入力します。

CSRをアップロードします。

CSRはキーチェーンアクセスを開いて、「認証局に証明書を要求」から作成できます。

メールアドレスと通称を入力して、CSRを作成します。

作成したCSRをアップロードすれば、証明書の作成は完了です。

最後にダウンロードしておきます。

Passの自作

WalletCompanionFilesをダウンロード

Passのサンプルと、コンパイルするためのツールのセットです。

公式サイトからダウンロードします。

https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/index.html

自作.passフォルダの作成

SamplePassesフォルダ内の.passフォルダを一つコピーします。

自作Passを作るための元ネタになります。

それぞれのレイアウトの違いは以下を参考にします。

https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/PassKit_PG/Creating.html#//apple_ref/doc/uid/TP40012195-CH4-SW1

pass.jsonを編集

pass.jsonを開いて、passTypeIdentifierとteamIdentifierを記入します。

先程作成したPass Type IDと、自分のApple Developer AccountのTeam IDを入力します。

signpassをビルド

.passフォルダから実際に配布するPassを作成するためのツールです。

signpassフォルダのsignpass.xcodeprojをxcodeで開いてビルドします。

ビルドすると実行ファイルsignpassが作られるので、先程コピーした.passフォルダと同じディレクトリに移動します。

signpassを実行

ビルドしたsignpassをターミナルで実行します。

./signpass -p MyPass.pass

Mypassは任意のPassファイル名に変えます。

完了すると、Mypass.pkpassが作成されます。

実機でパスを開く

Flutterのライブラリを登録

ライブラリ「pass_flutter」と「flutter_wallet_card」を使用します。

pubspec.yamlファイルに以下を追記します。

dependencies:
    pass_flutter: ^2.0.1
    flutter_wallet_card: ^2.1.0

Passをダウンロードするコード

Passを開くアプリ画面のページで、以下を書きます。

import 'package:pass_flutter/pass_flutter.dart';
import 'package:flutter_wallet_card/flutter_wallet_card.dart';

PassFile passFile = await Pass().saveFromUrl(url: 'http://myserver/MyPass.pkpass');
    const MethodChannel _channel = const MethodChannel('flutter_wallet_card');
    dynamic result = await _channel.invokeMethod('addWalletCard', {'path': passFile.file.path});

このアプリを実機でビルドすれば、実機のApple Walletに自作Passを登録できます。

ただしPassをダウンロードするためのサーバーが必要になります。

ローカルサーバーを立てる

HomeBrewでPHPをインストールします。

brew install php

.pkpassがあるディレクトリで、下記コマンドを実行すればサーバーが立ちます。

php -S ローカルIPアドレス:ポート番号

ローカルIPアドレスはシステム設定>ネットワークから調べられます。(192.168.0.0など)

ポート番号は任意です。(8080など)

この例だと、http://192.168.0.0:8080/Mypass.pkpassから、.pkpassにアクセスできます。