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

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

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

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

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

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

    รับสิทธิ์เข้าถึง

    หากคุณเป็นลูกค้า Google Workspace ให้สร้าง Workspace Group เช่น google-maps-platform-sdk-users@workspacedomain.com ระหว่างการเริ่มต้นใช้งานและ ระบุชื่อให้ Google เราแนะนำให้ใช้วิธีนี้ ระบบจะเพิ่มกลุ่ม Workspace ของคุณไปยังรายการที่อนุญาตที่ให้สิทธิ์เข้าถึงที่เก็บ CocoaPods ที่ถูกต้อง ตรวจสอบให้มั่นใจว่าอีเมลของผู้ใช้และอีเมลบัญชีบริการที่ต้องมีสิทธิ์เข้าถึงรวมอยู่ในรายการนี้

    หากองค์กรของคุณสร้างกลุ่ม Workspace ไม่ได้ ให้ส่งรายการอีเมลของบัญชีผู้ใช้และบัญชีบริการที่จำเป็นต้องเข้าถึงอาร์ติแฟกต์เหล่านี้ไปยัง Google

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

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

    gcloud

    gcloud auth login
    

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

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

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

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

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

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

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

    คุณกำหนดค่า Driver SDK โดยใช้ CocoaPods ได้

    ใช้ CocoaPods

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

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

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

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

    SDK เวอร์ชันอัลฟ่า/เบต้า

    หากต้องการกำหนดค่า Driver SDK เวอร์ชันอัลฟ่าหรือเบต้าสำหรับ iOS คุณต้องมีสิ่งต่อไปนี้

    • เครื่องมือ CocoaPods: หากต้องการติดตั้งเครื่องมือนี้ ให้เปิดเทอร์มินัลแล้วเรียกใช้คำสั่งต่อไปนี้

      sudo gem install cocoapods
      

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

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

    หลังจากโปรเจ็กต์อยู่ในรายการเข้าถึง คุณจะเข้าถึงพ็อดได้

    1. สร้าง Podfile สำหรับ Driver SDK สำหรับ iOS และใช้เพื่อติดตั้ง API และทรัพยากร Dependency โดยการสร้างไฟล์ชื่อ Podfile ในไดเรกทอรีโปรเจ็กต์ ไฟล์นี้ระบุทรัพยากร Dependency ของโปรเจ็กต์ แก้ไข Podfile และเพิ่มทรัพยากร 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 เพื่อเปิดโปรเจ็กต์

    ติดตั้ง XCFramework

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

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

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

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

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

    4. ลากไฟล์ gRPCCertificates.bundle ที่ดาวน์โหลดมาไปยังไดเรกทอรีระดับบนสุดของโปรเจ็กต์ Xcode เมื่อมีข้อความแจ้ง ให้เลือกคัดลอกรายการหากจำเป็น

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

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

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

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

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

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

    เมื่อแอป 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, vehicleID, driverContext และ accessTokenProvider ก่อน รหัสผู้ให้บริการจะเหมือนกับรหัสโปรเจ็กต์ 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