คุณสามารถใช้ Driver SDK เพื่อนำเสนอการนำทางและการติดตามที่ปรับปรุงแล้วสำหรับ แอปพลิเคชันความคืบหน้าการเดินทางและคำสั่งซื้อ Driver SDK ให้บริการยานพาหนะ การอัปเดตตำแหน่งและงานของ Solution Fleet Engine การโดยสารและการนำส่งแบบออนดีมานด์
Driver SDK จะรับรู้ถึงบริการ Fleet Engine และบริการที่กำหนดเองของคุณ
ตำแหน่งและสถานะของรถ เช่น รถยนต์สามารถเป็นแบบ ONLINE
หรือ
OFFLINE
และตำแหน่งของรถจะเปลี่ยนไปเมื่อการเดินทางดำเนินไป
ข้อกำหนดขั้นต่ำของระบบ
ข้อกำหนดเบื้องต้น
คู่มือนี้จะถือว่าแอปของคุณใช้งานการนำทางอยู่แล้ว SDK และกลุ่ม เครื่องมือ ตั้งค่าแบ็กเอนด์และพร้อมใช้งาน แต่โค้ดตัวอย่างนี้มีตัวอย่างของ วิธีตั้งค่า navigation SDK
คุณต้องเปิดใช้งาน Maps SDK สำหรับ iOS ด้วย ในโปรเจ็กต์ Google Cloud และรับ API คีย์
การกำหนดค่าโปรเจ็กต์
เครื่องมือจัดการแพ็กเกจ Swift
สามารถติดตั้ง Driver SDK ผ่าน Swift Package Manager หากต้องการเพิ่ม SDK โปรดตรวจสอบว่าคุณมี นำทรัพยากร Dependency ของ Driver SDK ที่มีอยู่ออกแล้ว
หากต้องการเพิ่ม SDK ลงในโปรเจ็กต์ใหม่หรือโปรเจ็กต์ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้
-
เปิด Xcode
project
หรือworkspace
แล้วไปที่ ไฟล์ > เพิ่มทรัพยากร Dependency ของแพ็กเกจ - ป้อน https://github.com/googlemaps/ios-driver-sdk เป็น URL แล้วกด Enter เพื่อดึงข้อมูลแพ็กเกจ แล้วคลิก "เพิ่มแพ็กเกจ"
-
หากต้องการติดตั้ง
version
ที่เจาะจง ให้ตั้งค่าช่องกฎการขึ้นต่อกันเป็นค่าใดค่าหนึ่ง ตัวเลือกตามเวอร์ชัน สำหรับโปรเจ็กต์ใหม่ เราขอแนะนำให้ระบุเวอร์ชันล่าสุดและ โดยใช้ "เวอร์ชันที่แน่นอน" ตัวเลือก เมื่อเสร็จแล้ว ให้คลิก "เพิ่มแพ็กเกจ" -
จากหน้าต่างเลือกผลิตภัณฑ์แพ็กเกจ ให้ยืนยันว่าจะเพิ่ม
GoogleRidesharingDriver
ไปยัง เป้าหมายmain
ที่คุณกำหนด เมื่อเสร็จแล้ว ให้คลิก "เพิ่มแพ็กเกจ" -
หากต้องการยืนยันการติดตั้ง ให้ไปที่แผง
General
ของเป้าหมาย คุณควรเห็นแพ็กเกจที่ติดตั้งไว้ในเฟรมเวิร์ก ไลบรารี และเนื้อหาที่ฝัง นอกจากนี้ คุณยังสามารถดู "การอ้างอิงของแพ็กเกจ" ส่วนของ "Project Navigator" เพื่อยืนยันแพ็กเกจและเวอร์ชันของแพ็กเกจ
หากต้องการอัปเดต package
สำหรับโปรเจ็กต์ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้
หากกำลังอัปเกรดจากเวอร์ชันก่อน 9.0.0 คุณต้องนำออก ทรัพยากร Dependency ต่อไปนี้
GoogleMapsBase
,GoogleMapsCore
และGoogleMapsM4B
หลังจากอัปเกรด ไม่ต้องนำการอ้างอิงสำหรับGoogleMaps
สำหรับข้อมูลเพิ่มเติม โปรดดู บันทึกประจำรุ่นของเวอร์ชัน 9.0.0จากการตั้งค่าการกำหนดค่าโปรเจ็กต์ Xcode ให้ค้นหา Frameworks, Libraries และเนื้อหาแบบฝัง ใช้เครื่องหมายลบ(-)เพื่อนำเฟรมเวิร์กต่อไปนี้ออก
GoogleMapsBase
(สำหรับการอัปเกรดจากเวอร์ชันก่อน 9.0.0 เท่านั้น)GoogleMapsCore
(สำหรับการอัปเกรดจากเวอร์ชันก่อน 9.0.0 เท่านั้น)GoogleMapsM4B
(สำหรับการอัปเกรดจากเวอร์ชันก่อน 9.0.0 เท่านั้น)
- จาก Xcode ให้ไปที่ "File > แพ็กเกจ > อัปเดตเป็นเวอร์ชันล่าสุดของแพ็กเกจ"
- หากต้องการยืนยันการติดตั้ง ให้ไปที่ส่วนการอ้างอิงแพ็กเกจของ Project Navigator เพื่อยืนยันแพ็กเกจและเวอร์ชันของแพ็กเกจ
หากต้องการนำทรัพยากร Dependency ของ Driver SDK ที่มีอยู่ออกด้วย
CocoaPods
ให้ทำตามขั้นตอนต่อไปนี้
- ปิดพื้นที่ทำงาน Xcode เปิดเทอร์มินัลและเรียกใช้คำสั่งต่อไปนี้
sudo gem install cocoapods-deintegrate cocoapods-clean pod deintegrate pod cache clean --all
-
นำ
Podfile
,Podfile.resolved
และ Xcodeworkspace
หากคุณไม่ได้ใช้สำหรับวัตถุประสงค์อื่นนอกเหนือจาก CocoaPods
วิธีนำ Driver SDK ที่ติดตั้งไว้ออก ด้วยตนเอง ให้ทำตามขั้นตอนต่อไปนี้
จากการตั้งค่าการกำหนดค่าโปรเจ็กต์ Xcode ให้ค้นหา Frameworks ไลบรารีและเนื้อหาที่ฝัง ใช้เครื่องหมายลบ
(-)
เพื่อนำออก เฟรมเวิร์กต่อไปนี้GoogleRidesharingDriver.xcframework
จากไดเรกทอรีระดับบนสุดของโปรเจ็กต์ Xcode ให้นำ แพ็กเกจ
GoogleRidesharingDriver
CocoaPods
หากต้องการกำหนดค่า Driver SDK โดยใช้ CocoaPods คุณต้องมีรายการต่อไปนี้
- เครื่องมือ CocoaPods: หากต้องการติดตั้งเครื่องมือนี้ ให้เปิดเทอร์มินัลและเรียกใช้ คำสั่งต่อไปนี้
sudo gem install cocoapods
สร้าง Podfile สำหรับ Driver SDK และใช้เพื่อติดตั้ง API และ ทรัพยากร Dependency ของไฟล์นั้น: สร้างไฟล์ชื่อ Podfile ในไดเรกทอรีโปรเจ็กต์ ไฟล์นี้ระบุทรัพยากร Dependency ของโปรเจ็กต์ แก้ไข Podfile และเพิ่ม ทรัพยากร Dependency ของคุณ ต่อไปนี้เป็นตัวอย่างที่มีการพึ่งพิง
source "https://github.com/CocoaPods/Specs.git" target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GoogleRidesharingDriver' end
ต่อไปนี้คือตัวอย่างที่มีพ็อดอัลฟ่าและเบต้าสำหรับ Driver 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 ด้วยตนเองที่มี Driver SDK ในโปรเจ็กต์และกำหนดค่าบิลด์ การตั้งค่าใน Xcode
ดาวน์โหลดไบนารี SDK และทรัพยากร ดังนี้
แตกไฟล์เพื่อเข้าถึง XCFramework และทรัพยากร
เริ่ม Xcode และเปิดโปรเจ็กต์ที่มีอยู่หรือสร้างโปรเจ็กต์ใหม่ หากเพิ่งเริ่มใช้ iOS ให้สร้างโปรเจ็กต์ใหม่และเลือก iOS เทมเพลตแอป
สร้างกลุ่มเฟรมเวิร์กภายใต้กลุ่มโปรเจ็กต์หากยังไม่มี เรียบร้อยแล้ว
หากต้องการติดตั้ง 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
เลือกโปรเจ็กต์แทนเป้าหมายเฉพาะ แล้วเปิด Build การตั้งค่า ในส่วนแฟล็กอื่นๆ ของ 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 คู่มือเริ่มต้นฉบับย่อ คำแนะนำ เพื่อดูข้อมูลเพิ่มเติม
ตัวอย่างต่อไปนี้ใช้ผู้ให้บริการโทเค็นเพื่อการเข้าถึง
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
ที่ใช้รหัสผู้ให้บริการ, รหัสยานพาหนะ
driverContext และ AccessTokenProvider ProviderID เหมือนกับ Google
รหัสโปรเจ็กต์ที่อยู่ในระบบคลาวด์ และคุณสามารถเข้าถึงอินสแตนซ์ GMTDVehicleReporter
จาก
Driver 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];
}
เลือกฟังเหตุการณ์ของ DeviceReporter
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
เป็น
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;