iOS के लिए ड्राइवर SDK के साथ शुरू करना

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

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

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

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

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

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

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

    स्विफ़्ट पैकेज मैनेजर

    ड्राइवर SDK टूल को Swift Package Manager की मदद से इंस्टॉल किया जा सकता है. SDK टूल जोड़ने के लिए, पक्का करें कि आपने सभी मौजूदा ड्राइवर SDK डिपेंडेंसी हटा दी हैं.

    SDK टूल को किसी नए या मौजूदा प्रोजेक्ट में जोड़ने के लिए, यह तरीका अपनाएं:

    1. अपना Xcode project या workspace खोलें. इसके बाद, फ़ाइल > पैकेज डिपेंडेंसी जोड़ें पर जाएं.
    2. यूआरएल के तौर पर, https://github.com/googlemaps/ios-driver-sdk डालें, पैकेज पाने के लिए Enter दबाएं और "पैकेज जोड़ें" पर क्लिक करें.
    3. किसी खास version को इंस्टॉल करने के लिए, डिपेंडेंसी नियम फ़ील्ड को वर्शन-आधारित विकल्पों में से किसी एक पर सेट करें. नए प्रोजेक्ट के लिए, हमारा सुझाव है कि आप सबसे नया वर्शन तय करें. साथ ही, "एग्ज़ैक्ट वर्शन" विकल्प इस्तेमाल करें. यह प्रोसेस पूरी होने के बाद, "पैकेज जोड़ें" पर क्लिक करें.
    4. पैकेज के प्रॉडक्ट चुनें विंडो से, पुष्टि करें कि GoogleRidesharingDriver को आपके तय किए गए main टारगेट में जोड़ दिया जाएगा. यह प्रोसेस पूरी होने के बाद, "पैकेज जोड़ें" पर क्लिक करें.
    5. अपने इंस्टॉलेशन की पुष्टि करने के लिए, अपने टारगेट के General पैनल पर जाएं. फ़्रेमवर्क, लाइब्रेरी, और एम्बेड किए गए कॉन्टेंट में, आपको इंस्टॉल किए गए पैकेज दिखेंगे. पैकेज और उसके वर्शन की पुष्टि करने के लिए, "Project Navigator" के "पैकेज डिपेंडेंसी" सेक्शन में भी देखा जा सकता है.

    किसी मौजूदा प्रोजेक्ट के लिए, package को अपडेट करने के लिए, यह तरीका अपनाएं:

    1. अगर आपको 9.0.0 से पहले के किसी वर्शन से अपग्रेड करना है,तो अपग्रेड करने के बाद आपको इन डिपेंडेंसी को हटा देना होगा: GoogleMapsBase, GoogleMapsCore, और GoogleMapsM4B. GoogleMaps के लिए डिपेंडेंसी न हटाएं. ज़्यादा जानकारी के लिए, वर्शन 9.0.0 के रिलीज़ नोट देखें.

      अपने Xcode प्रोजेक्ट की कॉन्फ़िगरेशन सेटिंग में जाकर, फ़्रेमवर्क, लाइब्रेरी, और एम्बेड किया गया कॉन्टेंट ढूंढें. नीचे दिए गए फ़्रेमवर्क को हटाने के लिए, माइनस के निशान(-) का इस्तेमाल करें:

      • GoogleMapsBase (सिर्फ़ 9.0.0 से पहले के वर्शन पर अपग्रेड करने के लिए)
      • GoogleMapsCore (सिर्फ़ 9.0.0 से पहले के वर्शन पर अपग्रेड करने के लिए)
      • GoogleMapsM4B (सिर्फ़ 9.0.0 से पहले के वर्शन पर अपग्रेड करने के लिए)
    2. Xcode से, "फ़ाइल > पैकेज > सबसे नए पैकेज वर्शन में अपडेट करें" पर जाएं.
    3. अपने इंस्टॉलेशन की पुष्टि करने के लिए, प्रोजेक्ट नेविगेटर के पैकेज डिपेंडेंसी सेक्शन में जाकर पैकेज और उसके वर्शन की पुष्टि करें.

    CocoaPods का इस्तेमाल करके जोड़ी गई मौजूदा ड्राइवर SDK डिपेंडेंसी को हटाने के लिए, यह तरीका अपनाएं:

    1. Xcode के फ़ाइल फ़ोल्डर को बंद करें. टर्मिनल खोलें और यह निर्देश दें:
      sudo gem install cocoapods-deintegrate cocoapods-clean 
      pod deintegrate 
      pod cache clean --all
    2. अगर Podfile, Podfile.resolved, और Xcode workspace को CocoaPod के अलावा किसी और काम के लिए इस्तेमाल नहीं किया जा रहा है, तो उन्हें हटा दें.

    मैन्युअल रूप से इंस्टॉल किए गए मौजूदा ड्राइवर SDK को हटाने के लिए, इन चरणों का पालन करें:

    1. अपने Xcode प्रोजेक्ट की कॉन्फ़िगरेशन सेटिंग में जाकर, फ़्रेमवर्क, लाइब्रेरी, और एम्बेड किया गया कॉन्टेंट ढूंढें. नीचे दिए गए फ़्रेमवर्क को हटाने के लिए, माइनस के निशान(-) का इस्तेमाल करें:

      • GoogleRidesharingDriver.xcframework
    2. अपने Xcode प्रोजेक्ट की टॉप लेवल डायरेक्ट्री से, GoogleRidesharingDriver बंडल हटाएं.

    CocoaPods

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

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

      source "https://github.com/CocoaPods/Specs.git"
      
      target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
        pod 'GoogleRidesharingDriver'
      end
      

      यहां एक उदाहरण दिया गया है, जिसमें डिपेंडेंसी के तौर पर Driver SDK टूल के लिए ऐल्फ़ा और बीटा पॉड शामिल हैं:

      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 फ़ाइल का इस्तेमाल करना होगा.

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

    मैन्युअल तरीके से इंस्टॉल करना

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

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

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

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

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

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

    Apple की निजता मेनिफ़ेस्ट फ़ाइल जोड़ें

    Apple को App Store पर मौजूद ऐप्लिकेशन के लिए, ऐप्लिकेशन की निजता जानकारी की ज़रूरत होती है. अपडेट और ज़्यादा जानकारी के लिए, Apple App Store के निजता की ज़्यादा जानकारी वाले पेज पर जाएं.

    1. iOS के लिए ड्राइवर SDK टूल के लिए, निजता मेनिफ़ेस्ट बंडल डाउनलोड करें: GoogleRidesharingDriverPrivacy.
    2. GoogleRidesharingDriverPrivacy.bundle को ऐक्सेस करने के लिए फ़ाइल निकालें.
    3. इनमें से किसी एक तरीके का इस्तेमाल करके, GoogleRidesharingDriverPrivacy.bundle को Xcode प्रोजेक्ट नेविगेटर में जोड़ें. पक्का करें कि आपके ऐप्लिकेशन के टारगेट के लिए, "टारगेट में जोड़ें" बॉक्स चुना गया हो. जोड़े जाने के बाद, PrivacyInfo फ़ाइल, प्रोजेक्ट नेविगेटर में दिखती है और आपके पास वैल्यू की जांच करने का विकल्प होता है.
    4. Xcode निजता की जानकारी का स्क्रीनशॉट
    5. पुष्टि करें कि आपके ऐप्लिकेशन का संग्रह बनाकर और संग्रह से निजता रिपोर्ट जनरेट करके, निजता मेनिफ़ेस्ट को जोड़ा गया हो.

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

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

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

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

    Fleet Engine सर्वर से जिन टोकन की उम्मीद की जाती है उनके बारे में जानने के लिए, अनुमति के लिए JSON Web Token (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
    

    RideshareDriverAPI इंस्टेंस बनाना

    GMTDVehicleReporter इंस्टेंस पाने के लिए, आपको सबसे पहले providerID,vehicleID,driverContext, और accessTokenProvider का इस्तेमाल करके GMTDRidesharingDriverAPI इंस्टेंस बनाना होगा. providerID और 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];
    }
    

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

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

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

    • 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
    

    GMSRoadSnappedLocationProvider में लिसनर के तौर पर GMTDVehicleReporter जोड़ें

    ड्राइवर 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
    

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

    जगह की जानकारी ट्रैक करने की सुविधा चालू करने के लिए, आपका ऐप्लिकेशन GMTDVehicleReporter पर locationTrackingEnabled को true पर सेट कर सकता है. GMTDVehicleReporter अपने-आप जगह की जानकारी के अपडेट भेजता है. सेवाओं से मैच होने और वाहन को यात्रा के लिए असाइन करने के बाद, GMTDVehicleReporter, GMSNavigator के नेविगेशन मोड में होने पर, रास्ते के अपडेट अपने-आप भेजता है. ऐसा तब होता है, जब मंज़िल setDestinations के ज़रिए सेट हो.

    यात्रा अपडेट के दौरान सेट किया गया रास्ता वही रास्ता होगा जिस पर ड्राइवर ने नेविगेशन सत्र के दौरान नेविगेट किया है. इसलिए, यात्रा को शेयर करने की सुविधा सही तरीके से काम करे, इसके लिए setDestinations से सेट किया गया वेपॉइंट, Fleet Engine बैकएंड में सेट किए गए डेस्टिनेशन से मेल खाना चाहिए.

    अगर locationTrackingEnabled को true पर सेट किया गया है, तो यात्रा और वाहन के अपडेट, locationUpdateInterval के लिए सेट की गई वैल्यू के आधार पर नियमित अंतराल में Fleet Engine बैकएंड को भेजे जाते हैं. अगर locationTrackingEnabled को false पर सेट किया जाता है, तो अपडेट बंद हो जाते हैं और वाहन की स्थिति को GMTDVehicleState.offline पर सेट करने के लिए, वाहन अपडेट करने का आखिरी अनुरोध Fleet Engine के बैकएंड को भेजा जाता है. अगर 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 गड़बड़ी हो सकती है और आम तौर पर, Chrome चालू होने के बाद पहले अपडेट के दौरान ऐसा होता है. नीचे दिए गए उदाहरण में इस गड़बड़ी को ठीक करने का तरीका बताया गया है:

    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 पर सेट कर सकता है. अपडेट बंद करने से, Fleet Engine बैकएंड पर वाहन की स्थिति OFFLINE पर सेट हो जाती है.

    Swift

    vehicleReporter.locationTrackingEnabled = false
    

    Objective-C

    _vehicleReporter.locationTrackingEnabled = NO;