iOS用SDKでPush配信をしたい

はじめに

SDKによるPush通知配信するにはSDKの導入が必要です
導入手順の詳細については 以下の記事を参照ください

Push通知の実装イメージ

iOS端末で「Push通知」を受信したときのイメージを、「Push通知」「リッチ通知(画像付きPush通知)」の場合でそれぞれご紹介します。

【iOS端末で「Push通知」を受信したときの参考イメージ】

【iOS端末で「リッチ通知」を受信したときの参考イメージ】

OSのバージョンや機種によって見栄えが異なることがあります。

Push通知を利用する

ログ取得用APIの利用

iOS版SDKのログ取得用クラスにて公開されているAPIのうち、Push通知で利用するAPIは以下となっております。

API 送信内容
Tracker.relationalKey データ統合のためのレコードを一意に特定するカラムの名前
Tracker.relationalValue データ統合するためのレコードを一意に特定するカラムの値
FCMトークンを紐付ける

Push通知を利用するために計測ログとしてFCMトークンを送信する必要があります。

Swiftの場合はこちらObjective-Cの場合はこちら
// 省略
let tracker = Tracker.getInstance()

//キーとして notificationId(※文字列、固定)をセットする
tracker.relationalKey = "notificationId"

//バリューに実際のFCMトークンをセットする
tracker.relationalValue="FCMトークンの値"

let screenViewBuilder = ScreenViewBuilder()
tracker.send(screenViewBuilder) //ログ出力する
// 省略

FCMトークンの値はb→dashSDKが提供するプロパティからも取得が可能です。

/* 省略 
let tracker = Tracker.getInstance()

//キーとしてnotificationId(※文字列、固定)をセットする
tracker.relationalKey = "notificationId"

//SDKのプロパティからFCMトークンの値を取得する
  let fcmTokenId = BDashNotification.lastSyncTokenId
//バリューにSDKのプロパティから取得したFCMトークンをセットする
tracker.relationalValue= fcmTokenId

let screenViewBuilder = ScreenViewBuilder()
tracker.send(screenViewBuilder) //ログ出力する
// 省略
// 省略
Tracker* tracker = [Tracker getInstance];

//キーとして notificationId(※文字列、固定)をセットする
tracker.relationalKey= @"notificationId";

//バリューに実際のFCMトークンをセットする
tracker.relationalValue=@"FCMトークンの値";
ScreenViewBuilder* screenViewBuilder = [[ScreenViewBuilder alloc]init];
[tracker send:screenViewBuilder]; //ログ出力する。

// 省略

Push通知用API一覧

iOS版SDKのPush通知クラス(BDashNotification)にて公開されているAPIは以下となっております。

Swiftの場合はこちらObjective-Cの場合はこちら
API 概要
BDashNotification.getInstance() シングルトンのオブジェクトを取得する。
BDashNotification.registerNotification() b→dashサーバーへトークンを登録する。
第1引数:コールバックを受け取るクロージャ。
BDashNotification.cancelNotification() b→dashサーバーからトークンの登録を解除する。
第1引数:コールバックを受け取るクロージャ。
BDashNotification.isRegisterNotification() 端末でPush通知が許可されているか判定する。許可されているならtrueを返す。
BDashNotification.deleteAllNotifications() (iOS7) 通知センターにある呼び出し元アプリの通知を全て消す。
(iOS8以降) 呼び出しても通知センターにある 呼び出し元アプリの通知は消されない。
BDashNotification.didRegisterUserNotification() AppDelegateにてdidRegisterUserNotificationが呼ばれた時に呼び出すAPI。
BDashNotification. didRegisterRemoteNotificationWithDeviceToken() AppDelegateにてdidRegisterRemoteNotificationWithDeviceTokenが呼ばれた時に呼び出すAPI。
BDashNotification. didReceiveRemoteNotification() AppDelegateでdidReveiveRemoteNotificationが呼ばれた時に呼び出すと、通知内容のアラートを表示する。
BDashNotification. applicationWillEnterForeground() AppDelegateでapplicationWillEnterForegroundが呼ばれた時に呼び出すと、端末のPush通知状態が以前と変わっていた時にb→dashサーバーにトークンを登録(または解除)する。
BDashNotification.lastSyncTokenId 現在のトークンIDを返すプロパティ。未取得時にはnilを返す。
BDashNotification.enableSound アクティブ時に通知を受取った場合、サウンドを鳴らすかどうかを設定するプロパティ。trueならばサウンドを鳴らす。
BDashNotification.soundFileName Push通知の通知音に使うサウンドファイル名。システムサウンド (/System/Library/Audio/UISounds/)内のファイル名を指定する。
BDashNotification.enableVibration アクティブ時に通知を受取った場合、バイブレーションを振動させるかどうかを設定するプロパティ。trueならばバイブレーションを振動させる。
BDashNotification.getInstance() シングルトンのオブジェクトを取得する。
API 概要
BDashNotification.getInstance() シングルトンのオブジェクトを取得する。
BDashNotification.registerNotificationAndReturnError() b→dashサーバーからトークンの登録する。
第1引数:エラーを受取るオブジェクト
第2引数:コールバックを受け取るクロージャ
BDashNotification.cancelNotificationAndReturnError() b→dashサーバーからトークンの登録を解除する。
第1引数:エラーを受取るオブジェクト
第2引数:コールバックを受け取るクロージャ
BDashNotification.isRegisterNotification() 端末でPush通知が許可されているか判定する。許可されているならtrueを返す。
BDashNotification.deleteAllNotifications() (iOS7) 通知センターにある呼び出し元アプリの通知を全て消す。
(iOS8以降) 呼び出しても通知センターにある呼び出し元アプリの通知は消されない。
BDashNotification.didRegisterUserNotification() AppDelegateにてdidRegisterUserNotificationが呼ばれた時に呼び出すAPI。
BDashNotification. didRegisterRemoteNotificationWithDeviceToken() AppDelegateにてdidRegisterRemoteNotificationWithDeviceTokenが呼ばれた時に呼び出すAPI。
BDashNotification. didReceiveRemoteNotification() AppDelegateでdidReveiveRemoteNotificationが呼ばれた時に呼び出すと、通知内容のアラートを表示する。
BDashNotification. applicationWillEnterForeground() AppDelegateでapplicationWillEnterForegroundが呼ばれた時に呼び出すと、端末のPush通知状態が以前と変わっていた時にb→dashサーバーにトークンを登録(または解除)する。
BDashNotification.lastSyncTokenId 現在のトークンIDを返すプロパティ。未取得時にはnilを返す。
BDashNotification.enableSound アクティブ時に通知を受取った場合、サウンドを鳴らすかどうかを設定するプロパティ。trueならばサウンドを鳴らす。
BDashNotification.soundFileName Push通知の通知音に使うサウンドファイル名。システムサウンド (/System/Library/Audio/UISounds/)内のファイル名を指定する。
BDashNotification.enableVibration アクティブ時に通知を受取った場合、バイブレーションを振動させるかどうかを設定するプロパティ。trueならばバイブレーションを振動させる。
BDashNotification.getInstance() シングルトンのオブジェクトを取得する。
スレッドセーフについて
Push通知を提供する BDashNotification はスレッドセーフではありません。複数のスレッド(メインスレッド、ワーカースレッド)から同時に書き込む処理を行う場合、排他制御をする必要があります。

トークンの登録/解除

Push通知の有効、無効状態をb→dashサーバーへ登録します。

トークンの登録/解除に必要な要素
 Push通知許可ダイアログの表示

SDKではインストール後、初回にPush通知クラスを呼び出す事によって通知ダイアログを表示することができます。任意の画面で呼び出すことで、ユーザーへ促すタイミングを制御することができます。

Swiftの場合はこちらObjective-Cの場合はこちら
〜 省略
BDashNotification.getInstance()
〜 省略
〜 省略
[BDashNotification getInstance];
〜 省略
ユーザーの承諾

Push通知をアプリで受取れるようにするには、ユーザーにPush通知を送信する事を「承諾」してもらう必要があります。許可されなかった場合は、再度許可されるまでSDKはb→dashサーバーと通信を行いません。

以下の画像が、Push通知許可ダイアログです!

Push通知登録

登録するにはregisterNotificationを呼び出します。

登録に成功すると、サーバーからアプリにPush通知が届くようになります。サーバーとの通信が終わると、レスポンスを非同期(クロージャ)で取得できます。レスポンスは以下の2種類です。

レスポンス 詳細
BDashNotification.ENABLE 登録成功
BDashNotification.ERROR エラー(通信エラー、通信タイムアウト等)

レスポンスがエラーだった場合は通信状態が回復してからのリトライ処理等、アプリに適した対応を行う必要があります。

処理中(クロージャのコールバックが呼ばれるまで)に再度APIを呼び出した場合は以下の対応する必要があります。

Swiftの場合はこちらObjective-Cの場合はこちら

BDashBusyExceptionでは例外がスローされます。そのためdo try catch構文を書いて例外を補足する必要があります。

〜 省略
do {
try BDashNotification.getInstance().registerNotification(completion: {(type: String) -> Void in
// Push通知登録に対するb→dashサーバからのレスポンス
})
}catch{
// BDashBusyException例外キャッチ
}

〜 省略

registerNotificationAndReturnErrorを呼び出す際、第一引数にnilで初期化したNSErrorオブジェクトの参照を渡します。処理中に呼び出した場合はNSErrorオブジェクトにBDashExceptionが入ります。

Push通知登録キャンセル

登録をキャンセルするにはcancelNotificationを呼び出します。

サーバーとの通信が終わると、レスポンスを非同期(クロージャ)で取得できます。レスポンスは以下の2種類です。

レスポンス 詳細
BDashNotification.DISABLE キャンセル成功
BDashNotification.ERROR エラー(通信エラー、通信タイムアウト等)

レスポンスがエラーだった場合は通信状態が回復してからのリトライ処理等、アプリに適した対応を行う必要があります。

処理中(クロージャのコールバックが呼ばれるまで)に再度APIを呼び出した場合は、以下の対応を行う必要があります。

Swiftの場合はこちらObjective-Cの場合はこちら

BDashBusyException例外がスローされます。そのためdo try catch構文を書いて例外を補足する必要があります。

〜 省略
do {
try BDashNotification.getInstance().cancelNotification(completion: {(type: String) -> Void in
// Push通知登録キャンセルに対するb→dashサーバからのレスポンス
})
}catch{
// BDashBusyException例外キャッチ
}

〜 省略

cancelNotificationAndReturnErrorを呼び出す際、第一引数にnilで初期化したNSErrorオブジェクトの参照を渡します。処理中に呼び出した場合はNSErrorオブジェクトにBDashExceptionが入ります。

トークンの登録/解除の実例

以下はSDKを導入する際にAppDelegate内に追加するサンプルコードです。言語に応じた下記コードをそのまま導入することで AppDelegate への組み込みは完了となります。

Swiftの場合はこちらObjective-Cの場合はこちら
〜 省略
// ユーザーにPush通知が許可された通知(iOS8以降)
@available(iOS 8.0, *)
func application(_ application: UIApplication,
didRegister notificationSettings:UIUserNotificationSettings) {
BDashNotification.getInstance().didRegisterUserNotificationSettings(notificationSettings)
}
// APNsデバイストークン受信時
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
BDashNotification.getInstance().didRegisterForRemoteNotificationsWithDeviceToken(deviceToken as Data)
}
// アプリがアクティブになった時
func applicationWillEnterForeground(_ application: UIApplication) {
if !BDashNotification.alreadyDisplayDialogBox {
return
}
BDashNotification.getInstance().applicationWillEnterForeground( {type in
if type == BDashNotification.ERROR {
}
})
}
// Push通知受信時(フォアグラウンド)
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
BDashNotification.getInstance().didReceiveRemoteNotification(userInfo, Active: UIApplication.shared.applicationState == .active, fetchCompletionHandler: {_ in })
}
// Push通知受信時(バックグラウンド)
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
BDashNotification.getInstance().didReceiveRemoteNotification(userInfo, Active: UIApplication.shared.applicationState == .active, fetchCompletionHandler: completionHandler)
}

〜 省略
〜 省略
// ユーザーにPush通知が許可された通知(iOS8以降)
@available(iOS 8.0, *)
func application(_ application: UIApplication,
didRegister notificationSettings:UIUserNotificationSettings) {
BDashNotification.getInstance().didRegisterUserNotificationSettings(notificationSettings)
}
// APNsデバイストークン受信時
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
BDashNotification.getInstance().didRegisterForRemoteNotificationsWithDeviceToken(deviceToken as Data)
}
// アプリがアクティブになった時
func applicationWillEnterForeground(_ application: UIApplication) {
if !BDashNotification.alreadyDisplayDialogBox {
return
}
BDashNotification.getInstance().applicationWillEnterForeground( {type in
if type == BDashNotification.ERROR {
}
})
}
// Push通知受信時(フォアグラウンド)
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
BDashNotification.getInstance().didReceiveRemoteNotification(userInfo, Active: UIApplication.shared.applicationState == .active, fetchCompletionHandler: {_ in })
}
// Push通知受信時(バックグラウンド)
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
BDashNotification.getInstance().didReceiveRemoteNotification(userInfo, Active: UIApplication.shared.applicationState == .active, fetchCompletionHandler: completionHandler)
}

〜 省略
Push通知を利用するためには、b→dashSDKの導入が必要です

Push通知の配信において、貴社の保持しているトークンを利用することはできません。Push通知を利用するにあたり、b→dashSDKを導入する主な理由は以下の2つです。

1.b→dashSDKを経由しないと、配信対象者とみなされない
b→dashでは「配信可能な対象者」について、エンドユーザーごとにアプリで設定される通知受信可否の設定を見ています。通知受信可否の設定の反映はb→dashSDKを通じて行っているため、SDKを導入しないと、FCMトークンと受信可否の紐づけがb→dash上で行われず、配信ができません。

2.配信後の効果測定ができない
配信後の開封確認など、効果測定のためのログをb→dashSDKを通じて取得しているため、効果測定ができず、配信実績レポートが見れません。

Push通知を受信する

アクティブ時の受信について

アプリがアクティブ状態の時にPush通知を受取った時に、AppDelegate内の該当するデリゲートメソッドが呼び出されます。その中で「BDashNnotification.didReceiveRemoteNotification()」を呼び出すと通知内容のアラートが表示されます。この時に出るアラートはSDKの設定により、通知音(SDK内)が鳴り、バイブレーション(SDK内)が振動します。また、画面遷移等の制御用パラメータとして、Push通知のデータに「param」という値が含まれています。

通知の受信について

Push通知を受信した際に「BDashNnotification.didReceiveRemoteNotification()」を呼び出すと、通知内容のb→dash提供のアラートダイアログを表示させる事ができます。独自のアラートを表示させる場合は、本メソッドを呼び出さずにUIを実装することで自由に表示が可能です。その他に、b→dashの画面で設定できるPush通知のパラメータを元に、アプリ内の特定の画面へ遷移させたり、WebView画面を表示するなどの実装が可能です。以下にサンプルコードを紹介します。

Swiftの場合はこちらObjective-Cの場合はこちら
if let tmpParam = userInfo["param"] as? String,
let param = tmpParam.removingPercentEncoding {

// 起動パラメーターを判断して画面遷移させる( WebView 画面、アプリ内の画面など)
if param == "判定したい文字列" {
    // この中にparamの判定後の画面遷移の処理やWebviewへの遷移の処理を記述
  }

}
NSString* param = [userInfo objectForKey:@"param"];
if (param != nil) {
param = [param stringByRemovingPercentEncoding];

// 起動パラメーターを判断して画面遷移させる( WebView 画面、アプリ内の画面など)
if (param == @"判定したい文字列") {
    // この中にparamの判定後の画面遷移の処理やWebviewへの遷移の処理を記述
  };

}
バックグラウンド時の受信について

アプリがバックグラウンド状態の時にPush通知を受取り、通知センターに表示された自アプリの通知からアプリを起動すると、AppDelegate内の該当するデリゲートメソッドが呼び出されます。その中でBDashNnotification. didReceiveRemoteNotification()を呼び出すと、通知内容のアラートが表示されます。この時に出るアラートにはSDKの設定に関わらず、通知音(SDK内)が鳴らず、バイブレーション(SDK内)も動作しません。

システム設定のサウンド、バイブは動作する可能性があります。

また画面遷移等の制御用パラメータとして、Push通知のデータに「param」という値が含まれています。以下はバックグラウンドで通知を受信した後にトラッキングデータを送信するサンプルコードです。Push通知から起動した時のデータ集計を行うために組み込む必要があります。

Swiftの場合はこちらObjective-Cの場合はこちら
〜 省略
// 非アクティブから起動した時にトラッキングデータをsendする
if UIApplication.shared.applicationState != .active {

// 独自IDを有効にする場合は、以下のコードを有効にします
Tracker.getInstance(UUID:customId)

// paramにはURLデコードした値を渡す必要があります
Tracker.getInstance().setBootTypeWithStringValue(Tracker.BOOT_PUSH, value: param)
Tracker.getInstance().screenName = "任意のスクリーン名"; //send Tracker.getInstance().send(ScreenViewBuilder()) }
〜 省略
// 非アクティブから起動した時にトラッキングデータをsendする
if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {

// 独自IDを有効にする場合は、以下のコードを有効にします
// [Tracker getInstance:customId];

// paramにはURLデコードした値を渡す必要があります
[[Tracker getInstance] setBootTypeWithStringValue:Tracker.BOOT_PUSH value: param];
[Tracker getInstance].screenName = @"任意のスクリーン名";
//send
[[Tracker getInstance] send:[[ScreenViewBuilder alloc]init]];
}
 通知音、バイブレーションについて

アクティブ時に通知を受信した際の通知音の有効、無効を設定するにはBDashNotification.enableSoundに「true」または「false」を設定します。同様に、バイブレーションの有効、無効を設定するにはBDashNotification.enableVibrationに「true」または「false」を設定します。

Swiftの場合はこちらObjective-Cの場合はこちら
〜 省略
// サウンドを有効にする場合はtrue
BDashNotification.getInstance().enableSound = true

// バイブレーションを有効にする場合はtrue
BDashNotification.getInstance().enableVibration = true

〜 省略
〜 省略
// サウンドを有効にする場合はtrue
[BDashNotification getInstance].enableSound = YES;

// バイブレーションを有効にする場合はtrue
[BDashNotification getInstance].enableVibration = YES;

〜 省略
通知音の選択について

iOS版SDKでは端末内のシステムサウンドを通知音として設定できるUIとしてBDashSystemSoundTableView(UITableViewのサブクラス)が用意されています。Storyboardを使用していないため、呼び出すときはプログラム内でBDashSystemSoundTableViewaddSubview等を利用して呼び出し、使用してください。このテーブルはPush通知クラスと連動しているため、テーブルで設定されたサウンドはPush通知クラスの通知サウンドに反映されます。また、現在は日本語のみ対応しています。

通知音を設定しなかった場合

設定しなかった場合のデフォルトサウンドは「トライトーン」になっています。選択したサウンドがPush通知受信時に使用されます。以下の画像が画面例となっています。

 ロック画面からの起動について

ロック画面上の自アプリ通知は、ロックを解除した時に自動で消えますが、通知センター上の自アプリ通知が消えずに残ってしまう場合はアプリケーションに応じて削除していただく必要があります。

Push通知からアプリを起動する

ユーザーが受信した通知をタップ(起動)した時に、AppDelegate 内のデリゲード関数が呼び出されます。通知から遷移した時に含まれる「起動パラメーター」を利用した判定方法、成果としてTracking 情報を送るSwiftでのサンプル例は以下になります。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo

var param:String?
if let p = userInfo["param"] as? String {
param = p.removingPercentEncoding!
} else {
param = nil
}

// 起動パラメーターを判断して画面遷移させる( WebView 画面、アプリ内の画面など)
if param == "news" {
}

// Tracking 情報を生成します。デコード後の param を渡します
Tracker.getInstance().setBootTypeWithStringValue(Tracker.BOOT_PUSH, value: param)
Tracker.getInstance().screenName = "任意のスクリーン名";
Tracker.getInstance().send(ScreenViewBuilder())
}

[参考]Push通知が受信できない時

b→dash からPush通知を受信できない場合、以下のステップ順で確認をお願いいたします。

1,Tracking.plist/manifest に設定している値が正しいか確認する

– Pushが届かない場合で、最も多い原因となっています

2,1番で設定した環境のライブラリを利用しているか確認する

– 本番なのにSTG を設定しているなどがあります

3,registerNotification() を呼び出した結果 200 ステータスが返り、トークンが出力されているかを確認する

– STG 環境の場合、adb logcat/XCode コンソールでログを確認できます
– 200が返ってこない場合、サーバーが落ちてる可能性が有ります
=> お問い合わせください

4, 3番の結果 onEnable が来ているのかを確認する

registerNotification() の引数に渡したクロージャにコールバックされます

各ステップに問題が無いにも関わらず、Push通知を受信できない場合は、管理画面側の設定に問題があるか、FCM サーバーがダウンしている可能性が有ります。カスタマーサクセス担当までお問い合わせをお願いいたします。なお FCM サーバーがダウンしているかは Google 公式のダッシュボードで確認できます。