[watchOS 3] watchOS アプリを Apple Pay に対応させるために必要な実装について

2016.10.25

はじめに

こんにちは。モバイルアプリサービス部の平屋です。前回の記事に引き続き、Apple Pay についての情報を紹介していきます。

本記事では watchOS アプリを Apple Pay に対応させる場合に必要な実装を解説していきます。

Apple Pay の概要や環境構築などについては以下の記事などをご覧ください。

また、iOS アプリを Apple Pay に対応させる場合に必要な実装については以下の記事で解説しています。

watchOS アプリで実装しなければならないものは基本的に iOS の場合と同じですので、本記事では iOS と watchOS アプリとで実装内容が異なる部分を中心に解説していきます。

検証環境

Xcode Version 8.0 (8A218a)

Apple Pay の利用可否をチェックする

iOS の場合は PKPaymentAuthorizationViewController を使用しましたが、watchOS アプリでは PKPaymentAuthorizationController を使用します。

PKPaymentAuthorizationViewControllerPKPaymentAuthorizationController の役割は同じです。watchOS アプリ等のビューコントローラーが使用できない環境では PKPaymentAuthorizationController を使用します。

両クラスとも同様のメソッドが用意されているので使い方はほぼ同じです。

// Apple Pay 自体が使用できる状態かどうか
if PKPaymentAuthorizationController.canMakePayments() {
    // Apple Pay に対応している
} else {
    // Apple Pay に対応していない
}

// クレジットカードが「Wallet」アプリに登録済みかどうか
if PKPaymentAuthorizationController.canMakePayments(usingNetworks: PKPaymentRequest.availableNetworks()) {
    // 利用可能な決済ネットワークが 1 つ以上ある場合 (クレジットカードが登録済みの場合)
} else {
    // 利用可能な決済ネットワークがない場合
}

Apple Pay ボタンを表示する

iOS の場合は PKPaymentButton を使用しましたが、watchOS では WKInterfacePaymentButton を使用します。

WKInterfacePaymentButton には typestyle プロパティがなく、見た目の変更はできません。

class InterfaceController: WKInterfaceController {

    @IBOutlet var payButton: WKInterfacePaymentButton!

    // ...
}

動作結果

以下の外観のボタンが表示されます。

ios-10-applepay-for-developers-4-01

ペイメントシートを表示させる

PKPaymentAuthorizationController を作成し、present(completion:) メソッドを使用してペイメントシートを表示させます。

func pay() {
    // ...

    // Display our payment request
    let controller = PKPaymentAuthorizationController(paymentRequest: request)
    controller.delegate = self
    controller.present(completion: nil)
}

動作結果

ペイメントシートの上部には、金額と支払先のみ表示されます。サイドボタンをダブルクリックすると、決済処理が開始されます。

ios-10-applepay-for-developers-4-02

スクロールすると、カード選択 UI や金額の内訳を見る事ができます。カードは横スワイプで選択できます。

ios-10-applepay-for-developers-4-03

ペイメントシートまわりのイベントをハンドリングする

任意のクラスを PKPaymentAuthorizationControllerDelegate に適合させて、ペイメントシートまわりのイベントをハンドリングします。

PKPaymentAuthorizationControllerDelegate には PKPaymentAuthorizationViewControllerDelegate と同様のメソッドが用意されています。

// ユーザーがペイメントリクエストを承認した時に呼ばれる
func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController,
                                    didAuthorizePayment payment: PKPayment,
                                    completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
    print("didAuthorizePayment!")
    completion(.success)
}

// 決済の全ての処理が終わった時、または決済がキャンセルされた時に呼ばれる
func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
    print("DidFinish!")
}

さいごに

本記事では watchOS アプリを Apple Pay に対応させる場合に必要な実装を解説しました。Apple Watch の制限や使用される環境に応じて、iOS 版とは違うものになっていることがよくわかりました。

watchOS アプリで Apple Pay に対応させたい方の参考になれば幸いです!

参考資料