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

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

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

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

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

    คู่มือนี้จะสมมติว่าแอปของคุณใช้ SDK การนำทาง รวมถึงมีการตั้งค่าแบ็กเอนด์ Fleet Engine และพร้อมใช้งานแล้ว แต่โค้ดตัวอย่างนี้แสดงตัวอย่างวิธีตั้งค่า Naved 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 ของเป้าหมาย คุณควรเห็นแพ็กเกจที่ติดตั้งไว้ในเฟรมเวิร์ก ไลบรารี และเนื้อหาที่ฝัง นอกจากนี้ คุณยังสามารถดูส่วน "การอ้างอิงของแพ็กเกจ" ของ "Project Navigator" เพื่อตรวจสอบแพ็กเกจและเวอร์ชันของแพ็กเกจได้

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

    1. หากคุณอัปเกรดจากเวอร์ชันก่อน 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 เท่านั้น)
    2. จาก Xcode ให้ไปที่ "ไฟล์ > แพ็กเกจ > อัปเดตเป็นเวอร์ชันล่าสุดของแพ็กเกจ"
    3. หากต้องการยืนยันการติดตั้ง ให้ไปที่ส่วนการอ้างอิงแพ็กเกจของ Project Navigator เพื่อตรวจสอบแพ็กเกจและเวอร์ชันของแพ็กเกจ

    หากต้องการนำทรัพยากร 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 อย่างอื่น

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

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

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

    CocoaPods

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Apple ต้องการรายละเอียดความเป็นส่วนตัวของแอปสำหรับแอปใน App Store ไปที่หน้ารายละเอียดความเป็นส่วนตัวของ Apple App Store เพื่อดูข้อมูลอัปเดตและข้อมูลเพิ่มเติม

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

    ใช้การให้สิทธิ์และการตรวจสอบสิทธิ์

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

    ในฐานะนักพัฒนาแอป คุณเลือกวิธีสร้างโทเค็นได้ การใช้งานของคุณควรให้ความสามารถในการดำเนินการต่อไปนี้

    • เรียกโทเค็นเพื่อการเข้าถึงซึ่งอาจอยู่ในรูปแบบ JSON จากเซิร์ฟเวอร์ HTTPS
    • แยกวิเคราะห์และแคชโทเค็น
    • โปรดรีเฟรชโทเค็นเมื่อหมดอายุ

    โปรดดูรายละเอียดโทเค็นที่เซิร์ฟเวอร์ Fleet Engine คาดไว้ที่หัวข้อการสร้าง JSON Web Token (JWT) สำหรับการให้สิทธิ์

    รหัสผู้ให้บริการจะเหมือนกับรหัสโปรเจ็กต์ Google Cloud ดูข้อมูลเพิ่มเติมในคู่มือเริ่มใช้งานฉบับย่อสำหรับ Fleet Engine สำหรับ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 รหัสผู้ให้บริการจะเหมือนกับรหัสโปรเจ็กต์ Google Cloud โดยคุณจะเข้าถึงอินสแตนซ์ 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 โปรดดูข้อพิจารณาพิเศษเกี่ยวกับการจัดการความล้มเหลวเมื่อตั้งค่า locationTrackingEnabled เป็น false ได้ที่ 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.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;