คุณสามารถใช้ SDK ไดรเวอร์เพื่อให้การนำทางและการติดตามที่ดียิ่งขึ้นแก่แอปพลิเคชันการเดินทางและความคืบหน้าในการสั่งซื้อ Driver SDK จะให้บริการตำแหน่งยานพาหนะและการอัปเดตงานของขบวนพาหนะบริการรถโดยสารและการนำส่งแบบออนดีมานด์
Driver SDK ช่วยให้บริการ Fleet Engine และบริการที่กำหนดเองทราบตำแหน่งและสถานะของรถอยู่เสมอ ตัวอย่างเช่น ยานพาหนะอาจเป็น ONLINE
หรือ OFFLINE
ก็ได้ และตำแหน่งยานพาหนะจะเปลี่ยนแปลงไปตามการเดินทาง
ข้อกำหนดขั้นต่ำของระบบ
ข้อกำหนดเบื้องต้น
คู่มือนี้จะถือว่าแอปของคุณใช้ Navigation SDK และแบ็กเอนด์ Fleet Engine ได้รับการตั้งค่าและพร้อมให้บริการแล้ว อย่างไรก็ตาม โค้ดตัวอย่างจะแสดงตัวอย่างวิธีตั้งค่า Navigation SDK
คุณต้องเปิดใช้ Maps SDK สำหรับ iOS ในโปรเจ็กต์ Google Cloud และรับคีย์ API ด้วย
การกำหนดค่าโปรเจ็กต์
ผู้จัดการแพ็กเกจของ Swift
Driver SDK ติดตั้งได้ผ่าน Swift Package Manager หากต้องการเพิ่ม SDK ให้ตรวจสอบว่าคุณได้นำทรัพยากร Dependency ของ Driver SDK ที่มีอยู่ออกแล้ว
หากต้องการเพิ่ม SDK ลงในโปรเจ็กต์ใหม่หรือโปรเจ็กต์ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้
-
เปิด Xcode
project
หรือworkspace
แล้วไปที่ไฟล์ > เพิ่มการอ้างอิงแพ็กเกจ - ป้อน https://github.com/googlemaps/ios-driver-sdk เป็น URL กด Enter เพื่อดึงแพ็กเกจ แล้วคลิก "เพิ่มแพ็กเกจ"
-
หากต้องการติดตั้ง
version
ที่เจาะจง ให้ตั้งค่าช่องกฎการขึ้นต่อกันเป็นหนึ่งในตัวเลือกตามเวอร์ชัน สำหรับโปรเจ็กต์ใหม่ เราขอแนะนำให้ระบุเวอร์ชันล่าสุดและใช้ตัวเลือก "เวอร์ชันที่แน่นอน" เมื่อเสร็จแล้ว ให้คลิก "เพิ่มแพ็กเกจ" -
จากหน้าต่างเลือกผลิตภัณฑ์แพ็กเกจ โปรดยืนยันว่าจะเพิ่ม
GoogleRidesharingDriver
ไปยังเป้าหมายmain
ที่กำหนดไว้ เมื่อเสร็จแล้ว ให้คลิก "เพิ่มแพ็กเกจ" -
ไปที่แผง
General
ของเป้าหมายเพื่อยืนยันการติดตั้ง คุณจะเห็นแพ็กเกจที่ติดตั้งไว้ในเฟรม ไลบรารี และเนื้อหาที่ฝัง นอกจากนี้ คุณยังสามารถดูส่วน "ทรัพยากร Dependency ของแพ็กเกจ" ของ "ตัวนำทางโปรเจ็กต์" เพื่อยืนยันแพ็กเกจและเวอร์ชันได้ด้วย
หากต้องการอัปเดต package
สำหรับโปรเจ็กต์ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้
- จาก Xcode ให้ไปที่ "ไฟล์ > แพ็กเกจ > อัปเดตเป็นแพ็กเกจเวอร์ชันล่าสุด"
- หากต้องการยืนยันการติดตั้ง ให้ไปที่ส่วนทรัพยากร Dependency ของแพ็กเกจของตัวนำทางโปรเจ็กต์เพื่อยืนยันแพ็กเกจและเวอร์ชันของแพ็กเกจ
หากต้องการนำทรัพยากร Dependency ของ Driver SDK ที่มีอยู่ออกโดยใช้ CocoaPods
ให้ทำตามขั้นตอนต่อไปนี้
- ปิดพื้นที่ทำงาน Xcode เปิดเทอร์มินัลและเรียกใช้คำสั่งต่อไปนี้
sudo gem install cocoapods-deintegrate cocoapods-clean pod deintegrate pod cache clean --all
-
นำ
Podfile
,Podfile.resolved
และ Xcodeworkspace
ออกหากไม่ได้ใช้งานในทางอื่นใดนอกเหนือจาก CocoaPods
หากต้องการนำ SDK ไดรเวอร์ที่มีอยู่ออก ซึ่งติดตั้งไว้ด้วยตัวเอง โปรดทำตามขั้นตอนต่อไปนี้
จากการตั้งค่าการกำหนดค่าโปรเจ็กต์ Xcode ให้ค้นหา Frameworks, Libraries, และเนื้อหาที่ฝัง ใช้เครื่องหมายลบ
(-)
เพื่อนำเฟรมเวิร์กต่อไปนี้ออกGoogleRidesharingDriver.xcframework
นำแพ็กเกจ
GoogleRidesharingDriver
ออกจากไดเรกทอรีระดับบนสุดของโปรเจ็กต์ Xcode
CocoaPods
หากต้องการกำหนดค่า Driver SDK โดยใช้ CocoaPods คุณต้องมีรายการต่อไปนี้
- เครื่องมือ CocoaPods: หากต้องการติดตั้งเครื่องมือนี้ ให้เปิดเทอร์มินัลแล้วเรียกใช้คำสั่งต่อไปนี้
sudo gem install cocoapods
สร้าง Podfile สำหรับ Driver SDK และใช้เพื่อติดตั้ง API และทรัพยากร Dependency ด้วย สร้างไฟล์ชื่อ Podfile ในไดเรกทอรีโปรเจ็กต์ ไฟล์นี้ระบุทรัพยากร Dependency ของโปรเจ็กต์ แก้ไข Podfile และเพิ่มทรัพยากร Dependency นี่คือตัวอย่างที่รวมทรัพยากร Dependency
source "https://github.com/CocoaPods/Specs.git" target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GoogleRidesharingDriver' end
ต่อไปนี้คือตัวอย่างที่มีพ็อดอัลฟ่าและเบต้าสำหรับ SDK ไดรเวอร์เป็นทรัพยากร 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 เพื่อเปิดโปรเจ็กต์
ดูรายละเอียดเพิ่มเติมในคู่มือเริ่มต้นใช้งาน CocoaPods
การติดตั้งด้วยตนเอง
XCFramework เป็นแพ็กเกจไบนารีที่คุณใช้ติดตั้ง SDK ของไดรเวอร์ คุณใช้แพ็กเกจนี้ได้ในหลายแพลตฟอร์ม รวมถึงเครื่องที่ใช้ Apple Silicon ด้วย คู่มือนี้จะแสดงวิธีเพิ่ม XCFramework ที่มี SDK ไดรเวอร์ไปยังโปรเจ็กต์ของคุณด้วยตนเอง และกำหนดค่าการตั้งค่าของบิลด์ใน Xcode
ดาวน์โหลดไบนารีและทรัพยากร SDK ดังนี้
แตกไฟล์เพื่อเข้าถึง XCFramework และทรัพยากร
เริ่มต้น Xcode แล้วเปิดโปรเจ็กต์ที่มีอยู่ หรือสร้างโปรเจ็กต์ใหม่ หากเพิ่งเริ่มใช้ iOS ให้สร้างโปรเจ็กต์ใหม่และเลือกเทมเพลตแอป iOS
สร้างกลุ่มเฟรมเวิร์กภายใต้กลุ่มโปรเจ็กต์ของคุณหากยังไม่มี
หากต้องการติดตั้ง Driver SDK ให้ลากไฟล์
GoogleRidesharingDriver.xcframework
ลงในโปรเจ็กต์ในส่วนFrameworks, Libraries และเนื้อหาที่ฝัง เมื่อมีข้อความแจ้ง ให้เลือก คัดลอกรายการหากจำเป็นลาก
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 Flag อื่นๆ ให้เพิ่ม
-ObjC
สำหรับทั้งการแก้ไขข้อบกพร่องและรุ่น หากไม่เห็นการตั้งค่าเหล่านี้ ให้เปลี่ยนตัวกรองในแถบการตั้งค่าของบิลด์จากพื้นฐานเป็นทั้งหมด
เพิ่มไฟล์ Manifest ของความเป็นส่วนตัวของ Apple
Apple ต้องการรายละเอียดความเป็นส่วนตัวของแอปสำหรับแอปต่างๆ ใน App Store ไปที่หน้ารายละเอียดความเป็นส่วนตัวของ Apple App Store เพื่อดูอัปเดตและข้อมูลเพิ่มเติม
- ดาวน์โหลดแพ็กเกจไฟล์ Manifest ของความเป็นส่วนตัวสำหรับ Driver SDK สำหรับ iOS: GoogleRidesharingDriverPrivacy
- แตกไฟล์เพื่อเข้าถึง
GoogleRidesharingDriverPrivacy.bundle
- เพิ่ม
GoogleRidesharingDriverPrivacy.bundle
ลงในตัวนำทางโปรเจ็กต์ Xcode โดยใช้หนึ่งในวิธีการเหล่านี้ ตรวจสอบว่าได้เลือกช่อง "เพิ่มลงในเป้าหมาย" สำหรับเป้าหมายของแอปแล้ว เมื่อเพิ่มแล้ว ไฟล์ PrivacyInfo จะปรากฏในตัวนำทางโปรเจ็กต์ และคุณสามารถตรวจสอบค่าได้ - ยืนยันว่าได้เพิ่มไฟล์ Manifest ด้านความเป็นส่วนตัวแล้วโดยการสร้างที่เก็บถาวรของแอปและสร้างรายงานความเป็นส่วนตัวจากที่เก็บถาวร
การใช้การให้สิทธิ์และการตรวจสอบสิทธิ์
เมื่อแอปไดรเวอร์สร้างและส่งการอัปเดตไปยังแบ็กเอนด์ Fleet Engine คำขอดังกล่าวต้องมีโทเค็นเพื่อการเข้าถึงที่ถูกต้อง หากต้องการให้สิทธิ์และตรวจสอบสิทธิ์คำขอเหล่านี้ Driver SDK จะเรียกออบเจ็กต์ของคุณตามโปรโตคอล GMTDAuthorization
ออบเจ็กต์มีหน้าที่ให้
โทเค็นเพื่อการเข้าถึงที่จำเป็น
ในฐานะนักพัฒนาแอป คุณสามารถเลือกวิธีสร้างโทเค็นได้ การติดตั้งใช้งานของคุณควรช่วยให้สามารถทำสิ่งต่อไปนี้
- ดึงข้อมูลโทเค็นเพื่อการเข้าถึง ซึ่งอาจอยู่ในรูปแบบ JSON จากเซิร์ฟเวอร์ HTTPS
- แยกวิเคราะห์และแคชโทเค็น
- โปรดรีเฟรชโทเค็นเมื่อหมดอายุ
โปรดดูรายละเอียดของโทเค็นที่เซิร์ฟเวอร์ Fleet Engine คาดหวังที่หัวข้อการสร้างโทเค็นเว็บ JSON (JWT) สำหรับการให้สิทธิ์
รหัสผู้ให้บริการจะเหมือนกับรหัสโปรเจ็กต์ Google Cloud ดูข้อมูลเพิ่มเติมในคู่มือเริ่มใช้งานฉบับย่อ สำหรับ 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
โดยใช้ providerID, pathID,driverContext และ accessTokenProvider providerID เหมือนกับรหัสโปรเจ็กต์ Google Cloud และเข้าถึงอินสแตนซ์ GMTDVehicleReporter
จาก
API ไดรเวอร์ได้โดยตรง
ตัวอย่างต่อไปนี้สร้างอินสแตนซ์ 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];
}
(ไม่บังคับ) ฟังเหตุการณ์ CarReporter
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 เป็น Listener ไปยัง GMSRoadSnappedLocationProvider
คุณต้องตั้งค่า GMTDVehicleReporter
เป็น Listener GMSRoadSnappedLocationProvider
เพื่อส่งการอัปเดตตำแหน่งไปยัง Driver SDK
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
เป็น true
ในวันGMTDVehicleReporter
GMTDVehicleReporter
จะส่งการอัปเดตตำแหน่งโดยอัตโนมัติ หลังจากจับคู่บริการและกำหนดยานพาหนะให้กับการเดินทางแล้ว GMTDVehicleReporter
จะส่งการอัปเดตเส้นทางโดยอัตโนมัติเมื่อGMSNavigator
อยู่ในโหมดการนำทาง (เมื่อตั้งค่าจุดหมายผ่าน 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
อาจเกิดขึ้นเมื่อมาสก์ว่างเปล่า และโดยปกติจะเกิดขึ้นกับการอัปเดตครั้งแรกหลังจากเริ่มต้นใช้งาน ตัวอย่างต่อไปนี้แสดงวิธีจัดการกับข้อผิดพลาดนี้
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
ได้
การปิดใช้การอัปเดตยังตั้งค่าสถานะของรถยนต์เป็น OFFLINE
บนแบ็กเอนด์ Fleet Engine ด้วย
Swift
vehicleReporter.locationTrackingEnabled = false
Objective-C
_vehicleReporter.locationTrackingEnabled = NO;