Skip to content

ジオフェンス

Braze SDKのジオフェンスの設定方法を学習する。ジオフェンスとは、特定のグローバルな位置を中心に円を形成する仮想的な地理的領域のことで、緯度、経度、半径を組み合わせて表されます。

前提条件

この機能を使用する前に、Android Braze SDKを統合する必要がある。 さらに、サイレント・プッシュ通知の設定も必要だ。

ジオフェンスの設定

ステップ 1: イネーブルメント in Braze

次のいずれかの場所で、アプリのジオフェンスs を有効にできます。

Locationsページからジオフェンスsを有効にするには:

  1. Braze で、Audience > Locations に移動します。
  2. ジオフェンス s が有効になっているワークスペース内のアプリの数がマップの下に表示されます。たとえば、ジオフェンス s が一部のアプリ s に対してのみ有効になっている場合、次のように表示されます。Geofences が有効な5 つのアプリのうち2 つ。追加のアプリs を有効にするには、マップでカレントカウントを選択します。
  3. アプリを選択してジオフェンスs を有効にし、Done. を選択します。

Brazeの場所のジオフェンスを選択できます。

アプリ設定ページからジオフェンスsを有効にするには:

  1. Brazeで、設定> アプリ設定に移動します。
  2. ジオフェンスを有効にするアプリを選択します。
  3. Geofences Enabledをチェックし、Save.を選択します。

Braze 設定 s ページにあるジオフェンス チェックボックス。

ステップ 2:build.gradle を更新する

android-sdk-locationをアプリレベルbuild.gradleに追加します。また、Google Play Services セットアップガイドを使用して、Google Play Services の位置情報パッケージを追加します。

1
2
3
4
dependencies {
  implementation "com.braze:android-sdk-location:+"
  implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_VERSION}"
}

ステップ 3:マニフェストを更新する

AndroidManifest.xmlにブート、精度の高い位置情報、バックグラウンド位置情報の権限を追加します。

1
2
3
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

AndroidManifest.xmlapplicationエレメントに Braze ブートレシーバーを追加します。

1
2
3
4
5
<receiver android:name="com.braze.BrazeBootReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
</receiver>

ステップ 4: Braze の位置情報収集機能を有効にする

まだ Braze の位置情報収集機能を有効にしていない場合は、com_braze_enable_location_collectionを含むようにbraze.xmlファイルを更新し、その値がtrueに設定されていることを確認します。

1
<bool name="com_braze_enable_location_collection">true</bool>

Braze のジオフェンスは、Braze の位置情報収集機能が有効になっている場合に有効になります。デフォルトの位置情報収集機能をオプトアウトしながらも、ジオフェンスを使用したい場合は、com_braze_enable_location_collectionの値とは別に、braze.xmlのキーcom_braze_geofences_enabledの値をtrueに設定することで、選択的に有効にすることができます。

1
<bool name="com_braze_geofences_enabled">true</bool>

ステップ 5: エンドユーザーから位置情報の許可を得る

Android M 以降のバージョンでは、位置情報を収集したりジオフェンスを登録したりする前に、エンドユーザーに位置情報の許可を求める必要があります。

ユーザーがアプリに位置情報の許可を付与したときに Braze に通知するために、以下の呼び出しを追加します。

1
Braze.getInstance(context).requestLocationInitialization();
1
Braze.getInstance(context).requestLocationInitialization()

これにより、SDK は Braze サーバーにジオフェンスを要求し、ジオフェンスの追跡を初期化します。

実装例については、RuntimePermissionUtils.javaを参照してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class RuntimePermissionUtils {
  private static final String TAG = BrazeLogger.getBrazeLogTag(RuntimePermissionUtils.class);
  public static final int DROIDBOY_PERMISSION_LOCATION = 40;

  public static void handleOnRequestPermissionsResult(Context context, int requestCode, int[] grantResults) {
    switch (requestCode) {
      case DROIDBOY_PERMISSION_LOCATION:
        // In Android Q, we require both FINE and BACKGROUND location permissions. Both
        // are requested simultaneously.
        if (areAllPermissionsGranted(grantResults)) {
          Log.i(TAG, "Required location permissions granted.");
          Toast.makeText(context, "Required location permissions granted.", Toast.LENGTH_SHORT).show();
          Braze.getInstance(context).requestLocationInitialization();
        } else {
          Log.i(TAG, "Required location permissions NOT granted.");
          Toast.makeText(context, "Required location permissions NOT granted.", Toast.LENGTH_SHORT).show();
        }
        break;
      default:
        break;
    }
  }

  private static boolean areAllPermissionsGranted(int[] grantResults) {
    for (int grantResult : grantResults) {
      if (grantResult != PackageManager.PERMISSION_GRANTED) {
        return false;
      }
    }
    return true;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
object RuntimePermissionUtils {
  private val TAG = BrazeLogger.getBrazeLogTag(RuntimePermissionUtils::class.java!!)
  val DROIDBOY_PERMISSION_LOCATION = 40

  fun handleOnRequestPermissionsResult(context: Context, requestCode: Int, grantResults: IntArray) {
    when (requestCode) {
      DROIDBOY_PERMISSION_LOCATION ->
        // In Android Q, we require both FINE and BACKGROUND location permissions. Both
        // are requested simultaneously.
        if (areAllPermissionsGranted(grantResults)) {
          Log.i(TAG, "Required location permissions granted.")
          Toast.makeText(context, "Required location permissions granted.", Toast.LENGTH_SHORT).show()
          Braze.getInstance(context).requestLocationInitialization()
        } else {
          Log.i(TAG, "Required location permissions NOT granted.")
          Toast.makeText(context, "Required location permissions NOT granted.", Toast.LENGTH_SHORT).show()
        }
      else -> {
      }
    }
  }

  private fun areAllPermissionsGranted(grantResults: IntArray): Boolean {
    for (grantResult in grantResults) {
      if (grantResult != PackageManager.PERMISSION_GRANTED) {
        return false
      }
    }
    return true
  }
}

先のサンプルコードの使用は、以下の方法で行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    boolean hasAllPermissions = PermissionUtils.hasPermission(getApplicationContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
        && PermissionUtils.hasPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION);
    if (!hasAllPermissions) {
      // Request both BACKGROUND and FINE location permissions
      requestPermissions(new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION},
          RuntimePermissionUtils.DROIDBOY_PERMISSION_LOCATION);
    }
  } else {
    if (!PermissionUtils.hasPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION)) {
      // Request only FINE location permission
      requestPermissions(new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
          RuntimePermissionUtils.DROIDBOY_PERMISSION_LOCATION);
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    val hasAllPermissions = PermissionUtils.hasPermission(applicationContext, Manifest.permission.ACCESS_BACKGROUND_LOCATION)
        && PermissionUtils.hasPermission(applicationContext, Manifest.permission.ACCESS_FINE_LOCATION)
    if (!hasAllPermissions) {
      // Request both BACKGROUND and FINE location permissions
      requestPermissions(arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION),
          RuntimePermissionUtils.DROIDBOY_PERMISSION_LOCATION)
    }
  } else {
    if (!PermissionUtils.hasPermission(applicationContext, Manifest.permission.ACCESS_FINE_LOCATION)) {
      // Request only FINE location permission
      requestPermissions(arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),
          RuntimePermissionUtils.DROIDBOY_PERMISSION_LOCATION)
    }
  }
}

ステップ 6: ジオフェンスの更新を手動でリクエストする (オプション)

デフォルトでは、Braze は自動的にデバイスの位置情報を取得し、その取得した位置情報に基づいてジオフェンスを要求します。しかし、代わりに近接する Braze ジオフェンスを取得するために使用される GPS 座標を手動で指定することもできます。手動で Braze ジオフェンスをリクエストするには、自動 Braze ジオフェンスリクエストを無効にし、リクエスト用に GPS 座標を指定する必要があります。

ステップ6.1: 自動ジオフェンスリクエストを無効にする

自動 Braze ジオフェンスリクエストは、com_braze_automatic_geofence_requests_enabledfalseに設定することで、braze.xmlファイルで無効にすることができます。

1
<bool name="com_braze_automatic_geofence_requests_enabled">false</bool>

これはさらに、ランタイム時に以下の方法で行うことができます。

1
2
3
BrazeConfig.Builder brazeConfigBuilder = new BrazeConfig.Builder()
    .setAutomaticGeofenceRequestsEnabled(false);
Braze.configure(getApplicationContext(), brazeConfigBuilder.build());
1
2
3
val brazeConfigBuilder = BrazeConfig.Builder()
    .setAutomaticGeofenceRequestsEnabled(false)
Braze.configure(applicationContext, brazeConfigBuilder.build())

ステップ6.2: GPS 座標で Braze のジオフェンスを手動でリクエストする

Braze のジオフェンスは、requestGeofences()メソッドを使用して手動でリクエストします。

1
Braze.getInstance(getApplicationContext()).requestGeofences(latitude, longitude);
1
Braze.getInstance(applicationContext).requestGeofences(33.078947, -116.601356)

プッシュ・トゥ・シンクをイネーブルメントにする

Braze では、バックグラウンドプッシュを使用してジオフェンスをデバイスに同期します。ほとんどの場合、この機能はアプリ側でのさらなる統合を必要としないため、コードの変更を伴いません。

しかし、アプリケーションが停止している場合にバックグラウンドプッシュを受信すると、バックグラウンドで起動し、そのApplication.onCreate()メソッドが呼び出されることに注意してください。カスタムのApplication.onCreate()実装がある場合は、自動サーバーコールやバックグラウンドプッシュでトリガーしないアクションを延期する必要があります。

前提条件

この機能を使う前に、Swift Braze SDKを統合する必要がある。

ジオフェンスの設定

ステップ 1: イネーブルメント in Braze

次のいずれかの場所で、アプリのジオフェンスs を有効にできます。

Locationsページからジオフェンスsを有効にするには:

  1. Braze で、Audience > Locations に移動します。
  2. ジオフェンス s が有効になっているワークスペース内のアプリの数がマップの下に表示されます。たとえば、ジオフェンス s が一部のアプリ s に対してのみ有効になっている場合、次のように表示されます。Geofences が有効な5 つのアプリのうち2 つ。追加のアプリs を有効にするには、マップでカレントカウントを選択します。
  3. アプリを選択してジオフェンスs を有効にし、Done. を選択します。

Brazeの場所のジオフェンスを選択できます。

アプリ設定ページからジオフェンスsを有効にするには:

  1. Brazeで、設定> アプリ設定に移動します。
  2. ジオフェンスを有効にするアプリを選択します。
  3. Geofences Enabledをチェックし、Save.を選択します。

Braze 設定 s ページにあるジオフェンス チェックボックス。

ステップ 2:アプリの位置情報サービスをイネーブルメントにする。

デフォルトでは、Brazeロケーションサービスは有効になっていない。アプリでイネーブルメントを有効にするには、以下のステップを完了する。ステップバイステップのチュートリアルについては、チュートリアルを参照のこと:Brazeの位置とジオフェンス.

ステップ 2.1: BrazeLocation モジュールを追加する。

XcodeでGeneralタブを開封する。フレームワーク、ライブラリー、組み込みコンテンツ」の下に、BrazeLocation モジュールを追加する。

XcodeプロジェクトにBrazeLocationモジュールを追加する。

ステップ 2.2:Info.plist を更新する

info.plist で、アプリケーションが位置情報の追跡を必要とする理由を説明する、以下のキーの1つにString 値を割り当てる。この文字列は、ユーザーが位置情報サービスのプロンプトを表示したときに表示されるので、アプリでこの機能をイネーブルメントにする価値を明確に説明すること。

  • NSLocationAlwaysAndWhenInUseUsageDescription
  • NSLocationWhenInUseUsageDescription

Info.plist Xcodeの位置文字列

ステップ 3:コードでジオフェンスをイネーブルメントにする

アプリのコードで、インスタンスを初期化するconfiguration オブジェクトのlocation.geofencesEnabledtrue に設定して、ジオフェンスをイネーブルメントにする。 Brazeインスタンスを初期化する。その他のlocation 設定オプションについては、Braze Swift SDKリファレンスを参照のこと。

1
2
3
4
5
6
7
8
9
10
11
12
13
let configuration = Braze.Configuration(
  apiKey: "<BRAZE_API_KEY>",
  endpoint: "<BRAZE_ENDPOINT>"
)
configuration.location.brazeLocationProvider = BrazeLocationProvider()
configuration.location.automaticLocationCollection = true
configuration.location.geofencesEnabled = true
configuration.location.automaticGeofenceRequests = true

// Additional configuration customization...

let braze = Braze(configuration: configuration)
AppDelegate.braze = braze
1
2
3
4
5
6
7
8
9
10
11
12
13
BRZConfiguration *configuration =
    [[BRZConfiguration alloc] initWithApiKey:brazeApiKey
                                    endpoint:brazeEndpoint];
configuration.logger.level = BRZLoggerLevelInfo;
configuration.location.brazeLocationProvider = [[BrazeLocationProvider alloc] init];
configuration.location.automaticLocationCollection = YES;
configuration.location.geofencesEnabled = YES;
configuration.location.automaticGeofenceRequests = YES;

// Additional configuration customization...

Braze *braze = [[Braze alloc] initWithConfiguration:configuration];
AppDelegate.braze = braze;

ステップ 3.1:バックグラウンドレポートを有効にする(オプション)

デフォルトでは、ジオフェンス・イベントは、アプリがフォアグラウンドにあるか、Always 、すべてのアプリケーションの状態を監視する認可がある場合にのみ監視される。

しかし、アプリがバックグラウンドにある場合や、When In Use 認証がある場合は、ジオフェンス・イベントを監視することもできる。

これらの追加ジオフェンス・イベントをモニターするには、Xcodeプロジェクトを開封し、Signing& Capabilitiesに行く。バックグラウンドモード]で[位置情報の更新]をチェックする。

Xcodeのバックグラウンドモード > ロケーション更新

次に、アプリのコードでallowBackgroundGeofenceUpdates 。これによりBrazeは、位置情報の更新を継続的に監視することで、アプリの「使用中」ステータスを拡張することができる。この設定は、アプリがバックグラウンドにあるときにのみ機能する。アプリが再び開封されると、既存のバックグラウンド・プロセスはすべて一時停止され、代わりにフォアグラウンド・プロセスが優先される。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let configuration = Braze.Configuration(
  apiKey: "<BRAZE_API_KEY>",
  endpoint: "<BRAZE_ENDPOINT>"
)

// Additional configuration customization...

// Enable background geofence reporting with `When In Use` authorization.
configuration.location.allowBackgroundGeofenceUpdates = true

// Determines the number of meters required to trigger a new location update.
configuration.location.distanceFilter = 8000

let braze = Braze(configuration: configuration)
AppDelegate.braze = braze
1
2
3
4
5
6
7
8
9
10
11
12
13
14
BRZConfiguration *configuration =
    [[BRZConfiguration alloc] initWithApiKey:brazeApiKey
                                    endpoint:brazeEndpoint];

// Additional configuration customization...

// Enable background geofence reporting with `When In Use` authorization.
configuration.location.allowBackgroundGeofenceUpdates = YES;

// Determines the number of meters required to trigger a new location update.
configuration.location.distanceFilter = 8000;

Braze *braze = [[Braze alloc] initWithConfiguration:configuration];
AppDelegate.braze = braze;

ステップ 4: 認可を要請する

ユーザーに認可を要求する場合、When In Use またはAlways のいずれかの認可を要求する。

When In Use 権限を要求するには、requestWhenInUseAuthorization() メソッドを使用します。

1
2
var locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
1
2
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager requestWhenInUseAuthorization];

デフォルトでは、requestAlwaysAuthorization() はアプリに When In Use 権限のみを付与し、しばらく経過した後に、Always 権限をユーザーにもう一度要求します。

しかし、最初にrequestWhenInUseAuthorization() 、最初のWhen In Use の認可を受けた後にrequestAlwaysAuthorization() 、即座にユーザーにプロンプトを出すこともできる。

1
2
var locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
1
2
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager requestAlwaysAuthorization];

ステップ 5: バックグラウンドプッシュを確認する

Braze では、バックグラウンドプッシュ通知を使用してジオフェンスがデバイスと同期されます。以下の手順に従って、サーバーからのジオフェンス更新が適切に処理されるように、サイレントプッシュ通知を設定する。

ジオフェンスを手動でリクエストする

Braze SDKは、バックエンドからジオフェンスをリクエストすると、ユーザーのCurrentsをレポートし、レポートされたロケーションに基づいて最適に関連すると判断されたジオフェンスを受信する。

最も関連性の高いジオフェンスを受信する目的でSDKがレポートする位置をコントロールするには、希望する座標を提供してジオフェンスを手動でリクエストすることができる。

ステップ 1: automaticGeofenceRequestsfalse に設定します

init(configuration) に渡される configuration オブジェクトで、自動ジオフェンスリクエストを無効にできます。automaticGeofenceRequestsfalse に設定します。

1
2
3
4
5
6
7
let configuration = Braze.Configuration(
  apiKey: "{BRAZE_API_KEY}",
  endpoint: "{BRAZE_ENDPOINT}"
)
configuration.automaticGeofencesRequest = false
let braze = Braze(configuration: configuration)
AppDelegate.braze = braze
1
2
3
4
5
6
BRZConfiguration *configuration =
  [[BRZConfiguration alloc] initWithApiKey:{BRAZE_API_KEY}
                                  endpoint:{BRAZE_ENDPOINT}];
configuration.automaticGeofencesRequest = NO;
Braze *braze = [[Braze alloc] initWithConfiguration:configuration];
AppDelegate.braze = braze;

ステップ 2:requestGeofences に手動で電話をかける。

コードの中で、適切な緯度と経度を持つジオフェンスをリクエストする。

1
AppDelegate.braze?.requestGeofences(latitude: latitude, longitude: longitude)
1
2
[AppDelegate.braze requestGeofencesWithLatitude:latitude
                                      longitude:longitude];

よくある質問 (FAQ)

私のデバイスでジオフェンスが受信できないのはなぜか?

ジオフェンスがデバイスで受信されているかどうかを確認するには、まずSDK Debuggerツールを使ってSDKのログをチェックする。そして、ジオフェンスがサーバーから正常に受信されているかどうか、また目立ったエラーがないかどうかを確認することができる。

以下は、お使いのデバイスでジオフェンスが受信されない場合に考えられるその他の理由である:

iOSオペレーティングシステムの制限

iOSのオペレーティングシステムでは、1つのアプリに保存できるジオフェンスは20個までとなっている。ジオフェンスを有効にすると、Braze ではこれら20個の利用可能スロットの一部が使用されます。

アプリ内の他のジオフェンス関連機能が誤って、または望まない形で中断されるのを防ぐため、ダッシュボードで個々のアプリの位置情報ジオフェンスをイネーブルメントにする必要がある。位置情報サービスが正しく動作するには、アプリで利用可能なジオフェンススポットがすべて使用されていないことを確認してください。

レート制限

Brazeでは、不要なリクエストを避けるため、ジオフェンスの更新は1セッションにつき1回に制限されている。

Brazeと非Brazeの両方のジオフェンス機能を使用している場合、どのように機能するのか?

前述の通り、iOSでは1つのアプリに最大20個のジオフェンスを保存できる。このストレージは、BrazeとBraze以外のジオフェンスの両方で共有され、CLLocationManagerによって管理される。

例えば、アプリに20の非Brazeジオフェンスが含まれている場合、Brazeジオフェンスをトラッキング追跡するストレージはない(逆も同様)。新しいジオフェンスを受信するには、アップルの位置情報APIを使用して、デバイス上の既存のジオフェンスの一部の監視を停止する必要がある。

ジオフェンス機能は、デバイスがオフラインの状態でも使用できるのか?

デバイスは、リフレッシュが発生したときだけインターネットに接続する必要がある。サーバーからのジオフェンス受信に成功すれば、デバイスがオフラインの状態でも、ジオフェンスのエントリやエグジットを記録することができる。これは、デバイスの位置情報がインターネット接続とは別に動作するためだ。

例えば、あるデバイスがセッション開始時にジオフェンスの受信と登録に成功し、オフラインになったとする。登録されたジオフェンスのいずれかに入ると、Brazeキャンペーンをトリガーすることができる。

アプリがバックグラウンド/終了すると、ジオフェンスが監視されないのはなぜか?

Always 、アップルはアプリが使用されていない間、位置情報サービスの実行を制限する。これはオペレーティングシステムによって強制され、Braze SDKのコントロール外である。Brazeは、アプリがバックグラウンドにある間にサービスを実行するための個別の設定を提供しているが、ユーザーからの明示的な承認を受けずに終了したアプリについては、これらの制限を回避する方法はない。

New Stuff!