iOS এর জন্য ড্রাইভার SDK দিয়ে শুরু করা

আপনি আপনার ট্রিপ এবং অর্ডার অগ্রগতি অ্যাপ্লিকেশনে উন্নত নেভিগেশন এবং ট্র্যাকিং প্রদান করতে ড্রাইভার SDK ব্যবহার করতে পারেন। ড্রাইভার SDK অন-ডিমান্ড রাইডস এবং ডেলিভারি সলিউশন ফ্লিট ইঞ্জিনে গাড়ির অবস্থান এবং টাস্ক আপডেট প্রদান করে।

ড্রাইভার SDK ফ্লিট ইঞ্জিন পরিষেবা এবং আপনার কাস্টম পরিষেবাগুলিকে গাড়ির অবস্থান এবং অবস্থা সম্পর্কে সচেতন রাখে৷ উদাহরণস্বরূপ, যানবাহনটি ONLINE বা OFFLINE হতে পারে এবং ট্রিপ অগ্রসর হওয়ার সাথে সাথে গাড়ির অবস্থান পরিবর্তিত হয়৷

নূন্যতম সিস্টেমের জন্য আবশ্যক

  • মোবাইল ডিভাইসটি অবশ্যই iOS 14 বা তার পরে চলমান হতে হবে।
  • Xcode সংস্করণ 15 বা তার পরে।
  • পূর্বশর্ত

    এই নির্দেশিকাটি অনুমান করে যে আপনার অ্যাপ ইতিমধ্যেই নেভিগেশন SDK প্রয়োগ করেছে এবং ফ্লিট ইঞ্জিন ব্যাকএন্ড সেট আপ এবং উপলব্ধ। যাইহোক, ন্যাভিগেশন SDK কিভাবে সেট আপ করতে হয় তার নমুনা কোডটি প্রদান করে।

    এছাড়াও আপনাকে অবশ্যই আপনার Google ক্লাউড প্রজেক্টে iOS এর জন্য Maps SDK সক্ষম করতে হবে এবং একটি API কী পেতে হবে

    প্রকল্প কনফিগারেশন

    সুইফট প্যাকেজ ম্যানেজার

    ড্রাইভার SDK সুইফট প্যাকেজ ম্যানেজারের মাধ্যমে ইনস্টল করা যেতে পারে। SDK যোগ করতে, নিশ্চিত করুন যে আপনি যেকোন বিদ্যমান ড্রাইভার SDK নির্ভরতা মুছে ফেলেছেন।

    একটি নতুন বা বিদ্যমান প্রকল্পে SDK যোগ করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

    1. আপনার Xcode project বা workspace খুলুন, তারপর ফাইল > প্যাকেজ নির্ভরতা যোগ করুন এ যান।
    2. URL হিসেবে https://github.com/googlemaps/ios-driver-sdk লিখুন, প্যাকেজ টানতে এন্টার টিপুন এবং "প্যাকেজ যোগ করুন" এ ক্লিক করুন।
    3. একটি নির্দিষ্ট version ইনস্টল করতে, নির্ভরতা নিয়ম ক্ষেত্রটি সংস্করণ-ভিত্তিক বিকল্পগুলির একটিতে সেট করুন। নতুন প্রকল্পগুলির জন্য, আমরা সর্বশেষ সংস্করণ নির্দিষ্ট করার এবং "সঠিক সংস্করণ" বিকল্পটি ব্যবহার করার পরামর্শ দিই৷ একবার সম্পূর্ণ হলে, "প্যাকেজ যোগ করুন" এ ক্লিক করুন।
    4. প্যাকেজ পণ্য চয়ন করুন উইন্ডো থেকে, যাচাই করুন GoogleRidesharingDriver আপনার নির্ধারিত main লক্ষ্যে যোগ করা হবে। একবার সম্পূর্ণ হলে, "প্যাকেজ যোগ করুন" এ ক্লিক করুন।
    5. আপনার ইনস্টলেশন যাচাই করতে, আপনার লক্ষ্যের General ফলকে নেভিগেট করুন। ফ্রেমওয়ার্ক, লাইব্রেরি এবং এমবেডেড সামগ্রীতে আপনার ইনস্টল করা প্যাকেজগুলি দেখতে হবে। আপনি প্যাকেজ এবং এর সংস্করণ যাচাই করতে "প্রজেক্ট নেভিগেটর" এর "প্যাকেজ নির্ভরতা" বিভাগটি দেখতে পারেন।

    একটি বিদ্যমান প্রকল্পের জন্য package আপডেট করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

    1. এক্সকোড থেকে, "ফাইল> প্যাকেজ> সর্বশেষ প্যাকেজ সংস্করণে আপডেট" এ যান।
    2. আপনার ইনস্টলেশন যাচাই করতে, প্যাকেজ এবং এর সংস্করণ যাচাই করতে প্রজেক্ট নেভিগেটরের প্যাকেজ নির্ভরতা বিভাগে যান।

    CocoaPods ব্যবহার করে যোগ করা বিদ্যমান ড্রাইভার SDK নির্ভরতাগুলি সরাতে, এই পদক্ষেপগুলি অনুসরণ করুন:

    1. আপনার এক্সকোড ওয়ার্কস্পেস বন্ধ করুন। টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডটি চালান:
      sudo gem install cocoapods-deintegrate cocoapods-clean 
      pod deintegrate 
      pod cache clean --all
    2. Podfile , Podfile.resolved এবং Xcode workspace সরিয়ে ফেলুন যদি আপনি CocoaPods ছাড়া অন্য কিছুর জন্য ব্যবহার না করেন।

    ম্যানুয়ালি ইনস্টল করা বিদ্যমান ড্রাইভার SDK সরাতে, এই পদক্ষেপগুলি অনুসরণ করুন:

    1. আপনার Xcode প্রকল্প কনফিগারেশন সেটিংস থেকে, ফ্রেমওয়ার্ক, লাইব্রেরি এবং এমবেডেড সামগ্রী খুঁজুন। নিম্নলিখিত কাঠামো সরাতে বিয়োগ চিহ্ন (-) ব্যবহার করুন:

      • GoogleRidesharingDriver.xcframework
    2. আপনার Xcode প্রকল্পের শীর্ষ স্তরের ডিরেক্টরি থেকে, GoogleRidesharingDriver বান্ডেলটি সরান৷

    কোকোপডস

    CocoaPods ব্যবহার করে ড্রাইভার SDK কনফিগার করতে, আপনার নিম্নলিখিত আইটেমগুলির প্রয়োজন:

    • CocoaPods টুল: এই টুলটি ইনস্টল করতে, টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডটি চালান।
       sudo gem install cocoapods
    
    1. ড্রাইভার SDK-এর জন্য একটি Podfile তৈরি করুন এবং API এবং এর নির্ভরতা ইনস্টল করতে এটি ব্যবহার করুন: আপনার প্রকল্প ডিরেক্টরিতে Podfile নামে একটি ফাইল তৈরি করুন। এই ফাইলটি আপনার প্রকল্পের নির্ভরতা সংজ্ঞায়িত করে। Podfile সম্পাদনা করুন এবং আপনার নির্ভরতা যোগ করুন। এখানে একটি উদাহরণ যা নির্ভরতা অন্তর্ভুক্ত করে:

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

      এখানে একটি উদাহরণ রয়েছে যা নির্ভরতা হিসাবে ড্রাইভার 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-এ নির্দিষ্ট করা APIগুলিকে ইনস্টল করবে, সাথে তাদের যে কোনো নির্ভরতা থাকতে পারে।

      pod install
      
    4. Xcode বন্ধ করুন, এবং তারপর Xcode চালু করতে আপনার প্রকল্পের .xcworkspace ফাইল খুলুন (ডাবল-ক্লিক করুন)। এই সময় থেকে, আপনাকে প্রকল্পটি খুলতে .xcworkspace ফাইলটি ব্যবহার করতে হবে।

    আরো বিস্তারিত জানার জন্য CocoaPods শুরু করার নির্দেশিকা পড়ুন।

    ম্যানুয়াল ইনস্টলেশন

    একটি XCFramework হল একটি বাইনারি প্যাকেজ যা আপনি ড্রাইভার SDK ইনস্টল করতে ব্যবহার করেন। আপনি অ্যাপল সিলিকন ব্যবহার করে মেশিন সহ একাধিক প্ল্যাটফর্মে এই প্যাকেজটি ব্যবহার করতে পারেন। এই নির্দেশিকাটি দেখায় কিভাবে ম্যানুয়ালি আপনার প্রোজেক্টে ড্রাইভার SDK ধারণকারী XCFramework যোগ করতে হয় এবং Xcode-এ আপনার বিল্ড সেটিংস কনফিগার করতে হয়।

    SDK বাইনারি এবং সম্পদ ডাউনলোড করুন:

    1. XCFramework এবং সংস্থানগুলি অ্যাক্সেস করতে ফাইলগুলি বের করুন৷

    2. Xcode শুরু করুন এবং হয় একটি বিদ্যমান প্রকল্প খুলুন, অথবা একটি নতুন প্রকল্প তৈরি করুন। আপনি যদি iOS এ নতুন হন, একটি নতুন প্রকল্প তৈরি করুন এবং iOS অ্যাপ টেমপ্লেট নির্বাচন করুন।

    3. আপনার প্রোজেক্ট গ্রুপের অধীনে একটি ফ্রেমওয়ার্ক গ্রুপ তৈরি করুন যদি একটি ইতিমধ্যে বিদ্যমান না থাকে।

    4. ড্রাইভার SDK ইনস্টল করতে, GoogleRidesharingDriver.xcframework ফাইলটিকে আপনার প্রকল্পে ফ্রেমওয়ার্ক, লাইব্রেরি এবং এমবেডেড সামগ্রীর অধীনে টেনে আনুন। যখন অনুরোধ করা হয়, প্রয়োজন হলে আইটেমগুলি অনুলিপি করুন নির্বাচন করুন।

    5. ডাউনলোড করা GoogleRidesharingDriver.bundle টিকে আপনার Xcode প্রকল্পের শীর্ষ স্তরের ডিরেক্টরিতে টেনে আনুন৷ যখন অনুরোধ করা হয়, Copy items if needed নির্বাচন করুন।

    6. প্রজেক্ট নেভিগেটর থেকে আপনার প্রজেক্ট সিলেক্ট করুন এবং আপনার অ্যাপ্লিকেশনের টার্গেট বেছে নিন।

    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 যোগ করুন। যদি এই সেটিংসগুলি দৃশ্যমান না হয়, তবে বিল্ড সেটিংস বারে ফিল্টারটি বেসিক থেকে সকলে পরিবর্তন করুন৷

    অ্যাপল প্রাইভেসি ম্যানিফেস্ট ফাইল যোগ করুন

    1. iOS-এর জন্য ড্রাইভার SDK-এর গোপনীয়তা ম্যানিফেস্ট বান্ডেলটি ডাউনলোড করুন: GoogleRidesharingDriverPrivacy
    2. GoogleRidesharingDriverPrivacy.bundle অ্যাক্সেস করতে ফাইলটি বের করুন।
    3. এই পদ্ধতিগুলির মধ্যে একটি ব্যবহার করে Xcode প্রকল্প নেভিগেটরে GoogleRidesharingDriverPrivacy.bundle যোগ করুন। আপনার অ্যাপের টার্গেটের জন্য "অ্যাড টু টার্গেট" বক্সটি চেক করা হয়েছে তা নিশ্চিত করুন। একবার যোগ করা হলে, PrivacyInfo ফাইলটি প্রোজেক্ট নেভিগেটরে প্রদর্শিত হয় এবং আপনি মানগুলি পরীক্ষা করতে পারেন।
    4. এক্সকোড গোপনীয়তা তথ্য স্ক্রিনশট
    5. আপনার অ্যাপের একটি সংরক্ষণাগার তৈরি করে এবং সংরক্ষণাগার থেকে একটি গোপনীয়তা প্রতিবেদন তৈরি করে গোপনীয়তা ম্যানিফেস্ট যোগ করা হয়েছে তা যাচাই করুন৷

    অনুমোদন এবং প্রমাণীকরণ বাস্তবায়ন

    যখন আপনার ড্রাইভার অ্যাপ ফ্লিট ইঞ্জিন ব্যাকএন্ডে আপডেট তৈরি করে এবং পাঠায়, তখন অনুরোধে অবশ্যই বৈধ অ্যাক্সেস টোকেন অন্তর্ভুক্ত থাকতে হবে। এই অনুরোধগুলিকে অনুমোদন এবং প্রমাণীকরণ করতে, ড্রাইভার SDK আপনার বস্তুটিকে GMTDAuthorization প্রোটোকলের সাথে সামঞ্জস্যপূর্ণ কল করে৷ বস্তুটি প্রয়োজনীয় অ্যাক্সেস টোকেন প্রদানের জন্য দায়ী।

    অ্যাপ ডেভেলপার হিসেবে, আপনি কীভাবে টোকেন তৈরি করবেন তা বেছে নিন। আপনার বাস্তবায়ন নিম্নলিখিত কাজ করার ক্ষমতা প্রদান করা উচিত:

    • একটি অ্যাক্সেস টোকেন আনুন, সম্ভবত JSON ফর্ম্যাটে, একটি HTTPS সার্ভার থেকে।
    • টোকেনটি পার্স করুন এবং ক্যাশে করুন।
    • মেয়াদ শেষ হয়ে গেলে টোকেনটি রিফ্রেশ করুন।

    ফ্লিট ইঞ্জিন সার্ভার দ্বারা প্রত্যাশিত টোকেনগুলির বিশদ বিবরণের জন্য, অনুমোদনের জন্য একটি JSON ওয়েব টোকেন (JWT) তৈরি করা দেখুন।

    প্রদানকারী আইডিটি Google ক্লাউড প্রকল্প আইডির মতোই। আরও তথ্যের জন্য ফ্লিট ইঞ্জিন কুইকস্টার্ট গাইড দেখুন।

    নিম্নলিখিত উদাহরণ একটি অ্যাক্সেস টোকেন প্রদানকারী প্রয়োগ করে:

    সুইফট

    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()
      }
    }
    

    উদ্দেশ্য গ

    #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 ইনস্ট্যান্স তৈরি করতে হবে। প্রদানকারী আইডি Google ক্লাউড প্রজেক্ট আইডির মতোই। এবং আপনি সরাসরি ড্রাইভার API থেকে GMTDVehicleReporter উদাহরণ অ্যাক্সেস করতে পারেন।

    নিম্নলিখিত উদাহরণটি একটি GMTDRidesharingDriverAPI উদাহরণ তৈরি করে:

    সুইফট

    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)
      }
    }
    

    উদ্দেশ্য গ

    #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 ইভেন্টগুলি শুনুন

    GMTDVehicleReporter পর্যায়ক্রমে গাড়ি আপডেট করে যখন locationTrackingEnabled true হয়। এই পর্যায়ক্রমিক আপডেটগুলিতে প্রতিক্রিয়া জানাতে, যেকোনো বস্তু GMTDVehicleReporterListener প্রোটোকল মেনে GMTDVehicleReporter ইভেন্টগুলিতে সদস্যতা নিতে পারে।

    আপনি নিম্নলিখিত ইভেন্টগুলি পরিচালনা করতে পারেন:

    • vehicleReporter(_:didSucceed:)

      ড্রাইভার অ্যাপকে জানায় যে ব্যাকএন্ড পরিষেবাগুলি সফলভাবে গাড়ির অবস্থান এবং রাজ্য আপডেট পেয়েছে৷

    • vehicleReporter(_:didFail:withError:)

      শ্রোতাকে অবহিত করে যে একটি গাড়ির আপডেট ব্যর্থ হয়েছে৷ যতক্ষণ লোকেশন ট্র্যাকিং সক্ষম থাকে, GMTDVehicleReporter ফ্লিট ইঞ্জিন ব্যাকএন্ডে সর্বশেষ ডেটা পাঠাতে থাকে।

    নিম্নলিখিত উদাহরণ এই ঘটনাগুলি পরিচালনা করে:

    সুইফট

    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.
      }
    }
    

    উদ্দেশ্য গ

    /*
    
        *   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-এ শ্রোতা হিসেবে যোগ করুন

    ড্রাইভার SDK-কে অবস্থান আপডেট দেওয়ার জন্য, GMTDVehicleReporter GMSRoadSnappedLocationProvider এর শ্রোতা হিসাবে সেট করতে হবে।

    সুইফট

    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()
        }
      }
    }
    

    উদ্দেশ্য গ

    /*
    
        *   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
    

    অবস্থান ট্র্যাকিং সক্ষম করুন

    অবস্থান ট্র্যাকিং সক্ষম করতে, আপনার অ্যাপ GMTDVehicleReporterlocationTrackingEnabled কে true সেট করতে পারে। GMTDVehicleReporter স্বয়ংক্রিয়ভাবে অবস্থান আপডেট পাঠায়. পরিষেবাগুলি মিলে যাওয়ার পরে এবং একটি ট্রিপে যানটিকে বরাদ্দ করার পরে, GMTDVehicleReporter স্বয়ংক্রিয়ভাবে রুট আপডেট পাঠায় যখন GMSNavigator নেভিগেশন মোডে থাকে (যখন একটি গন্তব্য setDestinations এর মাধ্যমে সেট করা হয়)।

    ট্রিপ আপডেটের সময় যে রুট সেট করা হবে সেই রুটে ড্রাইভার নেভিগেশন সেশনের সময় নেভিগেট করছে। সুতরাং, যাত্রা ভাগাভাগি সঠিকভাবে কাজ করার জন্য, setDestinations মাধ্যমে সেট করা ওয়েপয়েন্টটি ফ্লিট ইঞ্জিন ব্যাকএন্ডে সেট করা গন্তব্যের সাথে মেলে।

    যদি locationTrackingEnabled true সেট করা থাকে, তাহলে locationUpdateInterval এর জন্য সেট করা মানের উপর ভিত্তি করে নিয়মিত বিরতিতে ফ্লিট ইঞ্জিন ব্যাকএন্ডে ট্রিপ এবং গাড়ির আপডেট পাঠানো হয়। যদি locationTrackingEnabled false সেট করা হয়, আপডেটগুলি বন্ধ হয়ে যায় এবং গাড়ির অবস্থা GMTDVehicleState.offline এ সেট করতে ফ্লিট ইঞ্জিন ব্যাকএন্ডে একটি চূড়ান্ত যানবাহন আপডেটের অনুরোধ পাঠানো হয়। যখন locationTrackingEnabled false সেট করা থাকে তখন ব্যর্থতাগুলি পরিচালনা করার বিষয়ে বিশেষ বিবেচনার জন্য updateVehicleState দেখুন।

    নিম্নলিখিত উদাহরণ অবস্থান ট্র্যাকিং সক্ষম করে:

    সুইফট

    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
      }
    }
    

    উদ্দেশ্য গ

    /*
        *   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 দেখুন।

    সুইফট

    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)
      }
    }
    

    উদ্দেশ্য গ

    #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 ত্রুটি ঘটতে পারে যখন মাস্ক খালি থাকে এবং এটি সাধারণত শুরু হওয়ার পরে প্রথম আপডেটের জন্য ঘটে। নিম্নলিখিত উদাহরণ দেখায় কিভাবে এই ত্রুটি পরিচালনা করতে হয়:

    সুইফট

    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
      }
    }
    
    

    উদ্দেশ্য গ

    #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 সেট করে।

    সুইফট

    vehicleReporter.locationTrackingEnabled = false
    

    উদ্দেশ্য গ

    _vehicleReporter.locationTrackingEnabled = NO;