検証環境のモバイルプッシュ通知の流れ
Appleのプッシュ通知サービス
Apple製品のプッシュ通知は、Apple Push Notification Service(APNs)と呼ばるAppleが提供するプッシュ通知サービスを利用して各デバイスにプッシュ通知を送ります。*1
プッシュ通知をする時は、Provider(要はサーバ)からAPNsに要求を送り、要求を受けたAPNsが指定されたデバイスにプッシュ通知を送付します。ProviderからAPNsへの要求では、通知先のデバイスの情報(デバイストークンという、デバイス+アプリの組み合わせで一意に生成されるトークン)とプッシュ通知の内容を送ります。
Amazon SNSモバイルプッシュとは
Amazon Simple Notification Service(SNS)の機能の一つで、様々な種類のモバイルデバイスのアプリケーションにプッシュ通知メッセージを送付するための抽象化されたサービスです。*2。
先ほどのAppleのプッシュ通知の概要図のProvider部分を担うサービスになります。
開発環境
この記事でのアプリケーション開発環境は以下の通りです
クライアントアプリケーションの開発と実行
APNs設定
クライアントアプリケーションの開発前に、APNsへの設定が必要になります(APNsへの登録には、Apple Developer Programへの登録(有償)が必要です)。下記の記事を参考にAPNsの設定を行い、開発用プロビショニングプロファイルと、NotificationsのSSL証明書作成と登録、を準備してください。
nopipi.hatenablog.com
簡易クライアントアプリ作成
ここでは、プッシュ通知に必要となるDeviceTokenをAPNsから取得するのみの簡易的なアプリを作成します。
取得したDeviceTokenは、この検証環境ではXcodeのデバイスコンソールにログ出力させた上で手動でSNSに登録させます。(本来はサーバを立ててそのサーバに通知させてSNS登録させます)
Xcodeでプロジェクトを作成しセッティングする
まずはXcodeでSwift開発のプロジェクトを作成して、必要なセッティングをします。
- (2) テンプレートの選択
- シンプルな”Single View App”を選択します。
- (3) プロジェクトの設定
- (4) 開発用プロビショニングプロファイルの設定
- ProjectNavigator(左のバー)のトップ(図のSnsTest部分)をクリック
- 「General」タブを選択
- 「Automatically manage signing」無効化する
- 下記2箇所に事前に作成した開発用プロビショニングプロファイルを指定します。
- Signing(debug)
- Signing(Release)
- プロビジョニングファイルは、事前にダウンロードしたもののインポートと、XcodeがDeveloperからダウンロードする、のいずれかの方法で設定します。
- (5) Notificationの有効化
- プロジェクトのターゲット設定画面のタグで「Capabilities」を選択
- 「Push Notifications」をONにする
Device Token取得コードの追加
アプリケーション起動時にデバイストークンを取得するコードを追加します。
- コードは、下記のQuiitaのコードにコンソール出力のコードを追加しました
// // AppDelegate.swift // SnsTest // // Created by NF on 2019/02/16. // Copyright © 2019 NopipiDevTeam. All rights reserved. // import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. // デバイストークンの要求 if #available(iOS 10.0, *){ /** iOS10以上 **/ let center = UNUserNotificationCenter.current() center.requestAuthorization(options: [.alert, .badge, .sound]) {granted, error in if error != nil { // エラー時の処理 return } if granted { // デバイストークンの要求 print("Get a device token.") UIApplication.shared.registerForRemoteNotifications() print("Done to get a device token.") } } } else { /** iOS8以上iOS10未満 **/ //通知のタイプを設定したsettingを用意 let setting = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil) //通知のタイプを設定 application.registerUserNotificationSettings(setting) //DevoceTokenを要求 application.registerForRemoteNotifications() } return true } // デバイストークン取得が成功した場合呼び出される関数 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = deviceToken.map { String(format: "%.2hhx", $0) }.joined() print("DeviceToken: " + token) } // デバイストークン取得が失敗した場合呼び出される関数 func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { // Try again later. print("Can not get Device token") } 以下略
- デバイストークン取得で重要なコードは以下の部分です
Amazon SNSへの登録とプッシュ通知の実行
Amazon SNSのアプリケーションプラットホーム作成
- マネージメントコンソールにログインし、Amazon SNSの画面に移動します
- 左のナビゲーションバーから「アプリケーション」を選択し
- 「プラットホームアプリケーショの作成」を選択
- 必要な情報を入力します
デバイストークン情報の登録
- (1)プラットフォームエンドポイントの作成
- (2)プッシュ通知の実行
- アプリケーションプラットフォームで、送信したいデバイスを選択します
- 送付したいペイロードを設定していPublishします
- ペイローの内容は以下の通りです。
{ "APNS_SANDBOX":"{\"aps\": {\"alert\": {\"title\":\"テスト\",\"body\":\"これはテストメッセージです\"}, \"sound\": \"default\", \"badge\":1}}" }
- こんな感じに送れます。
プッシュ通知のペイロードの詳細についてはこちらを参照
nopipi.hatenablog.com