独自のモニタの使用
また、Places 拡張機能 API を使用すると、監視サービスを使用し、Places Service と統合することもできます。
ジオフェンスの登録
監視サービスを使用する場合は、次の手順を実行して、現在の場所に関する POI のジオフェンスを登録します。
iOS
iOSで、以下の手順を実行します。
-
iOSのコア場所サービスから取得した場所の更新を Places 拡張機能に渡します。
-
getNearbyPointsOfInterest
Places 拡張機能 API を使用して、現在の場所の周囲にあるACPPlacesPoi
オブジェクトの配列を取得します。- (void) locationManager: (CLLocationManager*) manager didUpdateLocations: (NSArray<CLLocation*>*) locations { [ACPPlaces getNearbyPointsOfInterest:currentLocation limit:10 callback: ^ (NSArray<ACPPlacesPoi*>* _Nullable nearbyPoi) { [self startMonitoringGeoFences:nearbyPoi]; }]; }
-
取得した
ACPPlacesPOI
オブジェクトから情報を抽出し、それらの POI の監視を開始します。- (void) startMonitoringGeoFences: (NSArray*) newGeoFences { // verify if the device supports monitoring geofences // check for location permission for (ACPPlacesPoi * currentRegion in newGeoFences) { // make the circular region CLLocationCoordinate2D center = CLLocationCoordinate2DMake(currentRegion.latitude, currentRegion.longitude); CLCircularRegion* currentCLRegion = [[CLCircularRegion alloc] initWithCenter:center radius:currentRegion.radius identifier:currentRegion.identifier]; currentCLRegion.notifyOnExit = YES; currentCLRegion.notifyOnEntry = YES; // start monitoring the new region [_locationManager startMonitoringForRegion:currentCLRegion]; } }
Android
-
Google Play サービスまたはAndroidの場所サービスから取得した場所の更新を Places Extension に渡します。
-
getNearbyPointsOfInterest
Places Extension API を使用して、現在の場所の周りのPlacesPoi
オブジェクトのリストを取得します。LocationCallback callback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { super.onLocationResult(locationResult); Places.getNearbyPointsOfInterest(currentLocation, 10, new AdobeCallback<List<PlacesPOI>>() { @Override public void call(List<PlacesPOI> pois) { starMonitoringGeofence(pois); } }); } };
-
取得した
PlacesPOI
オブジェクトからデータを抽出し、それらの POI の監視を開始します。private void startMonitoringFences(final List<PlacesPOI> nearByPOIs) { // check for location permission for (PlacesPOI poi : nearByPOIs) { final Geofence fence = new Geofence.Builder() .setRequestId(poi.getIdentifier()) .setCircularRegion(poi.getLatitude(), poi.getLongitude(), poi.getRadius()) .setExpirationDuration(Geofence.NEVER_EXPIRE) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .build(); geofences.add(fence); } GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); builder.addGeofences(geofences); builder.build(); geofencingClient.addGeofences(builder.build(), geoFencePendingIntent) }
getNearbyPointsOfInterest
API を呼び出すと、現在の場所の周囲の場所を取得するネットワーク呼び出しが発生します。
ジオフェンスイベントの投稿
iOS
iOSで、CLLocationManager
デリゲートの processGeofenceEvent
Places API を呼び出します。 この API は、ユーザーが特定のリージョンにエントリまたは離脱したかどうかを通知します。
- (void) locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
[ACPPlaces processRegionEvent:region forRegionEventType:ACPRegionEventTypeEntry];
}
- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
[ACPPlaces processRegionEvent:region forRegionEventType:ACPRegionEventTypeExit];
}
Android
Androidでは、processGeofence
メソッドを、ジオフェンス放送受信機の適切なトランジションイベントと共に呼び出します。 受信したジオフェンスのリストをキュレートして、エントリや離脱の重複を防ぐことができます。
void onGeofenceReceived(final Intent intent) {
// do appropriate validation steps for the intent
...
// get GeofencingEvent from intent
GeofencingEvent geoEvent = GeofencingEvent.fromIntent(intent);
// get the transition type (entry or exit)
int transitionType = geoEvent.getGeofenceTransition();
// validate your geoEvent and get the necessary Geofences from the list
List<Geofence> myGeofences = geoEvent.getTriggeringGeofences();
// process region events for your geofences
for (Geofence geofence : myGeofences) {
Places.processGeofence(geofence, transitionType);
}
}