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 です。
プロジェクト構成
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 のスタートガイド ガイド 表示されます。
手動インストール
<ph type="x-smartling-placeholder">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;