เริ่มต้นใช้งาน Driver SDK สำหรับ iOS

คุณสามารถใช้ SDK ไดรเวอร์เพื่อให้การนำทางและการติดตามที่ดียิ่งขึ้นแก่แอปพลิเคชันการเดินทางและความคืบหน้าในการสั่งซื้อ Driver SDK จะให้บริการตำแหน่งยานพาหนะและการอัปเดตงานของขบวนพาหนะบริการรถโดยสารและการนำส่งแบบออนดีมานด์

Driver SDK ช่วยให้บริการ Fleet Engine และบริการที่กำหนดเองทราบตำแหน่งและสถานะของรถอยู่เสมอ ตัวอย่างเช่น ยานพาหนะอาจเป็น ONLINE หรือ OFFLINE ก็ได้ และตำแหน่งยานพาหนะจะเปลี่ยนแปลงไปตามการเดินทาง

ข้อกำหนดขั้นต่ำของระบบ

  • อุปกรณ์เคลื่อนที่ต้องใช้ iOS 14 ขึ้นไป
  • Xcode เวอร์ชัน 15 ขึ้นไป
  • ข้อกำหนดเบื้องต้น

    คู่มือนี้จะถือว่าแอปของคุณใช้ Navigation SDK และแบ็กเอนด์ Fleet Engine ได้รับการตั้งค่าและพร้อมให้บริการแล้ว อย่างไรก็ตาม โค้ดตัวอย่างจะแสดงตัวอย่างวิธีตั้งค่า Navigation SDK

    คุณต้องเปิดใช้ Maps SDK สำหรับ iOS ในโปรเจ็กต์ Google Cloud และรับคีย์ API ด้วย

    การกำหนดค่าโปรเจ็กต์

    ผู้จัดการแพ็กเกจของ Swift

    Driver SDK ติดตั้งได้ผ่าน Swift Package Manager หากต้องการเพิ่ม SDK ให้ตรวจสอบว่าคุณได้นำทรัพยากร Dependency ของ Driver SDK ที่มีอยู่ออกแล้ว

    หากต้องการเพิ่ม SDK ลงในโปรเจ็กต์ใหม่หรือโปรเจ็กต์ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้

    1. เปิด Xcode project หรือ workspace แล้วไปที่ไฟล์ > เพิ่มการอ้างอิงแพ็กเกจ
    2. ป้อน https://github.com/googlemaps/ios-driver-sdk เป็น URL กด Enter เพื่อดึงแพ็กเกจ แล้วคลิก "เพิ่มแพ็กเกจ"
    3. หากต้องการติดตั้ง version ที่เจาะจง ให้ตั้งค่าช่องกฎการขึ้นต่อกันเป็นหนึ่งในตัวเลือกตามเวอร์ชัน สำหรับโปรเจ็กต์ใหม่ เราขอแนะนำให้ระบุเวอร์ชันล่าสุดและใช้ตัวเลือก "เวอร์ชันที่แน่นอน" เมื่อเสร็จแล้ว ให้คลิก "เพิ่มแพ็กเกจ"
    4. จากหน้าต่างเลือกผลิตภัณฑ์แพ็กเกจ โปรดยืนยันว่าจะเพิ่ม GoogleRidesharingDriver ไปยังเป้าหมาย main ที่กำหนดไว้ เมื่อเสร็จแล้ว ให้คลิก "เพิ่มแพ็กเกจ"
    5. ไปที่แผง General ของเป้าหมายเพื่อยืนยันการติดตั้ง คุณจะเห็นแพ็กเกจที่ติดตั้งไว้ในเฟรม ไลบรารี และเนื้อหาที่ฝัง นอกจากนี้ คุณยังสามารถดูส่วน "ทรัพยากร Dependency ของแพ็กเกจ" ของ "ตัวนำทางโปรเจ็กต์" เพื่อยืนยันแพ็กเกจและเวอร์ชันได้ด้วย

    หากต้องการอัปเดต package สำหรับโปรเจ็กต์ที่มีอยู่ ให้ทำตามขั้นตอนต่อไปนี้

    1. จาก Xcode ให้ไปที่ "ไฟล์ > แพ็กเกจ > อัปเดตเป็นแพ็กเกจเวอร์ชันล่าสุด"
    2. หากต้องการยืนยันการติดตั้ง ให้ไปที่ส่วนทรัพยากร Dependency ของแพ็กเกจของตัวนำทางโปรเจ็กต์เพื่อยืนยันแพ็กเกจและเวอร์ชันของแพ็กเกจ

    หากต้องการนำทรัพยากร Dependency ของ Driver SDK ที่มีอยู่ออกโดยใช้ CocoaPods ให้ทำตามขั้นตอนต่อไปนี้

    1. ปิดพื้นที่ทำงาน Xcode เปิดเทอร์มินัลและเรียกใช้คำสั่งต่อไปนี้
      sudo gem install cocoapods-deintegrate cocoapods-clean 
      pod deintegrate 
      pod cache clean --all
    2. นำ Podfile, Podfile.resolved และ Xcode workspace ออกหากไม่ได้ใช้งานในทางอื่นใดนอกเหนือจาก CocoaPods

    หากต้องการนำ SDK ไดรเวอร์ที่มีอยู่ออก ซึ่งติดตั้งไว้ด้วยตัวเอง โปรดทำตามขั้นตอนต่อไปนี้

    1. จากการตั้งค่าการกำหนดค่าโปรเจ็กต์ Xcode ให้ค้นหา Frameworks, Libraries, และเนื้อหาที่ฝัง ใช้เครื่องหมายลบ(-)เพื่อนำเฟรมเวิร์กต่อไปนี้ออก

      • GoogleRidesharingDriver.xcframework
    2. นำแพ็กเกจ GoogleRidesharingDriver ออกจากไดเรกทอรีระดับบนสุดของโปรเจ็กต์ Xcode

    CocoaPods

    หากต้องการกำหนดค่า Driver SDK โดยใช้ CocoaPods คุณต้องมีรายการต่อไปนี้

    • เครื่องมือ CocoaPods: หากต้องการติดตั้งเครื่องมือนี้ ให้เปิดเทอร์มินัลแล้วเรียกใช้คำสั่งต่อไปนี้
       sudo gem install cocoapods
    
    1. สร้าง 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
      
    2. บันทึก Podfile เปิดเทอร์มินัลและไปที่ไดเรกทอรีที่มี Podfile โดยทำดังนี้

      cd <path-to-project>
      
    3. เรียกใช้คำสั่งติดตั้งพ็อด การดำเนินการนี้จะติดตั้ง API ที่ระบุใน Podfile รวมไปถึงทรัพยากร Dependency ที่อาจมี

      pod install
      
    4. ปิด Xcode แล้วเปิด (ดับเบิลคลิก) ไฟล์ .xcworkspace ของโปรเจ็กต์เพื่อเปิดใช้ Xcode ตั้งแต่นี้เป็นต้นไป คุณต้องใช้ไฟล์ .xcworkspace เพื่อเปิดโปรเจ็กต์

    ดูรายละเอียดเพิ่มเติมในคู่มือเริ่มต้นใช้งาน CocoaPods

    การติดตั้งด้วยตนเอง

    XCFramework เป็นแพ็กเกจไบนารีที่คุณใช้ติดตั้ง SDK ของไดรเวอร์ คุณใช้แพ็กเกจนี้ได้ในหลายแพลตฟอร์ม รวมถึงเครื่องที่ใช้ Apple Silicon ด้วย คู่มือนี้จะแสดงวิธีเพิ่ม XCFramework ที่มี SDK ไดรเวอร์ไปยังโปรเจ็กต์ของคุณด้วยตนเอง และกำหนดค่าการตั้งค่าของบิลด์ใน Xcode

    ดาวน์โหลดไบนารีและทรัพยากร SDK ดังนี้

    1. แตกไฟล์เพื่อเข้าถึง XCFramework และทรัพยากร

    2. เริ่มต้น Xcode แล้วเปิดโปรเจ็กต์ที่มีอยู่ หรือสร้างโปรเจ็กต์ใหม่ หากเพิ่งเริ่มใช้ iOS ให้สร้างโปรเจ็กต์ใหม่และเลือกเทมเพลตแอป iOS

    3. สร้างกลุ่มเฟรมเวิร์กภายใต้กลุ่มโปรเจ็กต์ของคุณหากยังไม่มี

    4. หากต้องการติดตั้ง Driver SDK ให้ลากไฟล์ GoogleRidesharingDriver.xcframework ลงในโปรเจ็กต์ในส่วนFrameworks, Libraries และเนื้อหาที่ฝัง เมื่อมีข้อความแจ้ง ให้เลือก คัดลอกรายการหากจำเป็น

    5. ลาก GoogleRidesharingDriver.bundle ที่ดาวน์โหลดไปยังไดเรกทอรีระดับบนสุดของโปรเจ็กต์ Xcode เมื่อมีข้อความแจ้ง ให้เลือก Copy items if needed

    6. เลือกโปรเจ็กต์จาก Project Navigator และเลือกเป้าหมายของแอปพลิเคชัน

    7. เปิดแท็บสร้างระยะ และเพิ่มเฟรมเวิร์กและไลบรารีต่อไปนี้ในลิงก์ไบนารีกับไลบรารี

      • 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
    8. เลือกโปรเจ็กต์แทนเป้าหมายเฉพาะ แล้วเปิดแท็บการตั้งค่าบิลด์ ในส่วน Linker Flag อื่นๆ ให้เพิ่ม -ObjC สำหรับทั้งการแก้ไขข้อบกพร่องและรุ่น หากไม่เห็นการตั้งค่าเหล่านี้ ให้เปลี่ยนตัวกรองในแถบการตั้งค่าของบิลด์จากพื้นฐานเป็นทั้งหมด

    เพิ่มไฟล์ Manifest ของความเป็นส่วนตัวของ Apple

    1. ดาวน์โหลดแพ็กเกจไฟล์ Manifest ของความเป็นส่วนตัวสำหรับ Driver SDK สำหรับ iOS: GoogleRidesharingDriverPrivacy
    2. แตกไฟล์เพื่อเข้าถึง GoogleRidesharingDriverPrivacy.bundle
    3. เพิ่ม GoogleRidesharingDriverPrivacy.bundle ลงในตัวนำทางโปรเจ็กต์ Xcode โดยใช้หนึ่งในวิธีการเหล่านี้ ตรวจสอบว่าได้เลือกช่อง "เพิ่มลงในเป้าหมาย" สำหรับเป้าหมายของแอปแล้ว เมื่อเพิ่มแล้ว ไฟล์ PrivacyInfo จะปรากฏในตัวนำทางโปรเจ็กต์ และคุณสามารถตรวจสอบค่าได้
    4. ภาพหน้าจอข้อมูลความเป็นส่วนตัวของ Xcode
    5. ยืนยันว่าได้เพิ่มไฟล์ 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;