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

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

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

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

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

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

    การพัฒนาในพื้นที่

    สำหรับการพัฒนาในเครื่อง การเข้าสู่ระบบด้วย Cloud SDK

    gcloud

    gcloud auth login
    

    อีเมลที่ใช้เข้าสู่ระบบต้องเป็นสมาชิกของกลุ่ม Workspace

    การทำงานอัตโนมัติ (สร้างระบบหรือการผสานรวมอย่างต่อเนื่อง)

    ตั้งค่าโฮสต์อัตโนมัติตาม แนวทางปฏิบัติแนะนำ

    • หากกระบวนการทำงานภายในสภาพแวดล้อม Google Cloud ให้ใช้ อัตโนมัติ การตรวจหาข้อมูลเข้าสู่ระบบ

    • หรือเก็บไฟล์คีย์บัญชีบริการไว้ในที่ปลอดภัยบน ระบบไฟล์ของโฮสต์และตั้งค่า GOOGLE_APPLICATION_CREDENTIALS ตัวแปรสภาพแวดล้อมได้อย่างเหมาะสม

    อีเมลบัญชีบริการที่เชื่อมโยงกับข้อมูลเข้าสู่ระบบต้องเป็นสมาชิกของ Workspace Goup

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

    เครื่องมือจัดการแพ็กเกจ Swift

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

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

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

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

    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 ต่างๆ ที่อาจมี

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

    โปรดดูข้อมูลที่หัวข้อการเริ่มต้นใช้งาน CocoaPods เพื่อดูข้อมูลเพิ่มเติม รายละเอียด

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

    XCFramework คือแพ็กเกจไบนารีที่คุณใช้ติดตั้ง 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. เลือกโปรเจ็กต์แทนเป้าหมายเฉพาะ แล้วเปิด 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 Deliveries API เพื่อดูข้อมูลเพิ่มเติม

    ตัวอย่างต่อไปนี้ใช้ผู้ให้บริการโทเค็นเพื่อการเข้าถึง

    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    // SampleAccessTokenProvider.h
    @interface SampleAccessTokenProvider : NSObject<GMTDAuthorization>
    @end
    
    static NSString *const PROVIDER_URL = @"INSERT_YOUR_TOKEN_PROVIDER_URL";
    
    // SampleAccessTokenProvider.m
    @implementation SampleAccessTokenProvider{
      // The cached vehicle token.
      NSString *_cachedVehicleToken;
      // Keep track of the vehicle ID the cached token is for.
      NSString *_lastKnownVehicleID;
      // Keep track of when tokens expire for caching.
      NSTimeInterval _tokenExpiration;
    }
    
    - (void)fetchTokenWithContext:(nullable GMTDAuthorizationContext *)authorizationContext
                       completion:(nonnull GMTDAuthTokenFetchCompletionHandler)completion {
      if (!completion) {
        NSAssert(NO, @"%s encountered an unexpected nil completion.", __PRETTY_FUNCTION__);
        return;
      }
    
      // Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
      NSString *vehicleID = authorizationContext.vehicleID;
      if (!vehicleID) {
        NSAssert(NO, @"Vehicle ID is missing from authorizationContext.");
        return;
      }
    
    // Clear cached vehicle token if vehicle ID has changed.
      if (![_lastKnownVehicleID isEqual:vehicleID]) {
        _tokenExpiration = 0.0;
        _cachedVehicleToken = nil;
      }
      _lastKnownVehicleID = vehicleID;
    
      // Clear cached vehicle token if it has expired.
      if ([[NSDate date] timeIntervalSince1970] > _tokenExpiration) {
        _cachedVehicleToken = nil;
      }
    
      // If appropriate, use the cached token.
      if (_cachedVehicleToken) {
        completion(_cachedVehicleToken, nil);
        return;
      }
      // Otherwise, try to fetch a new token from your server.
      NSURL *requestURL = [NSURL URLWithString:PROVIDER_URL];
      NSMutableURLRequest *request = 
                              [[NSMutableURLRequest alloc] initWithURL:requestURL];
      request.HTTPMethod = @"GET";
      // Replace the following key values with the appropriate keys based on your
      // server's expected response.
      NSString *vehicleTokenKey = @"VEHICLE_TOKEN_KEY";
      NSString *tokenExpirationKey = @"TOKEN_EXPIRATION";
      __weak typeof(self) weakSelf = self;
      void (^handler)(NSData *_Nullable data, NSURLResponse *_Nullable response,
                      NSError *_Nullable error) =
          ^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
            typeof(self) strongSelf = weakSelf;
            if (error) {
              completion(nil, error);
              return;
            }
    
            NSError *JSONError;
            NSMutableDictionary *JSONResponse =
                [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&JSONError];
    
            if (JSONError) {
              completion(nil, JSONError);
              return;
            } else {
              // Sample code only. No validation logic.
              id expirationData = JSONResponse[tokenExpirationKey];
              if ([expirationData isKindOfClass:[NSNumber class]]) {
                NSTimeInterval expirationTime = ((NSNumber *)expirationData).doubleValue;
                strongSelf->_tokenExpiration = [[NSDate date] timeIntervalSince1970] + expirationTime;
              }
              strongSelf->_cachedVehicleToken = JSONResponse[vehicleTokenKey];
              completion(JSONResponse[vehicleTokenKey], nil);
            }
        };
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *mainQueueURLSession =  
           [NSURLSession  sessionWithConfiguration:config delegate:nil
    delegateQueue:[NSOperationQueue mainQueue]];
    NSURLSessionDataTask *task = [mainQueueURLSession dataTaskWithRequest:request completionHandler:handler];
    [task resume];
    }
    
    @end
    

    สร้างอินสแตนซ์ DeliveryDriverAPI

    หากต้องการรับอินสแตนซ์ GMTDDeliveryVehicleReporter คุณต้องสร้างอินสแตนซ์ก่อน GMTDDeliveryDriverAPI อินสแตนซ์ที่ใช้ providerID พาหนะID, driverContext และ accessTokenProvider providerID จะเหมือนกับ รหัสโปรเจ็กต์ Google Cloud และคุณสามารถเข้าถึง GMTDDeliveryVehicleReporter อินสแตนซ์จาก Driver API โดยตรง

    ตัวอย่างต่อไปนี้จะสร้างอินสแตนซ์ GMTDDeliveryDriverAPI

    #import “SampleViewController.h”
    #import “SampleAccessTokenProvider.h”
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
     GMSMapView *_mapView;
    }
    
    - (void)viewDidLoad {
      NSString *vehicleID = @"INSERT_CREATED_VEHICLE_ID";
      SampleAccessTokenProvider *accessTokenProvider = 
                                    [[SampleAccessTokenProvider alloc] init];
      GMTDDriverContext *driverContext = 
         [[GMTDDriverContext alloc] initWithAccessTokenProvider:accessTokenProvider
                                                     providerID:PROVIDER_ID 
                                                  vehicleID:vehicleID 
          navigator:_mapView.navigator];
    
      GMTDDeliveryDriverAPI *deliveryDriverAPI = [[GMTDDeliveryDriverAPI alloc] initWithDriverContext:driverContext];
    }
    

    เลือกฟังเหตุการณ์ของ DeviceReporter

    GMTDDeliveryVehicleReporter จะอัปเดตยานพาหนะเป็นระยะเมื่อ locationTrackingEnabled คือ "ใช่" เพื่อตอบสนองต่อการอัปเดตเป็นระยะเหล่านี้ ออบเจ็กต์สามารถสมัครรับข้อมูลเหตุการณ์ GMTDDeliveryVehicleReporter ได้โดยเป็นไปตาม โปรโตคอล GMTDVehicleReporterListener

    โดยคุณจะจัดการเหตุการณ์ต่อไปนี้ได้

    • vehicleReporter:didSucceedVehicleUpdate

      แจ้งแอปไดรเวอร์ว่าบริการแบ็กเอนด์ได้รับ ตำแหน่งรถและการอัปเดตสถานะ

    • vehicleReporter:didFailVehicleUpdate:withError

      แจ้งผู้ฟังว่าการอัปเดตยานพาหนะล้มเหลว ระบุตำแหน่งที่ตั้ง การติดตามเปิดใช้อยู่ GMTDDeliveryVehicleReporter จะยังคงส่ง ข้อมูลล่าสุดไปยังแบ็กเอนด์ Fleet Engine

    ตัวอย่างต่อไปนี้จัดการกับเหตุการณ์เหล่านี้

    SampleViewController.h
    @interface SampleViewController : UIViewController<GMTDVehicleReporterListener>
    @end
    
    SampleViewController.m
    #import “SampleViewController.h”
    #import “SampleAccessTokenProvider.h”
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
     GMSMapView *_mapView;
    }
    
    
    - (void)viewDidLoad {
      // ASSUMES YOU IMPLEMENTED HAVE THE SAMPLE CODE UP TO THIS STEP.
      [ridesharingDriverAPI.vehicleReporter addListener:self];
    }
    
    - (void)vehicleReporter:(GMTDDeliveryVehicleReporter *)vehicleReporter didSucceedVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate {
      // Handle update succeeded.
    }
    
    - (void)vehicleReporter:(GMTDDeliveryVehicleReporter *)vehicleReporter didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate withError:(NSError *)error {
      // Handle update failed.
    }
    
    @end
    

    เปิดใช้การติดตามตำแหน่ง

    หากต้องการเปิดใช้การติดตามตำแหน่ง แอปของคุณตั้งค่า locationTrackingEnabled เป็น YES ได้ ในวันที่ GMTDDeliveryVehicleReporter จากนั้น GMTDDeliveryVehicleReporter จะ = ส่งการอัปเดตตำแหน่งโดยอัตโนมัติ เมื่อGMSNavigatorอยู่ในการนำทาง (เมื่อตั้งค่าปลายทางผ่าน setDestinations) และ ตั้งค่า locationTrackingEnabled เป็น YES และ GMTDDeliveryVehicleReporter จะ ส่งข้อมูลอัปเดตเส้นทางและเวลาถึงโดยประมาณโดยอัตโนมัติด้วย

    เส้นทางที่กำหนดในระหว่างการอัปเดตเหล่านั้นจะเป็นเส้นทางเดียวกับที่คนขับ ไปที่ ระหว่างเซสชันการนำทาง ดังนั้นเพื่อให้การติดตามการจัดส่งใช้งานได้ จุดอ้างอิงที่กำหนดผ่าน -setDestinations:callback: ควรตรงกับ ปลายทางที่กำหนดในแบ็กเอนด์ Fleet Engine

    ตัวอย่างต่อไปนี้เปิดใช้การติดตามตำแหน่ง

    SampleViewController.m
    #import “SampleViewController.h”
    #import “SampleAccessTokenProvider.h”
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
     GMSMapView *_mapView; 
    }
    
    - (void)viewDidLoad {
      // ASSUMES YOU IMPLEMENTED HAVE THE SAMPLE CODE UP TO THIS STEP.
      deliveryDriverAPI.vehicleReporter.locationTrackingEnabled = YES;
    }
    
    @end
    

    ตามค่าเริ่มต้น ช่วงเวลาการรายงานคือ 10 วินาที แต่ช่วงเวลาการรายงานสามารถ เปลี่ยนแปลงได้ด้วย locationUpdateInterval ช่วงเวลาการอัปเดตขั้นต่ำที่รองรับ 5 วินาที ช่วงเวลาการอัปเดตที่รองรับสูงสุดคือ 60 วินาที บ่อยขึ้น การอัปเดตอาจส่งผลให้คำขอทำงานช้าลงและเกิดข้อผิดพลาด

    ปิดใช้งานการอัปเดตตำแหน่ง

    แอปของคุณสามารถปิดใช้การอัปเดตตำแหน่งของรถได้ ตัวอย่างเช่น เมื่อ หมดกะของคนขับรถ แอปของคุณตั้งค่า locationTrackingEnabled เป็น NO ได้

      _vehicleReporter.locationTrackingEnabled = NO
    

    จัดการข้อผิดพลาดupdate_mask

    เมื่อ GMTDDeliveryVehicleReporter ส่งการอัปเดตยานพาหนะ update_mask อาจเกิดขึ้นเมื่อมาสก์ว่างเปล่า และมักเกิดขึ้นเมื่อมาสก์ อัปเดตหลังจากเริ่มต้น ตัวอย่างต่อไปนี้แสดงวิธีจัดการกับข้อผิดพลาดนี้

    Swift

    import GoogleRidesharingDriver
    
    class VehicleReporterListener: NSObject, GMTDVehicleReporterListener {
      func vehicleReporter(
        _ vehicleReporter: GMTDVehicleReporter,
        didFail vehicleUpdate: GMTDVehicleUpdate,
        withError error: Error
      ) {
        let fullError = error as NSError
        if let innerError = fullError.userInfo[NSUnderlyingErrorKey] as? NSError {
          let innerFullError = innerError as NSError
          if innerFullError.localizedDescription.contains("update_mask cannot be empty") {
            emptyMaskUpdates += 1
            return
          }
        }
        failedUpdates += 1
      }
    
      override init() {
        emptyMaskUpdates = 0
        failedUpdates = 0
      }
    }
    
    

    Objective-C

    #import "VehicleReporterListener.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    @implementation VehicleReporterListener {
      NSInteger emptyMaskUpdates = 0;
      NSInteger failedUpdates = 0;
    }
    
    - (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter
      didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate
                 withError:(NSError *)error {
      for (NSError *underlyingError in error.underlyingErrors) {
        if ([underlyingError.localizedDescription containsString:@"update_mask cannot be empty"]) {
          emptyMaskUpdates += 1;
          return;
        }
      }
      failedUpdates += 1
    }
    
    @end