iOS के लिए Driver SDK टूल का इस्तेमाल शुरू करना

ड्राइवर SDK टूल एक लाइब्रेरी है, जिसे अपने ड्राइवर ऐप्लिकेशन के साथ इंटिग्रेट किया जाता है. यह फ़्लीट इंजन को ड्राइवर की जगह, रास्ते, बची हुई दूरी, और ETA के साथ अपडेट करने की ज़िम्मेदारी है. यह नेविगेशन SDK टूल के साथ भी इंटिग्रेट हो जाता है, जिससे ड्राइवर को मोड़-दर-मोड़ नेविगेशन के निर्देश मिलते हैं.

सिस्टम के लिए ज़रूरी शर्तें

  • मोबाइल डिवाइस पर iOS 13 या उसके बाद का वर्शन होना चाहिए.
  • Xcode वर्शन 14 या उसके बाद का वर्शन.
  • ज़रूरी शर्तें

    इस गाइड में यह माना जाता है कि आपका ऐप्लिकेशन पहले से ही नेविगेशन SDK टूल लागू करता है. साथ ही, Fleet Engine बैकएंड सेट अप और उपलब्ध है. हालांकि, इस उदाहरण में दिए गए कोड में, नेविगेशन SDK टूल सेट अप करने के तरीके का सैंपल दिया गया है.

    आपको अपने Google Cloud प्रोजेक्ट में, iOS के लिए Maps SDK टूल भी चालू करना होगा और एपीआई पासकोड पाएं.

    ऐक्सेस पाएं

    अगर आप Google Workspace के ग्राहक हैं, तो ऑनबोर्डिंग के दौरान, google-maps-platform-sdk-users@workspacedomain.com जैसा Workspace ग्रुप बनाएं और Google को नाम दें. हम ऐसा करने का सुझाव देते हैं. इसके बाद, आपके Workspace ग्रुप को अनुमति वाली उस सूची में जोड़ दिया जाएगा जिससे CocoaPods के सही डेटा स्टोर करने की जगहों का ऐक्सेस मिलता है. पुष्टि करें कि जिन उपयोगकर्ता के ईमेल और सेवा खाते के ईमेल को ऐक्सेस की ज़रूरत है वे इस सूची में शामिल हैं.

    अगर आपका संगठन Workspace ग्रुप नहीं बना सकता, तो Google को उपयोगकर्ता और सेवा खाते के उन ईमेल पतों की सूची भेजें जिन्हें इन आर्टफ़ैक्ट का ऐक्सेस चाहिए.

    लोकल डेवलपमेंट

    लोकल डेवलपमेंट के लिए, Cloud SDK से लॉग इन करना ही काफ़ी होता है.

    gcloud

    gcloud auth login
    

    लॉग इन करने के लिए इस्तेमाल किया गया ईमेल पता, Workspace ग्रुप का सदस्य होना चाहिए.

    ऑटोमेशन (सिस्टम बनाना या लगातार इंटिग्रेशन करना)

    सबसे सही तरीकों के हिसाब से, अपने ऑटोमेशन होस्ट सेट अप करें:

    • अगर आपकी प्रोसेस Google Cloud एनवायरमेंट में चलती है, तो अपने-आप क्रेडेंशियल की पहचान करने की सुविधा का इस्तेमाल करें.

    • इसके अलावा, सेवा खाते की कुंजी वाली फ़ाइल को होस्ट के फ़ाइल सिस्टम पर किसी सुरक्षित जगह पर सेव करें और GOOGLE_APPLICATION_CREDENTIALS के एनवायरमेंट वैरिएबल को सही तरीके से सेट करें.

    क्रेडेंशियल से जुड़े सेवा खाते का ईमेल पता, Workspace Goup का सदस्य होना चाहिए.

    प्रोजेक्ट कॉन्फ़िगरेशन

    CocoaPods का इस्तेमाल करके, ड्राइवर SDK टूल को कॉन्फ़िगर किया जा सकता है.

    CocoaPods का इस्तेमाल करना

    CocoaPods का इस्तेमाल करके ड्राइवर SDK टूल को कॉन्फ़िगर करने के लिए, आपको इन आइटम की ज़रूरत होगी:

    1. ड्राइवर SDK टूल के लिए, एक Podfile बनाएं. इसके बाद, एपीआई और इसकी डिपेंडेंसी को इंस्टॉल करने के लिए, इसका इस्तेमाल करें: अपनी प्रोजेक्ट डायरेक्ट्री में Podfile नाम की एक फ़ाइल बनाएं. यह फ़ाइल आपके प्रोजेक्ट की डिपेंडेंसी के बारे में बताती है. Podfile में बदलाव करें और अपनी डिपेंडेंसी जोड़ें. यहां एक उदाहरण दिया गया है, जिसमें डिपेंडेंसी शामिल है:

      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. पॉड इंस्टॉल निर्देश चलाएं. इससे, Podfile में बताए गए एपीआई इंस्टॉल हो जाएंगे. साथ ही, उनकी डिपेंडेंसी भी इंस्टॉल हो जाएगी.

      pod install
      
    4. Xcode को बंद करें और फिर Xcode को लॉन्च करने के लिए, अपने प्रोजेक्ट की .xcworkspace फ़ाइल खोलें (दो बार क्लिक करें). अब से आपको प्रोजेक्ट खोलने के लिए, .xcworkspace फ़ाइल का इस्तेमाल करना होगा.

    SDK टूल के ऐल्फ़ा/बीटा वर्शन

    iOS के लिए ड्राइवर SDK के अल्फ़ा या बीटा वर्शन को कॉन्फ़िगर करने के लिए आपको इन आइटम की ज़रूरत होगी:

    • CocoaPods टूल: इस टूल को इंस्टॉल करने के लिए, टर्मिनल खोलें और यहां दिया गया कमांड चलाएं.

      sudo gem install cocoapods
      

      ज़्यादा जानकारी के लिए, CocoaPods के इस्तेमाल शुरू करने की गाइड देखें.

    • Google ऐक्सेस सूची में आपका डेवलपमेंट खाता. SDK के ऐल्फ़ा और बीटा वर्शन के पॉड रिपॉज़िटरी सार्वजनिक स्रोत नहीं हैं. उन वर्शन को ऐक्सेस करने के लिए, Google के कस्टमर इंजीनियर से संपर्क करें. इंजीनियर आपके डेवलपमेंट खाते को ऐक्सेस सूची में जोड़ता है और फिर पुष्टि के लिए कुकी सेट करता है.

    आपके प्रोजेक्ट के ऐक्सेस सूची में आने के बाद, पॉड को ऐक्सेस किया जा सकता है.

    1. iOS के ड्राइवर SDK टूल के लिए, एक Podfile बनाएं. इसके बाद, एपीआई और इसकी डिपेंडेंसी को इंस्टॉल करने के लिए इसका इस्तेमाल करें: अपनी प्रोजेक्ट डायरेक्ट्री में Podfile नाम की एक फ़ाइल बनाएं. यह फ़ाइल आपके प्रोजेक्ट की डिपेंडेंसी के बारे में बताती है. Podfile में बदलाव करें और अपनी डिपेंडेंसी जोड़ें. यहां एक उदाहरण दिया गया है, जिसमें डिपेंडेंसी शामिल है:

      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. पॉड इंस्टॉल निर्देश चलाएं. इससे, Podfile में बताए गए एपीआई इंस्टॉल हो जाएंगे. साथ ही, उनकी डिपेंडेंसी भी इंस्टॉल हो जाएगी.

      pod install
      
    4. Xcode को बंद करें और फिर Xcode को लॉन्च करने के लिए, अपने प्रोजेक्ट की .xcworkspace फ़ाइल खोलें (दो बार क्लिक करें). अब से आपको प्रोजेक्ट खोलने के लिए, .xcworkspace फ़ाइल का इस्तेमाल करना होगा.

    XCFramework इंस्टॉल करना

    XCFramework एक बाइनरी पैकेज होता है, जिसका इस्तेमाल ड्राइवर SDK टूल को इंस्टॉल करने के लिए किया जाता है. इस पैकेज को कई प्लैटफ़ॉर्म पर इस्तेमाल किया जा सकता है. इनमें M1 चिपसेट वाली मशीनें भी शामिल हैं. इस गाइड में, अपने प्रोजेक्ट में ड्राइवर SDK टूल वाले XCFramework को मैन्युअल तरीके से जोड़ने का तरीका बताया गया है. साथ ही, Xcode में बिल्ड सेटिंग कॉन्फ़िगर करने का तरीका भी बताया गया है.

    SDK टूल से जुड़ी बाइनरी और संसाधन डाउनलोड करें:

    1. XCFramework और संसाधनों को ऐक्सेस करने के लिए, ZIP फ़ाइलों को अनपैक करें.

    2. Xcode शुरू करें और कोई मौजूदा प्रोजेक्ट खोलें या नया प्रोजेक्ट बनाएं. अगर आपने iOS का इस्तेमाल पहले नहीं किया है, तो एक नया प्रोजेक्ट बनाएं और iOS ऐप्लिकेशन टेंप्लेट चुनें.

    3. अगर आपके प्रोजेक्ट ग्रुप में कोई फ़्रेमवर्क ग्रुप पहले से मौजूद नहीं है, तो उसे बनाएं.

    4. डाउनलोड की गई gRPCCertificates.bundle फ़ाइल को खींचकर, अपने Xcode प्रोजेक्ट की टॉप लेवल डायरेक्ट्री में छोड़ें. अगर ज़रूरी हो, तो आइटम कॉपी करें चुनें.

    5. ड्राइवर SDK टूल इंस्टॉल करने के लिए, फ़्रेमवर्क, लाइब्रेरी, और एम्बेड किए गए कॉन्टेंट में जाकर, GoogleRidesharingDriver.xcframework फ़ाइल को अपने प्रोजेक्ट में खींचें और छोड़ें. अगर ज़रूरी हो, तो आइटम कॉपी करें चुनें.

    6. डाउनलोड किए गए GoogleRidesharingDriver.bundle को अपने Xcode प्रोजेक्ट की टॉप लेवल डायरेक्ट्री में खींचें और छोड़ें. जब कहा जाए, तब Copy items if needed चुनें.

    7. प्रोजेक्ट नेविगेटर से अपना प्रोजेक्ट चुनें और अपने ऐप्लिकेशन का लक्ष्य चुनें.

    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. खास टारगेट के बजाय अपना प्रोजेक्ट चुनें और बिल्ड सेटिंग टैब खोलें. अन्य लिंकर फ़्लैग सेक्शन में, डीबग और रिलीज़, दोनों के लिए ‑ObjC जोड़ें. अगर ये सेटिंग नहीं दिख रही हैं, तो बिल्ड सेटिंग बार में फ़िल्टर को बेसिक से सभी में बदलें.

    अनुमति देने और पुष्टि करने की सुविधा लागू करें

    जब आपका ड्राइवर ऐप्लिकेशन जनरेट होता है और Fleet Engine बैकएंड को अपडेट भेजता है, तब अनुरोधों में मान्य ऐक्सेस टोकन शामिल होने चाहिए. इन अनुरोधों को अनुमति देने और उनकी पुष्टि करने के लिए, ड्राइवर SDK टूल आपके ऑब्जेक्ट को GMTDAuthorization प्रोटोकॉल के मुताबिक कॉल करता है. ऑब्जेक्ट, ज़रूरी ऐक्सेस टोकन देने के लिए ज़िम्मेदार है.

    ऐप्लिकेशन डेवलपर के तौर पर, आपको टोकन जनरेट करने का तरीका चुनना होता है. आपके लागू करने से ये काम करने की सुविधा मिलनी चाहिए:

    • एचटीटीपीएस सर्वर से, JSON फ़ॉर्मैट में ऐक्सेस टोकन फ़ेच करें.
    • टोकन को पार्स और कैश मेमोरी में सेव करें.
    • टोकन की समयसीमा खत्म होने पर, उसे रीफ़्रेश करें.

    Fleet Engine सर्वर से जिन टोकन की उम्मीद की जाती है उनके बारे में जानने के लिए, अनुमति देने के लिए JSON Web Token (JWT) बनाना लेख पढ़ें.

    प्रोवाइडर आईडी और Google Cloud प्रोजेक्ट आईडी एक ही होते हैं. ज़्यादा जानकारी के लिए, Fleet Engine डिलीवरी 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 इंस्टेंस पाने के लिए, आपको सबसे पहले providerID,vehicleID, DriverContext, और accessTokenProvider का इस्तेमाल करके GMTDDeliveryDriverAPI इंस्टेंस बनाना होगा. providerID और Google Cloud प्रोजेक्ट आईडी, एक ही हैं. साथ ही, ड्राइवर एपीआई से सीधे GMTDDeliveryVehicleReporter इंस्टेंस को ऐक्सेस किया जा सकता है.

    यहां दिया गया उदाहरण एक 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];
    }
    

    विकल्प के तौर पर, VehicleReporter के इवेंट सुनें

    locationTrackingEnabled के 'हां' होने पर, GMTDDeliveryVehicleReporter समय-समय पर वाहन को अपडेट करता है. समय-समय पर होने वाले इन अपडेट का जवाब देने के लिए, कोई भी ऑब्जेक्ट, GMTDVehicleReporterListener प्रोटोकॉल का पालन करके, GMTDDeliveryVehicleReporter इवेंट की सदस्यता ले सकता है.

    आपके पास इन इवेंट को मैनेज करने का विकल्प होता है:

    • 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
    

    जगह की जानकारी ट्रैक करने की सुविधा चालू करें

    जगह की जानकारी ट्रैक करने की सुविधा चालू करने के लिए, आपका ऐप्लिकेशन GMTDDeliveryVehicleReporter पर locationTrackingEnabled को YES पर सेट कर सकता है. ऐसा करने पर, GMTDDeliveryVehicleReporter = जगह की जानकारी के अपडेट अपने-आप भेज देगा. अगर GMSNavigator नेविगेशन मोड में है (जब मंज़िल setDestinations के ज़रिए सेट हो) और locationTrackingEnabled YES पर सेट है, तो GMTDDeliveryVehicleReporter अपने-आप रास्ते और ETA से जुड़े अपडेट भी भेजेगा.

    इन अपडेट के दौरान सेट किया गया रास्ता वही रूट होगा जिस पर ड्राइवर नेविगेशन सेशन के दौरान नेविगेट करता है. इसलिए, शिपमेंट ट्रैकिंग सही तरीके से काम करे, इसके लिए -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
    

    अपडेट_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