Driver SDK คือไลบรารีที่คุณผสานรวมเข้ากับแอปไดรเวอร์ ใช่เลย มีหน้าที่อัปเดต Fleet Engine ด้วยตำแหน่ง เส้นทาง และตำแหน่งของคนขับ ระยะทางที่เหลืออยู่และเวลาถึงโดยประมาณ และยังผสานรวมกับ Navigation SDK ซึ่ง ให้คำแนะนำการนำทางแบบเลี้ยวต่อเลี้ยวสำหรับผู้ขับ
ข้อกำหนดขั้นต่ำของระบบ
ข้อกำหนดเบื้องต้น
คู่มือนี้จะถือว่าแอปของคุณใช้ SDK การนำทาง เครื่องมือค้นหาFleet Engine ตั้งค่าแบ็กเอนด์และพร้อมใช้งาน แต่โค้ดตัวอย่างจะมี ตัวอย่างวิธีตั้งค่า SDK การนำทาง
คุณต้องเปิดใช้งาน Maps SDK สำหรับ iOS ด้วย ในโปรเจ็กต์ Google Cloud และรับคีย์ API
รับสิทธิ์เข้าถึง
หากคุณเป็นลูกค้า Google Workspace ให้สร้าง
กลุ่มพื้นที่ทำงาน เช่น
google-maps-platform-sdk-users@workspacedomain.com
ระหว่างการเริ่มต้นใช้งานและ
ระบุชื่อให้กับ Google เราแนะนำให้ใช้วิธีนี้
ระบบจะเพิ่มกลุ่ม Workspace ของคุณไปยังรายการที่อนุญาตที่
ให้สิทธิ์เข้าถึงที่เก็บ CocoaPods ที่ถูกต้อง ยืนยันว่าผู้ใช้
อีเมลและบัญชีบริการที่ต้องมีสิทธิ์เข้าถึงจะรวมอยู่ในรายการนี้
หากองค์กรสร้างกลุ่ม Workspace ไม่ได้ ให้ส่งรายชื่อให้ Google อีเมลของผู้ใช้และบัญชีบริการที่ต้องการสิทธิ์เข้าถึงอาร์ติแฟกต์เหล่านี้
การพัฒนาในพื้นที่
สำหรับการพัฒนาในเครื่อง การเข้าสู่ระบบด้วย Cloud SDK
gcloud
gcloud auth login
อีเมลที่ใช้เข้าสู่ระบบต้องเป็นสมาชิกของกลุ่ม Workspace
การทำงานอัตโนมัติ (สร้างระบบหรือการผสานรวมอย่างต่อเนื่อง)
ตั้งค่าโฮสต์อัตโนมัติตาม แนวทางปฏิบัติแนะนำ
หากกระบวนการทำงานภายในสภาพแวดล้อม Google Cloud ให้ใช้ อัตโนมัติ การตรวจหาข้อมูลเข้าสู่ระบบ
หรือเก็บไฟล์คีย์บัญชีบริการไว้ในที่ปลอดภัยบน ระบบไฟล์ของโฮสต์และตั้งค่า GOOGLE_APPLICATION_CREDENTIALS ตัวแปรสภาพแวดล้อมได้อย่างเหมาะสม
อีเมลบัญชีบริการที่เชื่อมโยงกับข้อมูลเข้าสู่ระบบต้องเป็นสมาชิกของ Workspace Goup
การกำหนดค่าโปรเจ็กต์
คุณกำหนดค่า Driver SDK โดยใช้ CocoaPods ได้
ใช้ CocoaPods
หากต้องการกำหนดค่า Driver SDK โดยใช้ CocoaPods คุณต้องมีรายการต่อไปนี้
- เครื่องมือ CocoaPods: หากต้องการติดตั้งเครื่องมือนี้ ให้เปิดเทอร์มินัลและเรียกใช้
คำสั่งต่อไปนี้
shell sudo gem install cocoapods
โปรดดู คู่มือเริ่มต้นใช้งาน CocoaPods เพื่อดูรายละเอียดเพิ่มเติม
สร้าง Podfile สำหรับ Driver SDK และใช้เพื่อติดตั้ง API และการขึ้นต่อกัน: สร้างไฟล์ชื่อ Podfile ในโปรเจ็กต์ของคุณ ไดเรกทอรี ไฟล์นี้ระบุทรัพยากร Dependency ของโปรเจ็กต์ แก้ไข Podfile และเพิ่มทรัพยากร Dependency ได้ นี่คือตัวอย่างที่มี ทรัพยากร Dependency:
source "https://github.com/CocoaPods/Specs.git" target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GoogleRidesharingDriver' end
บันทึก Podfile เปิดเทอร์มินัลและไปที่ไดเรกทอรีที่มี Podfile:
cd <path-to-project>
เรียกใช้คำสั่งติดตั้งพ็อด การดำเนินการนี้จะติดตั้ง API ที่ระบุไว้ใน Podfile รวมถึงทรัพยากร Dependency ต่างๆ ที่อาจมี
pod install
ปิด Xcode แล้วเปิด (ดับเบิลคลิก) ไฟล์ .xcworkspace ของโปรเจ็กต์ เพื่อเปิด Xcode ตั้งแต่นี้เป็นต้นไป คุณต้องใช้ไฟล์ .xcworkspace เพื่อเปิดโปรเจ็กต์
SDK เวอร์ชันอัลฟ่า/เบต้า
หากต้องการกำหนดค่า Driver SDK เวอร์ชันอัลฟ่าหรือเบต้าสำหรับ iOS คุณต้องมี รายการต่อไปนี้
เครื่องมือ CocoaPods: หากต้องการติดตั้งเครื่องมือนี้ ให้เปิดเทอร์มินัลและเรียกใช้ คำสั่งต่อไปนี้
sudo gem install cocoapods
โปรดดู คู่มือเริ่มต้นใช้งาน CocoaPods เพื่อดูรายละเอียดเพิ่มเติม
บัญชีการพัฒนาของคุณในรายการเข้าถึงของ Google ที่เก็บพ็อด ของ SDK เวอร์ชันอัลฟ่าและเบต้าไม่ใช่แหล่งที่มาสาธารณะ ถึง โปรดติดต่อวิศวกรลูกค้าของ Google วิศวกรจะเพิ่มบัญชีการพัฒนาของคุณลงในรายการเข้าถึง จากนั้น ตั้งค่าคุกกี้สำหรับ การตรวจสอบสิทธิ์
หลังจากโปรเจ็กต์อยู่ในรายการเข้าถึง คุณจะเข้าถึงพ็อดได้
สร้าง Podfile สำหรับ Driver SDK สำหรับ iOS และใช้เพื่อติดตั้ง API และการขึ้นต่อกัน: สร้างไฟล์ชื่อ Podfile ในโปรเจ็กต์ของคุณ ไดเรกทอรี ไฟล์นี้ระบุทรัพยากร Dependency ของโปรเจ็กต์ แก้ไข Podfile และเพิ่มทรัพยากร Dependency ได้ นี่คือตัวอย่างที่มี ทรัพยากร Dependency:
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>
เรียกใช้คำสั่งติดตั้งพ็อด การดำเนินการนี้จะติดตั้ง API ที่ระบุไว้ใน Podfile รวมถึงทรัพยากร Dependency ต่างๆ ที่อาจมี
pod install
ปิด Xcode แล้วเปิด (ดับเบิลคลิก) ไฟล์ .xcworkspace ของโปรเจ็กต์ เพื่อเปิด Xcode ตั้งแต่นี้เป็นต้นไป คุณต้องใช้ไฟล์ .xcworkspace เพื่อเปิดโปรเจ็กต์
ติดตั้ง XCFramework
XCFramework เป็นแพ็กเกจไบนารีที่คุณใช้ติดตั้ง Driver SDK คุณใช้แพ็กเกจนี้ได้ในหลายแพลตฟอร์ม รวมถึงเครื่องที่ใช้ชิปเซ็ต M1 คู่มือนี้จะแสดงวิธีเพิ่ม XCFramework ที่มี Driver SDK ลงในโปรเจ็กต์ด้วยตนเองและกำหนดการตั้งค่าบิลด์ใน Xcode
ดาวน์โหลดไบนารี SDK และทรัพยากร ดังนี้
แตกไฟล์ ZIP เพื่อเข้าถึง XCFramework และทรัพยากร
เริ่มต้น Xcode และเปิดโปรเจ็กต์ที่มีอยู่หรือสร้างโปรเจ็กต์ใหม่ หากเพิ่งเริ่มใช้ iOS ให้สร้างโปรเจ็กต์ใหม่และเลือกเทมเพลตแอป iOS
สร้างกลุ่มเฟรมเวิร์กภายใต้กลุ่มโปรเจ็กต์หากยังไม่มี
ลากไฟล์
gRPCCertificates.bundle
ที่ดาวน์โหลดมาไปยังไดเรกทอรีระดับบนสุดของโปรเจ็กต์ Xcode เมื่อมีข้อความแจ้ง ให้เลือกคัดลอกรายการหากจำเป็นหากต้องการติดตั้ง Driver SDK ให้ลากไฟล์
GoogleRidesharingDriver.xcframework
ไปไว้ในโปรเจ็กต์ในส่วนเฟรมเวิร์ก ไลบรารี และเนื้อหาที่ฝัง เมื่อมีข้อความแจ้ง ให้เลือกคัดลอกรายการหากจำเป็นลาก
GoogleRidesharingDriver.bundle
ที่ดาวน์โหลดมาไปยังไดเรกทอรีระดับบนสุดของโปรเจ็กต์ Xcode เมื่อมีข้อความแจ้ง ให้เลือกCopy items if needed
เลือกโปรเจ็กต์จาก Project Navigator แล้วเลือกเป้าหมายของแอปพลิเคชัน
เปิดแท็บระยะของการสร้างและในลิงก์ไบนารีกับไลบรารี ให้เพิ่มเฟรมเวิร์กและไลบรารีต่อไปนี้หากยังไม่มี
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
เลือกโปรเจ็กต์แทนเป้าหมายที่เฉพาะเจาะจง แล้วเปิดแท็บการตั้งค่าบิลด์ ในส่วนแฟล็กอื่นๆ ของ Linker ให้เพิ่ม
‑ObjC
สำหรับทั้งการแก้ไขข้อบกพร่องและรุ่น หากไม่เห็นการตั้งค่าเหล่านี้ ให้เปลี่ยนตัวกรองในแถบการตั้งค่าการสร้างจากพื้นฐานเป็นทั้งหมด
ตรวจสอบไฟล์ Manifest ด้านความเป็นส่วนตัวของ Apple
Apple ต้องการรายละเอียดความเป็นส่วนตัวของแอปสำหรับแอปใน App Store ไปที่หน้ารายละเอียดความเป็นส่วนตัวของ Apple App Store เพื่อดูข้อมูลอัปเดตและข้อมูลเพิ่มเติม
ไฟล์ Manifest ด้านความเป็นส่วนตัวของ Apple จะรวมอยู่ในแพ็กเกจทรัพยากรของ SDK หากต้องการตรวจสอบว่าไฟล์ Manifest สำหรับความเป็นส่วนตัวรวมอยู่ในไฟล์แล้ว และต้องการตรวจสอบเนื้อหา ให้สร้างที่เก็บถาวรของแอปแล้วสร้างรายงานความเป็นส่วนตัวจากที่เก็บถาวร
ใช้การให้สิทธิ์และการตรวจสอบสิทธิ์
เมื่อแอป Driver สร้างและส่งอัปเดตไปยังแบ็กเอนด์ Fleet Engine
คำขอต้องมีโทเค็นเพื่อการเข้าถึงที่ถูกต้อง หากต้องการให้สิทธิ์และ
ตรวจสอบสิทธิ์คำขอเหล่านี้ Driver SDK จะเรียกออบเจ็กต์ของคุณตาม
GMTDAuthorization
ออบเจ็กต์มีหน้าที่ระบุโทเค็นเพื่อการเข้าถึงที่จำเป็น
ในฐานะนักพัฒนาแอป คุณเลือกวิธีสร้างโทเค็นได้ การใช้งานของคุณ ควรให้ความสามารถในการดำเนินการต่อไปนี้
- เรียกโทเค็นเพื่อการเข้าถึงซึ่งอาจอยู่ในรูปแบบ JSON จากเซิร์ฟเวอร์ HTTPS
- แยกวิเคราะห์และแคชโทเค็น
- โปรดรีเฟรชโทเค็นเมื่อหมดอายุ
โปรดดูรายละเอียดโทเค็นที่เซิร์ฟเวอร์ Fleet Engine คาดหวังที่ การสร้าง JSON Web Token (JWT) สำหรับการให้สิทธิ์
รหัสผู้ให้บริการจะเหมือนกับรหัสโปรเจ็กต์ Google Cloud โปรดดูคู่มือผู้ใช้ Fleet Engine Deliveries API เพื่อดูข้อมูลเพิ่มเติม
ตัวอย่างต่อไปนี้ใช้ผู้ให้บริการโทเค็นเพื่อการเข้าถึง
#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 {
if (!completion) {
NSAssert(NO, @"%s encountered an unexpected nil completion.", __PRETTY_FUNCTION__);
return;
}
// 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 vehicle token 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
สร้างอินสแตนซ์ DeliveryDriverAPI
หากต้องการรับอินสแตนซ์ GMTDDeliveryVehicleReporter
คุณต้องสร้างอินสแตนซ์ก่อน
GMTDDeliveryDriverAPI
อินสแตนซ์ที่ใช้ providerID
พาหนะID, driverContext และ accessTokenProvider providerID จะเหมือนกับ
รหัสโปรเจ็กต์ Google Cloud และคุณสามารถเข้าถึง GMTDDeliveryVehicleReporter
อินสแตนซ์จาก Driver API โดยตรง
ตัวอย่างต่อไปนี้จะสร้างอินสแตนซ์ GMTDDeliveryDriverAPI
#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];
GMTDDeliveryDriverAPI *deliveryDriverAPI = [[GMTDDeliveryDriverAPI alloc] initWithDriverContext:driverContext];
}
เลือกฟังเหตุการณ์ของ DeviceReporter
GMTDDeliveryVehicleReporter
จะอัปเดตยานพาหนะเป็นระยะเมื่อ
locationTrackingEnabled
คือ "ใช่" เพื่อตอบสนองต่อการอัปเดตเป็นระยะเหล่านี้
ออบเจ็กต์สามารถสมัครรับข้อมูลเหตุการณ์ GMTDDeliveryVehicleReporter
ได้โดยเป็นไปตาม
โปรโตคอล GMTDVehicleReporterListener
โดยคุณจะจัดการเหตุการณ์ต่อไปนี้ได้
vehicleReporter:didSucceedVehicleUpdate
แจ้งแอปไดรเวอร์ว่าบริการแบ็กเอนด์ได้รับ ตำแหน่งรถและการอัปเดตสถานะ
vehicleReporter:didFailVehicleUpdate:withError
แจ้งผู้ฟังว่าการอัปเดตยานพาหนะล้มเหลว ระบุตำแหน่งที่ตั้ง การติดตามเปิดใช้อยู่
GMTDDeliveryVehicleReporter
จะยังคงส่ง ข้อมูลล่าสุดไปยังแบ็กเอนด์ Fleet Engine
ตัวอย่างต่อไปนี้จัดการกับเหตุการณ์เหล่านี้
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 IMPLEMENTED HAVE THE SAMPLE CODE UP TO THIS STEP.
[ridesharingDriverAPI.vehicleReporter addListener:self];
}
- (void)vehicleReporter:(GMTDDeliveryVehicleReporter *)vehicleReporter didSucceedVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate {
// Handle update succeeded.
}
- (void)vehicleReporter:(GMTDDeliveryVehicleReporter *)vehicleReporter didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate withError:(NSError *)error {
// Handle update failed.
}
@end
เปิดใช้การติดตามตำแหน่ง
หากต้องการเปิดใช้การติดตามตำแหน่ง แอปของคุณตั้งค่า locationTrackingEnabled
เป็น YES
ได้
ในวันที่ GMTDDeliveryVehicleReporter
จากนั้น GMTDDeliveryVehicleReporter
จะ =
ส่งการอัปเดตตำแหน่งโดยอัตโนมัติ เมื่อGMSNavigator
อยู่ในการนำทาง
(เมื่อตั้งค่าปลายทางผ่าน setDestinations
) และ
ตั้งค่า locationTrackingEnabled
เป็น YES
และ GMTDDeliveryVehicleReporter
จะ
ส่งข้อมูลอัปเดตเส้นทางและเวลาถึงโดยประมาณโดยอัตโนมัติด้วย
เส้นทางที่กำหนดไว้ในการอัปเดตเหล่านั้นจะเป็นเส้นทางเดียวกับที่คนขับใช้
ไปที่ ระหว่างเซสชันการนำทาง ดังนั้นเพื่อให้การติดตามการจัดส่งใช้งานได้
จุดอ้างอิงที่กำหนดผ่าน -setDestinations:callback:
ควรตรงกับ
ปลายทางที่กำหนดในแบ็กเอนด์ Fleet Engine
ตัวอย่างต่อไปนี้เปิดใช้การติดตามตำแหน่ง
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 IMPLEMENTED HAVE THE SAMPLE CODE UP TO THIS STEP.
deliveryDriverAPI.vehicleReporter.locationTrackingEnabled = YES;
}
@end
ตามค่าเริ่มต้น ช่วงเวลาการรายงานคือ 10 วินาที แต่ช่วงเวลาการรายงานสามารถ
เปลี่ยนแปลงได้ด้วย locationUpdateInterval
ช่วงเวลาการอัปเดตขั้นต่ำที่รองรับ
5 วินาที ช่วงเวลาการอัปเดตที่รองรับสูงสุดคือ 60 วินาที บ่อยขึ้น
การอัปเดตอาจทำให้คำขอทำงานช้าลงและเกิดข้อผิดพลาด
ปิดใช้งานการอัปเดตตำแหน่ง
แอปของคุณสามารถปิดใช้การอัปเดตตำแหน่งของรถได้ ตัวอย่างเช่น เมื่อ
หมดกะของคนขับรถ แอปของคุณตั้งค่า locationTrackingEnabled
เป็น NO
ได้
_vehicleReporter.locationTrackingEnabled = NO
จัดการข้อผิดพลาด update_mask
เมื่อ GMTDDeliveryVehicleReporter
ส่งการอัปเดตยานพาหนะ 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