Driver SDK を使用すると、移動と注文の進行状況アプリに高度なナビゲーションとトラッキングを提供できます。Driver SDK は、オンデマンド配車と配達ソリューションの Fleet Engine に車両の位置情報とタスクの更新を提供します。
Driver SDK は、Fleet Engine サービスとカスタム サービスで車両の位置と状態を常に把握します。たとえば、車両が ONLINE
または OFFLINE
の場合、車両の位置情報はルートが進行するにつれて変化します。
最小システム要件
前提条件
このガイドでは、アプリに Navigation SDK がすでに実装されており、Fleet Engine バックエンドが設定されて利用可能であることを前提としています。ただし、サンプルコードには、Navigation SDK のセットアップ方法のサンプルが含まれています。
また、Google Cloud プロジェクトで Maps SDK for iOS を有効にして API キーを取得する必要があります。
Project Configuration
Swift Package Manager
Driver SDK は Swift Package Manager を使用してインストールできます。SDK を追加するには、既存の Driver SDK の依存関係をすべて削除してください。
新規または既存のプロジェクトに SDK を追加する手順は次のとおりです。
-
Xcode
project
またはworkspace
を開き、[File] > [Add Package Dependencies] に移動します。 - URL として「https://github.com/googlemaps/ios-driver-sdk」と入力し、Enter キーを押してパッケージを取得して、[Add Package] をクリックします。
-
特定の
version
をインストールするには、[依存関係ルール] フィールドをバージョン ベースのオプションのいずれかに設定します。新しいプロジェクトの場合は、最新バージョンを指定して [正確なバージョン] オプションを使用することをおすすめします。完了したら、[Add Package] をクリックします。 -
[Choose Package Products] ウィンドウで、指定した
main
ターゲットにGoogleRidesharingDriver
が追加されることを確認します。完了したら、[Add Package] をクリックします。 -
インストールを確認するには、ターゲットの
General
ペインに移動します。[Frameworks, Libraries, and Embedded Content] に、インストールされたパッケージが表示されます。 [Project Navigator] の [Package Dependencies] セクションで、パッケージとそのバージョンを確認することもできます。
既存のプロジェクトの package
を更新する手順は次のとおりです。
9.0.0 より前のバージョンからアップグレードする場合は、アップグレード後に
GoogleMapsBase
、GoogleMapsCore
、GoogleMapsM4B
の依存関係を削除する必要があります。GoogleMaps
の依存関係は削除しないでください。詳細については、バージョン 9.0.0 リリースノートをご覧ください。Xcode のプロジェクト構成で、[Frameworks, Libraries, and Embedded Content] を見つけます。マイナス記号(-)を使用して、次のフレームワークを削除します。
GoogleMapsBase
(9.0.0 より前のバージョンからのアップグレードのみ)GoogleMapsCore
(9.0.0 より前のバージョンからのアップグレードのみ)GoogleMapsM4B
(9.0.0 より前のバージョンからのアップグレードのみ)
- Xcode で、[File] > [Packages] > [Update To Latest Package Versions] に移動します。
- インストールを確認するには、Project Navigator の [Package Dependencies] セクションに移動し、パッケージとそのバージョンを確認します。
CocoaPods
を使用して追加された既存の Driver SDK 依存関係を削除するには、次の手順を行います。
- Xcode ワークスペースを閉じます。ターミナルを開いて、次のコマンドを実行します。
sudo gem install cocoapods-deintegrate cocoapods-clean pod deintegrate pod cache clean --all
-
Podfile
、Podfile.resolved
、Xcode のworkspace
を CocoaPods 以外に使用していない場合は、削除します。
手動でインストールした既存の Driver SDK を削除する手順は次のとおりです。
Xcode プロジェクトの構成設定で、フレームワーク、ライブラリ、埋め込みコンテンツを見つけます。マイナス記号
(-)
を使用して、次のフレームワークを削除します。GoogleRidesharingDriver.xcframework
Xcode プロジェクトの最上位ディレクトリから、
GoogleRidesharingDriver
バンドルを削除します。
CocoaPods
CocoaPods を使用して Driver SDK を構成するには、次のものが必要です。
- CocoaPods ツール: このツールをインストールするには、ターミナルを開いて次のコマンドを実行します。
sudo gem install cocoapods
Driver SDK 用の Podfile を作成し、それを使用して API とその依存関係をインストールします。プロジェクト ディレクトリに Podfile という名前のファイルを作成します。このファイルでプロジェクトの依存関係を定義します。Podfile を編集して依存関係を追加します。依存関係を含む例を次に示します。
source "https://github.com/CocoaPods/Specs.git" target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GoogleRidesharingDriver' end
Driver SDK のアルファ版 Pod とベータ版 Pod を依存関係として含む例を次に示します。
source "https://cpdc-eap.googlesource.com/ridesharing-driver-sdk.git" source "https://github.com/CocoaPods/Specs.git" target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GoogleRidesharingDriver' end
Podfile を保存します。ターミナルを開き、Podfile を含むディレクトリに移動します。
cd <path-to-project>
Pod インストール コマンドを実行します。これにより、Podfile で指定された API が、その依存関係(存在する場合)とともにインストールされます。
pod install
Xcode を閉じ、プロジェクトの .xcworkspace ファイルを開いて(ダブルクリックして)Xcode を起動します。これ以降、プロジェクトを開くには .xcworkspace ファイルを使用する必要があります。
詳しくは、CocoaPods スタートガイドをご覧ください。
手動インストール
XCFramework は、Driver SDK のインストールに使用するバイナリ パッケージです。このパッケージは、Apple シリコンを使用するマシンなど、複数のプラットフォームで使用できます。このガイドでは、Driver SDK を含む XCFramework をプロジェクトに手動で追加し、Xcode でビルド設定を構成する方法について説明します。
SDK バイナリとリソースをダウンロードします。
ファイルを解凍して、XCFramework とリソースにアクセスします。
Xcode を起動し、既存のプロジェクトを開くか、新しいプロジェクトを作成します。iOS を初めて使用する場合は、新しいプロジェクトを作成し、iOS アプリ テンプレートを選択します。
プロジェクト グループにフレームワーク グループがまだ存在しない場合は、作成します。
Driver SDK をインストールするには、[Frameworks, Libraries, and Embedded Content] の下のプロジェクトに
GoogleRidesharingDriver.xcframework
ファイルをドラッグします。プロンプトが表示されたら、必要に応じて [アイテムをコピー] を選択します。ダウンロードした
GoogleRidesharingDriver.bundle
を Xcode プロジェクトの最上位ディレクトリにドラッグします。プロンプトが表示されたら、[Copy items if needed
] を選択します。プロジェクト ナビゲータからプロジェクトを選択し、アプリケーションのターゲットを選択します。
[Build Phases] タブを開き、[Link Binary with Libraries] で、次のフレームワークとライブラリを追加します(まだ存在しない場合)。
Accelerate.framework
AudioToolbox.framework
AVFoundation.framework
CoreData.framework
CoreGraphics.framework
CoreLocation.framework
CoreTelephony.framework
CoreText.framework
GLKit.framework
ImageIO.framework
libc++.tbd
libxml2.tbd
libz.tbd
LocalAuthentication.framework
OpenGLES.framework
QuartzCore.framework
SystemConfiguration.framework
UIKit.framework
WebKit.framework
特定のターゲットではなくプロジェクトを選択し、[Build Settings] タブを開きます。[Other Linker Flags] セクションで、デバッグとリリースの両方に
-ObjC
を追加します。これらの設定が表示されない場合は、[Build Settings] バーのフィルタを [Basic] から [All] に変更します。
Apple Privacy Manifest ファイルを調べる
Apple が App Store のアプリについては、アプリのプライバシーに関する詳細情報を必要とします。最新情報などについては、Apple App Store のプライバシーの詳細ページをご覧ください。
Apple Privacy Manifest ファイルは、SDK のリソース バンドルに含まれています。プライバシー マニフェスト ファイルが含まれていることを確認し、その内容を検査するには、アプリのアーカイブを作成し、そのアーカイブからプライバシー レポートを生成します。
認可と認証を実装する
ドライバアプリがアップデートを生成して Fleet Engine バックエンドに送信する場合、リクエストに有効なアクセス トークンが含まれている必要があります。これらのリクエストを承認および認証するために、Driver SDK は GMTDAuthorization
プロトコルに準拠するオブジェクトを呼び出します。このオブジェクトは、必要なアクセス トークンを提供する役割を担います。
トークンの生成方法は、アプリ デベロッパーが選択します。実装では、次のことができる必要があります。
- HTTPS サーバーからアクセス トークン(JSON 形式など)をフェッチします。
- トークンを解析してキャッシュに保存します。
- 期限切れになったらトークンを更新します。
Fleet Engine サーバーが必要とするトークンの詳細については、承認用の JSON Web Token(JWT)の作成をご覧ください。
プロバイダ ID は Google Cloud プロジェクト ID と同じです。詳細については、Fleet Engine クイックスタート ガイドをご覧ください。
次の例では、アクセス トークン プロバイダを実装しています。
Swift
import GoogleRidesharingDriver
private let providerURL = "INSERT_YOUR_TOKEN_PROVIDER_URL"
class SampleAccessTokenProvider: NSObject, GMTDAuthorization {
private struct AuthToken {
// The cached vehicle token.
let token: String
// Keep track of when the token expires for caching.
let expiration: TimeInterval
// Keep track of the vehicle ID the cached token is for.
let vehicleID: String
}
enum AccessTokenError: Error {
case missingAuthorizationContext
case missingData
}
private var authToken: AuthToken?
func fetchToken(
with authorizationContext: GMTDAuthorizationContext?,
completion: @escaping GMTDAuthTokenFetchCompletionHandler
) {
// Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
guard let authorizationContext = authorizationContext else {
completion(nil, AccessTokenError.missingAuthorizationContext)
return
}
let vehicleID = authorizationContext.vehicleID
// If appropriate, use the cached token.
if let authToken = authToken,
authToken.expiration > Date.now.timeIntervalSince1970 && authToken.vehicleID == vehicleID
{
completion(authToken.token, nil)
return
}
// Otherwise, try to fetch a new token from your server.
let request = URLRequest(url: URL(string: providerURL))
let task = URLSession.shared.dataTask(with: request) { [weak self] data, _, error in
guard let strongSelf = self else { return }
guard error == nil else {
completion(nil, error)
return
}
// Replace the following key values with the appropriate keys based on your
// server's expected response.
let vehicleTokenKey = "VEHICLE_TOKEN_KEY"
let tokenExpirationKey = "TOKEN_EXPIRATION"
guard let data = data,
let fetchData = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
let token = fetchData[vehicleTokenKey] as? String,
let expiration = fetchData[tokenExpirationKey] as? Double
else {
completion(nil, AccessTokenError.missingData)
return
}
strongSelf.authToken = AuthToken(
token: token, expiration: expiration, vehicleID: vehicleID)
completion(token, nil)
}
task.resume()
}
}
Objective-C
#import "SampleAccessTokenProvider.h"
#import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
// SampleAccessTokenProvider.h
@interface SampleAccessTokenProvider : NSObject<GMTDAuthorization>
@end
static NSString *const PROVIDER_URL = @"INSERT_YOUR_TOKEN_PROVIDER_URL";
// SampleAccessTokenProvider.m
@implementation SampleAccessTokenProvider{
// The cached vehicle token.
NSString *_cachedVehicleToken;
// Keep track of the vehicle ID the cached token is for.
NSString *_lastKnownVehicleID;
// Keep track of when tokens expire for caching.
NSTimeInterval _tokenExpiration;
}
- (void)fetchTokenWithContext:(nullable GMTDAuthorizationContext *)authorizationContext
completion:(nonnull GMTDAuthTokenFetchCompletionHandler)completion {
// Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
NSString *vehicleID = authorizationContext.vehicleID;
if (!vehicleID) {
NSAssert(NO, @"Vehicle ID is missing from authorizationContext.");
return;
}
// Clear cached vehicle token if vehicle ID has changed.
if (![_lastKnownVehicleID isEqual:vehicleID]) {
_tokenExpiration = 0.0;
_cachedVehicleToken = nil;
}
_lastKnownVehicleID = vehicleID;
// Clear cached vehicletoken if it has expired.
if ([[NSDate date] timeIntervalSince1970] > _tokenExpiration) {
_cachedVehicleToken = nil;
}
// If appropriate, use the cached token.
if (_cachedVehicleToken) {
completion(_cachedVehicleToken, nil);
return;
}
// Otherwise, try to fetch a new token from your server.
NSURL *requestURL = [NSURL URLWithString:PROVIDER_URL];
NSMutableURLRequest *request =
[[NSMutableURLRequest alloc] initWithURL:requestURL];
request.HTTPMethod = @"GET";
// Replace the following key values with the appropriate keys based on your
// server's expected response.
NSString *vehicleTokenKey = @"VEHICLE_TOKEN_KEY";
NSString *tokenExpirationKey = @"TOKEN_EXPIRATION";
__weak typeof(self) weakSelf = self;
void (^handler)(NSData *_Nullable data, NSURLResponse *_Nullable response,
NSError *_Nullable error) =
^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
typeof(self) strongSelf = weakSelf;
if (error) {
completion(nil, error);
return;
}
NSError *JSONError;
NSMutableDictionary *JSONResponse =
[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&JSONError];
if (JSONError) {
completion(nil, JSONError);
return;
} else {
// Sample code only. No validation logic.
id expirationData = JSONResponse[tokenExpirationKey];
if ([expirationData isKindOfClass:[NSNumber class]]) {
NSTimeInterval expirationTime = ((NSNumber *)expirationData).doubleValue;
strongSelf->_tokenExpiration = [[NSDate date] timeIntervalSince1970] + expirationTime;
}
strongSelf->_cachedVehicleToken = JSONResponse[vehicleTokenKey];
completion(JSONResponse[vehicleTokenKey], nil);
}
};
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *mainQueueURLSession =
[NSURLSession sessionWithConfiguration:config delegate:nil
delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *task = [mainQueueURLSession dataTaskWithRequest:request completionHandler:handler];
[task resume];
}
@end
RidesharingDriverAPI インスタンスを作成する
GMTDVehicleReporter
インスタンスを取得するには、まず providerID、VehicleID、driverContext、accessTokenProvider を使用して GMTDRidesharingDriverAPI
インスタンスを作成する必要があります。providerID は Google Cloud プロジェクト ID と同じです。また、ドライバ API から直接 GMTDVehicleReporter
インスタンスにアクセスできます。
次の例では、GMTDRidesharingDriverAPI
インスタンスを作成します。
Swift
import GoogleRidesharingDriver
private let providerID = "INSERT_YOUR_PROVIDER_ID"
class SampleViewController: UIViewController {
private let mapView: GMSMapView
override func viewDidLoad() {
super.viewDidLoad()
let vehicleID = "INSERT_CREATED_VEHICLE_ID"
let accessTokenProvider = SampleAccessTokenProvider()
let driverContext = GMTDDriverContext(
accessTokenProvider: accessTokenProvider,
providerID: providerID,
vehicleID: vehicleID,
navigator: mapView.navigator)
let ridesharingDriverAPI = GMTDRidesharingDriverAPI(driverContext: driverContext)
}
}
Objective-C
#import "SampleViewController.h"
#import "SampleAccessTokenProvider.h"
#import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
@implementation SampleViewController {
GMSMapView *_mapView;
}
- (void)viewDidLoad {
NSString *vehicleID = @"INSERT_CREATED_VEHICLE_ID";
SampleAccessTokenProvider *accessTokenProvider =
[[SampleAccessTokenProvider alloc] init];
GMTDDriverContext *driverContext =
[[GMTDDriverContext alloc] initWithAccessTokenProvider:accessTokenProvider
providerID:PROVIDER_ID
vehicleID:vehicleID
navigator:_mapView.navigator];
GMTDRidesharingDriverAPI *ridesharingDriverAPI = [[GMTDRidesharingDriverAPI alloc] initWithDriverContext:driverContext];
}
必要に応じて VehicleReporter イベントをリッスンする
locationTrackingEnabled
が true
の場合、GMTDVehicleReporter
は定期的に車両を更新します。このような定期的な更新に応答するために、どのオブジェクトでも GMTDVehicleReporterListener
プロトコルに従って GMTDVehicleReporter
イベントをサブスクライブできます。
次のイベントを処理できます。
vehicleReporter(_:didSucceed:)
バックエンド サービスが車両の位置情報と状態の更新を正常に受信したことをドライバアプリに通知します。
vehicleReporter(_:didFail:withError:)
車両の更新に失敗したことをリスナーに通知します。位置情報トラッキングが有効になっている限り、
GMTDVehicleReporter
は引き続き最新のデータを Fleet Engine バックエンドに送信します。
次の例では、これらのイベントを処理します。
Swift
import GoogleRidesharingDriver
private let providerID = "INSERT_YOUR_PROVIDER_ID"
class SampleViewController: UIViewController, GMTDVehicleReporterListener {
private let mapView: GMSMapView
override func viewDidLoad() {
// Assumes you have implemented the sample code up to this step.
ridesharingDriverAPI.vehicleReporter.add(self)
}
func vehicleReporter(_ vehicleReporter: GMTDVehicleReporter, didSucceed vehicleUpdate: GMTDVehicleUpdate) {
// Handle update succeeded.
}
func vehicleReporter(_ vehicleReporter: GMTDVehicleReporter, didFail vehicleUpdate: GMTDVehicleUpdate, withError error: Error) {
// Handle update failed.
}
}
Objective-C
/*
* SampleViewController.h
*/
@interface SampleViewController : UIViewController<GMTDVehicleReporterListener>
@end
/*
* SampleViewController.m
*/
#import "SampleViewController.h"
#import "SampleAccessTokenProvider.h"
#import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
@implementation SampleViewController {
GMSMapView *_mapView;
}
- (void)viewDidLoad {
// Assumes you have implemented the sample code up to this step.
[ridesharingDriverAPI.vehicleReporter addListener:self];
}
- (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter didSucceedVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate {
// Handle update succeeded.
}
- (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate withError:(NSError *)error {
// Handle update failed.
}
@end
GMTDVehicleReporter をリスナーとして GMSRoadSnappedLocationProvider に追加
Driver SDK に位置情報の更新を提供するには、GMTDVehicleReporter
を GMSRoadSnappedLocationProvider
のリスナーとして設定する必要があります。
Swift
import GoogleRidesharingDriver
private let providerID = "INSERT_YOUR_PROVIDER_ID"
class SampleViewController: UIViewController, GMTDVehicleReporterListener {
private let mapView: GMSMapView
override func viewDidLoad() {
// Assumes you have implemented the sample code up to this step.
if let roadSnappedLocationProvider = mapView.roadSnappedLocationProvider {
roadSnappedLocationProvider.add(ridesharingDriverAPI.vehicleReporter)
roadSnappedLocationProvider.startUpdatingLocation()
}
}
}
Objective-C
/*
* SampleViewController.h
*/
@interface SampleViewController : UIViewController<GMTDVehicleReporterListener>
@end
/*
* SampleViewController.m
*/
#import "SampleViewController.h"
#import "SampleAccessTokenProvider.h"
#import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
@implementation SampleViewController {
GMSMapView *_mapView;
}
- (void)viewDidLoad {
// Assumes you have implemented the sample code up to this step.
[_mapView.roadSnappedLocationProvider addListener:ridesharingDriverAPI.vehicleReporter];
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
}
@end
位置情報追跡を有効にする
位置情報追跡を有効にするには、アプリで GMTDVehicleReporter
で locationTrackingEnabled
を true
に設定します。GMTDVehicleReporter
は位置情報の更新を自動的に送信します。サービスによって車両がルートに割り当てられると、GMSNavigator
がナビゲーション モードのとき(setDestinations
で目的地が設定されている場合)に、GMTDVehicleReporter
がルートの更新を自動的に送信します。
ルートの更新中に設定されるルートは、ナビゲーション セッション中にドライバーが移動するのと同じルートです。したがって、乗車経路の共有が適切に機能するには、setDestinations
で設定された地点が Fleet Engine バックエンドで設定された目的地と一致する必要があります。
locationTrackingEnabled
が true
に設定されている場合、ルートと車両の最新情報は、locationUpdateInterval
に設定された値に基づいて定期的に Fleet Engine バックエンドに送信されます。locationTrackingEnabled
が false
に設定されている場合、停車地が更新され、最後の車両更新リクエストが Fleet Engine バックエンドに送信され、車両の状態が GMTDVehicleState.offline
に設定されます。locationTrackingEnabled
が false
に設定されている場合の失敗処理に関する特別な考慮事項については、updateVehicleState
をご覧ください。
次の例では、位置情報追跡を有効にします。
Swift
import GoogleRidesharingDriver
private let providerID = "INSERT_YOUR_PROVIDER_ID"
class SampleViewController: UIViewController, GMTDVehicleReporterListener {
private let mapView: GMSMapView
override func viewDidLoad() {
// Assumes you have implemented the sample code up to this step.
ridesharingDriverAPI.vehicleReporter.locationTrackingEnabled = true
}
}
Objective-C
/*
* SampleViewController.m
*/
#import "SampleViewController.h"
#import "SampleAccessTokenProvider.h"
#import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
@implementation SampleViewController {
GMSMapView *_mapView;
}
- (void)viewDidLoad {
// Assumes you have implemented the sample code up to this step.
ridesharingDriverAPI.vehicleReporter.locationTrackingEnabled = YES;
}
@end
デフォルトでは、レポート間隔は 10 秒ですが、locationUpdateInterval
でレポート間隔を変更できます。サポートされている最小更新間隔は 5 秒です。サポートされている最大更新間隔は 60 秒です。更新頻度を高くすると、リクエストが遅くなり、エラーが発生する可能性があります。
車両の状態を更新する
次の例は、車両の状態を ONLINE
に設定する方法を示しています。詳しくは、updateVehicleState
をご覧ください。
Swift
import GoogleRidesharingDriver
private let providerID = "INSERT_YOUR_PROVIDER_ID"
class SampleViewController: UIViewController, GMTDVehicleReporterListener {
private let mapView: GMSMapView
override func viewDidLoad() {
// Assumes you have implemented the sample code up to this step.
ridesharingDriverAPI.vehicleReporter.update(.online)
}
}
Objective-C
#import "SampleViewController.h"
#import "SampleAccessTokenProvider.h"
#import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
@implementation SampleViewController {
GMSMapView *_mapView;
}
- (void)viewDidLoad {
// Assumes you have implemented the sample code up to this step.
[ridesharingDriverAPI.vehicleReporter
updateVehicleState:GMTDVehicleStateOnline];
}
@end
update_mask
エラーはマスクが空の場合に発生する可能性があり、通常は起動後の最初の更新時に発生します。次の例は、このエラーを処理する方法を示しています。
Swift
import GoogleRidesharingDriver
class VehicleReporterListener: NSObject, GMTDVehicleReporterListener {
func vehicleReporter(
_ vehicleReporter: GMTDVehicleReporter,
didFail vehicleUpdate: GMTDVehicleUpdate,
withError error: Error
) {
let fullError = error as NSError
if let innerError = fullError.userInfo[NSUnderlyingErrorKey] as? NSError {
let innerFullError = innerError as NSError
if innerFullError.localizedDescription.contains("update_mask cannot be empty") {
emptyMaskUpdates += 1
return
}
}
failedUpdates += 1
}
override init() {
emptyMaskUpdates = 0
failedUpdates = 0
}
}
Objective-C
#import "VehicleReporterListener.h"
#import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
@implementation VehicleReporterListener {
NSInteger emptyMaskUpdates = 0;
NSInteger failedUpdates = 0;
}
- (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter
didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate
withError:(NSError *)error {
for (NSError *underlyingError in error.underlyingErrors) {
if ([underlyingError.localizedDescription containsString:@"update_mask cannot be empty"]) {
emptyMaskUpdates += 1;
return;
}
}
failedUpdates += 1
}
@end
位置情報の更新を無効にして、車両をオフラインにする
アプリで更新を無効にし、車両をオフラインにすることができます。たとえば、運転手のシフトが終了したときに、アプリは locationTrackingEnabled
を false
に設定できます。更新を無効にすると、Fleet Engine バックエンドでも車両のステータスが OFFLINE
に設定されます。
Swift
vehicleReporter.locationTrackingEnabled = false
Objective-C
_vehicleReporter.locationTrackingEnabled = NO;