Amazon Pinpoint のセグメントを使いこなそう !
内山 陽介
皆様、プッシュ通知ライフをいかがお過ごしでしょうか ? 私は今回の記事を執筆するタイミングでこちらのアップデートが発表されて勝手に盛り上がっております。
Amazon Pinpoint の新しいセグメンテーション機能に関する発表 »
こちらのアップデートが発表されるまでは Amazon Pinpoint でセグメントの機能を使いこなすためには API や AWS CLI を使う必要があったのですが、こちらのアップデートによりマネージメントコンソールからでも柔軟なセグメントを作成できるようになりました。
(実際に直前まで CLI でセグメントを作成する記事を執筆予定でした。。)
今日やること
さて、前回は Amazon Pinpoint でプッシュ通知を打ってみよう! と言う内容で iOS, Android デバイスにプッシュ通知を打ってみましたが、今回は Amazon Pinpoint のセグメント機能を使ってターゲティング通知を行います。
クリックすると拡大します
目次
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. 開発環境の前提条件
本記事を進めるためには、以下の環境が整っていることを確認してください。
- Amazon Pinpoint から iOS, Android デバイスにプッシュ通知を送れる状態であること
- まだ Amazon Pinpopint から iOS, Android デバイスにプッシュ通知を送ったことがない場合は、「Amazon Pinpoint でプッシュ通知を打ってみよう !」を先に実施してください。
- まだ Amazon Pinpopint から iOS, Android デバイスにプッシュ通知を送ったことがない場合は、「Amazon Pinpoint でプッシュ通知を打ってみよう !」を先に実施してください。
- Amazon Pinpoint のセグメントとキャンペーンを作成できる AWS アカウントがあること
2. Amazon Pinpoint のセグメントとは ?
実装を進めていく前にまずは Pinpoint のセグメントとは何かを簡単にご説明いたします。
Amazon Pinpoint には静的セグメントと動的セグメントの 2 種類のセグメントがあります。
- 静的セグメント
CSV, JSON 形式でデバイストークンや、メールアドレスのリストをインポートすることで使用できる固定のセグメント - 動的セグメント
Amazon Pinpoint に収集したデバイスやユーザーの属性を使ってフィルタリングして得られるセグメント。セグメント参照時のデバイスやユーザーの属性によって変化するセグメント
2-1. 動的セグメントの構成要素
そして、今回の記事では動的セグメントを扱います。また、動的セグメントには下記のような構成要素があります。動的セグメントについて詳しくは こちら をご確認ください。
- セグメントグループ
動的セグメントは 1 つ以上のセグメントグループで構成。複数のセグメントグループ間の関係は AND, OR で定義できます。セグメントグループは以下のコンポーネントで構成されています。 - 基本セグメント
母集団を定義するセグメント。単一の基本セグメント、複数の基本セグメント、またはすべてのデバイスを含むセグメントを指定できます。 - 条件
基本セグメントに適用するユーザー情報のカテゴリ。複数の条件を作成して条件間の関係を AND, OR, NOR で定義できます。 - フィルタ
条件内でセグメント対象を絞るために、ユーザーやデバイスの属性を演算子と値を指定してフィルタリングします。
クリックすると拡大します
2-2. セグメント条件の構成要素
セグメントの条件として指定できる要素は下記になります。これらの条件に対してフィルタをかけることでセグメントを作成できます。
- Standard Attributes
SDK を利用することでデフォルトで取得できるデバイス属性。 - Channel Types
デバイス (アドレス) のタイプ。 EMAIL, SMS, PUSH, CUSTOM のいずれかを指定できます。 - Activity
ユーザーが n 日間アクティブだったか否かでフィルタリングできます。 - Custom Endpoint Attributes
任意で取得できるデバイスの属性。例えば、このデバイスでプッシュ通知を受け取るか否かといった情報を持たせることができます。 - Customer User Attributes
任意で取得できるユーザーの属性。例えば、名前といった情報を持たせることができます。 - Metrics
任意で取得できる定量的評価できる情報。たとえば、特定の場所を x 回訪問したデバイスといって情報を持たせることができます。
クリックすると拡大します
3. Android でユーザー情報を収集する
それでは、Android で属性を取得してみましょう。まずは、前回の記事 の状態から onCreate メソッドに Log を追加してデフォルトで取得できている属性を確認してみます。
Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
getPinpointManager(applicationContext)
// ここから追加
Log.d(TAG, pinpointManager?.targetingClient?.currentEndpoint().toString())
// 追加ここまで
}
取得できたものは下記になります。
Endopoint Id や アドレスなどと Demographic の情報が取得できていることが確認できます。この Demographic で取得できている情報が SDK をいれるとデフォルトで取得できる属性になります。
{
"ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ChannelType": "GCM",
"Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Location": {
"PostalCode": "",
"City": "",
"Region": "",
"Country": "USA"
},
"Demographic": {
"Make": "Google",
"Model": "Android SDK built for x86",
"Timezone": "Asia\/Tokyo",
"Locale": "en_US",
"AppVersion": "1.0",
"Platform": "ANDROID",
"PlatformVersion": "9"
},
"EffectiveDate": "2021-01-20T13:04:37.925Z",
"OptOut": "NONE",
"User": {}
}
それでは、Endpoint Attributes, Customer User Attributes, Metrics をそれぞれ取得してみましょう。
通常はユーザー登録時や、プロフィール更新時などに Pinpoint の属性を更新しますが、今回は便宜的に onCreate の中で値を直接埋め込んでしまいます。
また、ニュースアプリを運営していて、
- Custom Endpoint Attributes では、興味のあるジャンル
- Metrics では、アプリへの訪問回数
- Customer User Attributes ではプレミアム会員かどうか
をそれぞれ保持していると仮定します。
まず、前回の記事だと app 配下の build.gradle で Mobile SDK の 2.15.+ を指定していたのですが、 Pinpoint のセグメントの全機能を使うために 2.16.+ を指定し直してください。 com.amazonaws:aws-android-sdk-pinpoint と com.amazonaws:aws-android-sdk-mobile-client のバージョンを変更します。
gradle
dependencies {
implementation 'com.amazonaws:aws-android-sdk-pinpoint:2.16.+'
implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.16.+@aar') { transitive = true }
}
次に、onCreate で属性を更新します。
Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
getPinpointManager(applicationContext)
// ここから追加
val targetingClient: TargetingClient? = pinpointManager?.targetingClient
targetingClient?.addAttribute("interests", listOf("Science", "IT", "Design"))
targetingClient?.addMetric("visit", 2.0)
val endPointProfile: EndpointProfile? = targetingClient?.currentEndpoint()
val endpointProfileUser = EndpointProfileUser()
endpointProfileUser.userId = "user_id_001"
endpointProfileUser.addUserAttribute("premium", listOf("true"))
endPointProfile?.user = endpointProfileUser
targetingClient?.updateEndpointProfile(endPointProfile)
// ここまで
Log.d(TAG, pinpointManager?.targetingClient?.currentEndpoint().toString())
}
ログから更新後の属性を確認すると下記の様になります。先ほど onCreate で更新した、
- Custom Endpoint Attributes では、興味のあるジャンル
- Metrics では、アプリへの訪問回数
- Customer User Attributes ではプレミアム会員かどうかと UserId
が反映されていることがわかります。これで Android の実装は完了です。
{
"ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ChannelType": "GCM",
"Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Location": {
"PostalCode": "",
"City": "",
"Region": "",
"Country": "USA"
},
"Demographic": {
"Make": "Google",
"Model": "Android SDK built for x86",
"Timezone": "Asia\/Tokyo",
"Locale": "en_US",
"AppVersion": "1.0",
"Platform": "ANDROID",
"PlatformVersion": "9"
},
"EffectiveDate": "2021-01-20T14:28:22.912Z",
"OptOut": "NONE",
"Attributes": {
"interests": [
"Science",
"IT",
"Design"
]
},
"Metrics": {
"visit": 2
},
"User": {
"UserId": "user_id_001",
"UserAttributes": {
"premium": [
"true"
]
}
}
}
4. iOS でユーザー情報を収集する
続いて、iOS で属性を取得してみましょう。iOS も前回の記事 の状態から application:didFinishLaunchingWithOptions: メソッドに print を追加してデフォルトで取得できている属性を確認してみます。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Instantiate Pinpoint
let pinpointConfiguration = AWSPinpointConfiguration
.defaultPinpointConfiguration(launchOptions: launchOptions)
// Set debug mode to use APNS sandbox, make sure to toggle for your production app
pinpointConfiguration.debug = true
pinpoint = AWSPinpoint(configuration: pinpointConfiguration)
// Present the user with a request to authorize push notifications
registerForPushNotifications()
// ここから追加
if let targetingClient = pinpoint?.targetingClient {
do {
let jsonData = try JSONSerialization.data(withJSONObject: targetingClient.currentEndpointProfile().toDictionary(), options: [])
print(String(bytes: jsonData, encoding: .utf8) ?? "{}")
} catch {}
}
// ここまで
return true
}
取得できたものは下記になります。
iOS も Android 同様に Endopoint Id や アドレスなどと Demographic の情報が取得できていることが確認できます。
{
"Attributes": {},
"Metrics": {},
"Location": {
"Latitude": 0,
"Longitude": 0,
"PostalCode": "(null)",
"City": "(null)",
"Country": "(null)",
"Region": "(null)"
},
"User": {
"Attributes": {},
"UserId": "(null)"
},
"Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"ChannelType": "APNS_SANDBOX",
"EffectiveDate": "2021-01-20T14:56:20.602Z",
"EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"OptOut": "NONE",
"Demographic": {
"Timezone": "Asia/Tokyo",
"Locale": "en_JP",
"PlatformVersion": "14.3",
"AppVersion": "1.0",
"Model": "iPhone",
"Make": "apple",
"Platform": "iOS"
}
}
それでは、Endpoint Attributes, Customer User Attributes, Metrics をそれぞれ取得してみましょう。
iOS も便宜的に application:didFinishLaunchingWithOptions: の中で値を直接埋め込んでしまいます。
埋め込む値は同様に下記ですが、デバイスが異なるので値は変えておくのと、 Customer User Attributes は Android と同じ UserId で別の属性として名前を設定しておきます。
- Custom Endpoint Attributes では、興味のあるジャンル
- Metrics では、アプリへの訪問回数
- Customer User Attributes では 名前
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Instantiate Pinpoint
let pinpointConfiguration = AWSPinpointConfiguration
.defaultPinpointConfiguration(launchOptions: launchOptions)
// Set debug mode to use APNS sandbox, make sure to toggle for your production app
pinpointConfiguration.debug = true
pinpoint = AWSPinpoint(configuration: pinpointConfiguration)
// Present the user with a request to authorize push notifications
registerForPushNotifications()
if let targetingClient = pinpoint?.targetingClient {
// ここから追加
targetingClient.addAttribute(["Economics", "Sport"], forKey: "interests")
targetingClient.addMetric(9.0, forKey: "visit")
let endpoint = targetingClient.currentEndpointProfile()
let user = AWSPinpointEndpointProfileUser()
user.userId = "user_id_001"
user.addAttribute(["uchiyo"], forKey: "name")
endpoint.user = user
targetingClient.update(endpoint)
// ここまで
do {
let jsonData = try JSONSerialization.data(withJSONObject: targetingClient.currentEndpointProfile().toDictionary(), options: [])
print(String(bytes: jsonData, encoding: .utf8) ?? "{}")
} catch {}
}
return true
}
ログから更新後の属性を確認すると下記の様になります。先ほど application:didFinishLaunchingWithOptions: で更新した、
- Custom Endpoint Attributes では、興味のあるジャンル
- Metrics では、アプリへの訪問回数
- Customer User Attributes では名前と UserId
が反映されていることがわかります。これで iOS の実装も完了です。
{
"Demographic": {
"Timezone": "Asia/Tokyo",
"Locale": "en_JP",
"PlatformVersion": "14.3",
"AppVersion": "1.0",
"Model": "iPhone",
"Make": "apple",
"Platform": "iOS"
},
"ChannelType": "APNS_SANDBOX",
"User": {
"Attributes": {
"name": [
"uchiyo"
]
},
"UserId": "user_id_001"
},
"EffectiveDate": "2021-01-20T15:16:29.886Z",
"Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Attributes": {
"interests": [
"Economics",
"Sport"
]
},
"OptOut": "NONE",
"ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Location": {
"Latitude": 0,
"Longitude": 0,
"PostalCode": "(null)",
"City": "(null)",
"Country": "(null)",
"Region": "(null)"
},
"Metrics": {
"visit": 9
}
}
5. Amazon Pinpoint でセグメントを作ってみる
それでは先ほど取得した属性を使ってセグメントを作っていきましょう。
まずは、プッシュ通知全体のセグメントを作成してみます。セグンメントを作成にするにはセグメント画面からセグメントを作成を選択してください。
- 名前 All Push Channels
- 条件
- 属性 プッシュ
でセグメントを作成します。
クリックすると拡大します
次に、
- 名前 : Science
- 基本セグメント : All Push Channels
- 条件
- 属性: interests 演算子: 次を含む 値: Science
でセグメントを作成します。
クリックすると拡大します
次に、
- 名前 : Visit < 10
- 基本セグメント : All Push Channels
- 条件
- 属性: visit 演算子: 未満 値: 10
- 属性: visit 演算子: 未満 値: 10
でセグメントを作成します。
クリックすると拡大します
次に、
- 名前 : Premium user
- 基本セグメント : All Push Channels
- 条件
- 属性: preimum 演算子: である 値: true
- 属性: preimum 演算子: である 値: true
でセグメントを作成します。
クリックすると拡大します
これでセグメントの作成は完了です。
6. Amazon Pinpoint で実際に通知を打ってみる
それでは、作成したセグメントに対してプッシュ通知を打ってみましょう。
キャンペーンの画面に移動して、キャンペーンの作成を選択します。そして、キャンペーンを作成する際は先ほど作成したセグメントを選択して作成していきます。
結果は下記の様になりました。
ATTRIBUTE | iOS | Android |
All Push Channels | ◯ | ◯ |
Science | × | ◯ |
Visit < 10 | ◯ | ◯ |
Premium User | ◯ | ◯ |
iOS, Android の現在の属性は下記の様になります。
ATTRIBUTE | iOS | Android |
Attributes.interest | ["Economics", "Sport"] | ["Science", "IT", "Design"] |
Metrics.visit | 9 | 2 |
User.UserId | user_id_001 | user_id_001 |
User.Attributes.premium | - | true |
User.Attributes.name | uchiyo | - |
属性とセグメントを見比べるとセグメントが正しく動作していることをご確認いただけたかと思います。
ただ、iOS の方は User.Attributes.premium を設定していないのに、なぜ通知が届いているのかと疑問に思われる方もいらっしゃるかと思います。
こちらは、User.Attributes は User.UserId が同じ場合に、いずれかで設定した User.Attributes の情報が User.UserId が同じ全てのデバイスに適用されるためです。
7. ユーザー情報を更新してセグメントに反映されることを確認しよう
セグメントが動作していることが確認できたので、最後にユーザーの属性を変更するとセグメントが動的に変化することを確認していきます。
まずは、Android の属性を変更します。
Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getPinpointManager(applicationContext)
val targetingClient: TargetingClient? = pinpointManager?.targetingClient
targetingClient?.addAttribute("interests", listOf("IT", "Design")) // Scienceを削除
targetingClient?.addMetric("visit", 2.0)
val endPointProfile: EndpointProfile? = targetingClient?.currentEndpoint()
val endpointProfileUser = EndpointProfileUser()
endpointProfileUser.userId = "user_id_001"
endpointProfileUser.addUserAttribute("premium", listOf("false")) // falseに変更
endPointProfile?.user = endpointProfileUser
targetingClient?.updateEndpointProfile(endPointProfile)
Log.d(TAG, pinpointManager?.targetingClient?.currentEndpoint().toString())
}
ログで属性が変更されていることを確認します。
{
"ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"ChannelType": "GCM",
"Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Location": {
"PostalCode": "",
"City": "",
"Region": "",
"Country": "USA"
},
"Demographic": {
"Make": "Google",
"Model": "Android SDK built for x86",
"Timezone": "Asia\/Tokyo",
"Locale": "en_US",
"AppVersion": "1.0",
"Platform": "ANDROID",
"PlatformVersion": "9"
},
"EffectiveDate": "2021-01-20T17:28:27.210Z",
"OptOut": "NONE",
"Attributes": {
"interests": [
"IT",
"Design"
]
},
"Metrics": {
"visit": 2
},
"User": {
"UserId": "user_id_001",
"UserAttributes": {
"premium": [
"false"
]
}
}
}
次に、iOS の属性を変更します。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Instantiate Pinpoint
let pinpointConfiguration = AWSPinpointConfiguration
.defaultPinpointConfiguration(launchOptions: launchOptions)
// Set debug mode to use APNS sandbox, make sure to toggle for your production app
pinpointConfiguration.debug = true
pinpoint = AWSPinpoint(configuration: pinpointConfiguration)
// Present the user with a request to authorize push notifications
registerForPushNotifications()
if let targetingClient = pinpoint?.targetingClient {
targetingClient.addAttribute(["Economics", "Sport", "Science"], forKey: "interests") // Science の追加
targetingClient.addMetric(10.0, forKey: "visit") // 10.0 に変更
let endpoint = targetingClient.currentEndpointProfile()
let user = AWSPinpointEndpointProfileUser()
user.userId = "user_id_001"
user.addAttribute(["uchiyo"], forKey: "name")
endpoint.user = user
targetingClient.update(endpoint)
do {
let jsonData = try JSONSerialization.data(withJSONObject: targetingClient.currentEndpointProfile().toDictionary(), options: [])
print(String(bytes: jsonData, encoding: .utf8) ?? "{}")
} catch {}
}
return true
}
次に、iOS の属性を変更します。
{
"EffectiveDate": "2021-01-20T17:31:35.877Z",
"User": {
"Attributes": {
"name": [
"uchiyo"
]
},
"UserId": "user_id_001"
},
"Location": {
"Latitude": 0,
"Longitude": 0,
"PostalCode": "(null)",
"City": "(null)",
"Country": "(null)",
"Region": "(null)"
},
"EndpointId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Metrics": {
"visit": 10
},
"ApplicationId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"OptOut": "NONE",
"Attributes": {
"interests": [
"Economics",
"Sport",
"Science"
]
},
"Demographic": {
"Timezone": "Asia/Tokyo",
"Locale": "en_JP",
"PlatformVersion": "14.3",
"AppVersion": "1.0",
"Model": "iPhone",
"Make": "apple",
"Platform": "iOS"
},
"ChannelType": "APNS_SANDBOX",
"Address": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
属性変更後の iOS, Android の属性は下記の様になります。
ATTRIBUTE | iOS | Android |
Attributes.interest | ["Economics", "Sport", "Science"] | ["IT", "Design"] |
Metrics.visit | 10 | 2 |
User.UserId | user_id_001 | user_id_001 |
User.Attributes.premium | - | false |
User.Attributes.name | uchiyo | - |
この状態で再度各セグメントの通知を行ってみます。
結果は下記の様になりました。
ATTRIBUTE | iOS | Android |
All Push Channels | ◯ | ◯ |
Science | ◯ | × |
Visit < 10 | × | ◯ |
Premium User | × | × |
セグメントは変更せずに先ほどと結果が変わっていることが確認できました。
8. まとめ
いかがでしたか ? Amazon Pinpoint で柔軟なターゲティング通知を行うことが確認できたかと思います。
その他にも Amazon Pinpoint では、Email や SMS、Voice メール、Lmbada を使って SNS に配信を行なったり、ユーザーの行動情報や属性情報を収集して、ダッシュボードでのユーザー分析。ユーザーの行動に合わせた通知を行うことができるジャーニー機能などがあります。
ぜひ、 Amazon Pinpoint を試してみてください !
筆者プロフィール
内山 陽介 (うちやま ようすけ)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
普段はインターネットメディア系のお客様にアーキテクティングなどの技術的なご支援をしています。
前職ではプッシュ通知を送る人でしたが、AWS でもプッシュ通知を送っています。
Pinpoint の人。
AWS を無料でお試しいただけます