Driver SDK を使用すると、ナビゲーションとトラッキングの強化を 移動と注文の進行状況アプリケーション。Driver SDK は On-demand Rides and Deliveries Solution Fleet Engine に位置情報とタスクを更新します。
Driver SDK を使用すると、Fleet Engine サービスとカスタム サービスで
車両の位置と状態を指定します。たとえば、車両は ONLINE
または
OFFLINE
: ルートの進行に伴って車両の位置情報が変化する。
最小システム要件
前提条件
このガイドでは、アプリに Navigation API が実装されていることを前提としています。 SDKとフリートの エンジン 使用できることを確認します。ただし、サンプルコードでは、インフラストラクチャの Navigation SDK の設定方法
また、Maps SDK for iOS も有効にする必要があります。 Google Cloud プロジェクトに保存してAPI を Key です。
Project Configuration
Swift Package Manager
Driver SDK は からインストールできます。 Swift Package Manager。SDK を追加するには、 Driver SDK の既存の依存関係をすべて削除しました。
新規または既存のプロジェクトに SDK を追加する手順は次のとおりです。
-
Xcode
project
またはworkspace
を開き、[File >パッケージの依存関係を追加する。 - URL として「https://github.com/googlemaps/ios-driver-sdk」と入力し、Enter キーを押します。 [パッケージを追加]をクリックします
-
特定の
version
をインストールするには、[Dependency Rule] フィールドを次のいずれかに設定します。 オプションを提供します。新しいプロジェクトの場合は、最新バージョンと 1 つのバージョンを 「正確なバージョン」を使用して選択します。完了したら、[Add Package] をクリックします。 -
[Choose Package Products] ウィンドウで、
GoogleRidesharingDriver
が以下に追加されることを確認します。 指定したmain
の目標値。完了したら、[Add Package] をクリックします。 -
インストールを確認するには、ターゲットの
General
ペインに移動します。 [Frameworks, Libraries, and Embedded Content] に、インストールされたパッケージが表示されます。 [Package Dependencies] ビューもセクション(プロジェクト ナビゲーター) パッケージとそのバージョンを確認します。
既存のプロジェクトの package
を更新する手順は次のとおりです。
9.0.0 より前のバージョンからアップグレードする場合は、 次の依存関係:
GoogleMapsBase
、GoogleMapsCore
、 アップグレード後にGoogleMapsM4B
。次の依存関係を削除しないでください。GoogleMaps
。詳しくは、 バージョン 9.0.0 リリースノート。Xcode プロジェクト構成設定で、フレームワーク、ライブラリ、 および埋め込みコンテンツをご覧ください。マイナス記号(-)を使用して、次のフレームワークを削除します。
GoogleMapsBase
(9.0.0 より前のバージョンからのアップグレードのみ)GoogleMapsCore
(9.0.0 より前のバージョンからのアップグレードのみ)GoogleMapsM4B
(9.0.0 より前のバージョンからのアップグレードのみ)
- Xcode で、[File] > [パッケージ >最新のパッケージ バージョンへの更新」を選択します。
- インストールを確認するには、Project Navigator の [Package Dependencies] セクションに移動します。 パッケージとそのバージョンを確認します。
以下を使用して追加された既存の Driver SDK 依存関係を削除するには、
CocoaPods
の手順は次のとおりです。
- Xcode ワークスペースを閉じます。ターミナルを開き、次のコマンドを実行します。
sudo gem install cocoapods-deintegrate cocoapods-clean pod deintegrate pod cache clean --all
-
Podfile
、Podfile.resolved
、および CocoaPods 以外で使用していない場合には、Xcodeworkspace
です。
インストールされている既存の 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
ここに示す例には、Terraform の Alpha Pod と Beta Pod が含まれています。 Driver SDK を依存関係として使用する場合:
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 インストール コマンドを実行します。これにより、指定した API がインストールされます。 Podfile とそれらの依存関係が存在します。
pod install
Xcode を閉じて、プロジェクトの .xcworkspace を開く(ダブルクリック) Xcode を起動します。これ以降は、 .xcworkspace ファイルを開いてプロジェクトを開きます。
詳しくは、CocoaPods のスタートガイド ガイド 表示されます。
手動インストール
XCFramework は、インストールに使用するバイナリ パッケージで、 Driver SDKこのパッケージは複数の プラットフォーム(Apple シリコン。このガイドでは、 XCFramework を手動で追加し、 Driver SDK をプロジェクトに追加してビルドを設定する Xcode で設定します。
SDK バイナリとリソースをダウンロードします。
ファイルを解凍して、XCFramework とリソースにアクセスします。
Xcode を起動し、既存のプロジェクトを開くか、新しいプロジェクトを作成します。 できます。iOS を初めて使用する場合は、新しいプロジェクトを作成して [iOS] を選択します。 アプリ テンプレート。
フレームワーク グループが存在しない場合は、プロジェクト グループにフレームワーク グループを作成します。 すでにあります。
Driver SDK をインストールするには、
GoogleRidesharingDriver.xcframework
ファイルを、 フレームワーク、ライブラリ、埋め込みコンテンツ。プロンプトが表示されたら、 必要に応じてアイテムをコピーします。ダウンロードした
GoogleRidesharingDriver.bundle
をトップレベルにドラッグします ディレクトリに移動します。プロンプトが表示されたら、[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 設定タブ。[その他のリンカーフラグ] セクションで、
-ObjC
デバッグとリリースの両方に対応しています。これらの設定が表示されない場合は、 Build 設定バーで [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
インスタンスを取得するには、まず、
GMTDRidesharingDriverAPI
driveContext と accessTokenProvider です。providerID は Google ID と同じです。
Cloud プロジェクト ID。また、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 イベントをリッスンする
GMTDVehicleReporter
は、次のタイミングで定期的に車両を更新します。
locationTrackingEnabled
は true
です。このような定期的な更新に対応するために、
オブジェクトは、次に準拠することで、GMTDVehicleReporter
イベントをサブスクライブできます。
GMTDVehicleReporterListener
プロトコル。
次のイベントを処理できます。
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
位置情報追跡を有効にする
位置情報追跡を有効にするには、アプリで locationTrackingEnabled
を
GMTDVehicleReporter
の true
。GMTDVehicleReporter
は自動的に
位置情報の更新サービスが一致し、車両をルートに割り当てたら、
GMSNavigator
になると GMTDVehicleReporter
がルートの更新情報を自動送信します
ナビゲーション モードになっている(setDestinations
でデスティネーションが設定されている場合)。
ルートの更新時に設定されたルートは、ドライバーが使用しているルートと同じになります。
ナビゲーションセッション中に
移動することもできますそのため、ジャーニーを
setDestinations
で設定されたウェイポイントは、
Fleet Engine バックエンドで設定された宛先の数を表します。
locationTrackingEnabled
が true
に設定されている場合は、ルートと車両の最新情報が送信されます。
Fleet Engine バックエンドに一定の間隔で送信されます。
locationUpdateInterval
。locationTrackingEnabled
が false
に設定されている場合:
更新が停車地に更新され、最終的な車両更新リクエストが Fleet Engine に送信されます。
車両の状態を GMTDVehicleState.offline
に設定します。詳しくは、
updateVehicleState
locationTrackingEnabled
のときのエラー処理に関する特別な考慮事項
false
に設定されます。
次の例では、位置情報追跡を有効にします。
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
エラーは、マスクが空の場合に発生することがあります。通常、このエラーが発生します。
自動的にダウンロードされます。次の例は、BigQuery から
このエラーが表示されます。
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;