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

ড্রাইভার SDK হল একটি লাইব্রেরি যা আপনি আপনার ড্রাইভার অ্যাপে একত্রিত করেন। এটি চালকের অবস্থান, রুট, অবশিষ্ট দূরত্ব এবং ETA সহ ফ্লিট ইঞ্জিন আপডেট করার জন্য দায়ী। এটি নেভিগেশন SDK-এর সাথেও একীভূত হয়, যা ড্রাইভারের জন্য পালাক্রমে নেভিগেশন নির্দেশাবলী প্রদান করে।

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

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

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

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

    প্রবেশাধিকার পেতে

    আপনি যদি একজন Google Workspace গ্রাহক হন, তাহলে অনবোর্ডিংয়ের সময় একটি Workspace গ্রুপ তৈরি করুন যেমন google-maps-platform-sdk-users@workspacedomain.com এবং Google-কে নাম দিন। এটি সুপারিশকৃত পদ্ধতি। তারপরে আপনার ওয়ার্কস্পেস গ্রুপকে একটি অনুমোদিত তালিকায় যোগ করা হবে যা সঠিক CocoaPods সংগ্রহস্থলগুলিতে অ্যাক্সেস দেয়। নিশ্চিত করুন যে ব্যবহারকারীর ইমেল এবং পরিষেবা অ্যাকাউন্টের যে ইমেলগুলি অ্যাক্সেসের প্রয়োজন সেগুলি এই তালিকায় অন্তর্ভুক্ত রয়েছে৷

    যদি আপনার সংস্থা ওয়ার্কস্পেস গ্রুপ তৈরি করতে না পারে, তাহলে Google-কে ব্যবহারকারী এবং পরিষেবা অ্যাকাউন্টের ইমেলের একটি তালিকা পাঠান যেগুলির এই শিল্পকর্মগুলিতে অ্যাক্সেস প্রয়োজন।

    স্থানীয় উন্নয়ন

    স্থানীয় উন্নয়নের জন্য, ক্লাউড SDK-এর সাথে লগ ইন করাই যথেষ্ট।

    জিক্লাউড

    gcloud auth login
    

    লগ ইন করতে ব্যবহৃত ইমেলটি অবশ্যই ওয়ার্কস্পেস গ্রুপের সদস্য হতে হবে।

    অটোমেশন (সিস্টেম তৈরি বা ক্রমাগত ইন্টিগ্রেশন)

    সেরা অনুশীলন অনুযায়ী আপনার অটোমেশন হোস্ট সেট আপ করুন:

    • যদি আপনার প্রক্রিয়া Google ক্লাউড পরিবেশে চলে, তাহলে স্বয়ংক্রিয় শংসাপত্র সনাক্তকরণ ব্যবহার করুন।

    • অন্যথায়, পরিষেবা অ্যাকাউন্ট কী ফাইলটি হোস্টের ফাইল-সিস্টেমের একটি নিরাপদ স্থানে সংরক্ষণ করুন এবং GOOGLE_APPLICATION_CREDENTIALS পরিবেশ পরিবর্তনশীলকে যথাযথভাবে সেট করুন৷

    শংসাপত্রের সাথে সম্পর্কিত পরিষেবা অ্যাকাউন্ট ইমেল অবশ্যই Workspace Goup-এর সদস্য হতে হবে।

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

    আপনি CocoaPods ব্যবহার করে ড্রাইভার SDK কনফিগার করতে পারেন।

    কোকোপড ব্যবহার করুন

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

    • CocoaPods টুল: এই টুলটি ইনস্টল করতে, টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডটি চালান। shell sudo gem install cocoapods আরো বিস্তারিত জানার জন্য CocoaPods শুরু করার নির্দেশিকা পড়ুন।
    1. ড্রাইভার SDK-এর জন্য একটি Podfile তৈরি করুন এবং API এবং এর নির্ভরতা ইনস্টল করতে এটি ব্যবহার করুন: আপনার প্রকল্প ডিরেক্টরিতে 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-এ নির্দিষ্ট করা APIগুলিকে ইনস্টল করবে, সাথে তাদের যে কোনো নির্ভরতা থাকতে পারে।

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

    আলফা/বিটা SDK সংস্করণ

    IOS-এর জন্য ড্রাইভার SDK-এর আলফা বা বিটা সংস্করণ কনফিগার করতে আপনার নিম্নলিখিত আইটেমগুলির প্রয়োজন:

    • CocoaPods টুল: এই টুলটি ইনস্টল করতে, টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডটি চালান।

      sudo gem install cocoapods
      

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

    • Google অ্যাক্সেস তালিকায় আপনার বিকাশ অ্যাকাউন্ট। SDK-এর আলফা এবং বিটা সংস্করণের পড সংগ্রহস্থল পাবলিক সোর্স নয়। এই সংস্করণগুলি অ্যাক্সেস করতে, Google গ্রাহক প্রকৌশলীর সাথে যোগাযোগ করুন৷ প্রকৌশলী আপনার ডেভেলপমেন্ট অ্যাকাউন্ট অ্যাক্সেস তালিকায় যোগ করে এবং তারপর প্রমাণীকরণের জন্য একটি কুকি সেট করে

    আপনার প্রকল্প অ্যাক্সেস তালিকায় পরে, আপনি পড অ্যাক্সেস করতে পারেন.

    1. IOS-এর জন্য ড্রাইভার SDK-এর জন্য একটি Podfile তৈরি করুন এবং API এবং এর নির্ভরতাগুলি ইনস্টল করতে এটি ব্যবহার করুন: আপনার প্রকল্প ডিরেক্টরিতে 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-এ নির্দিষ্ট করা APIগুলিকে ইনস্টল করবে, সাথে তাদের যে কোনো নির্ভরতা থাকতে পারে।

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

    XCFramework ইনস্টল করুন

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

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

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

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

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

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

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

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

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

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

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

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

    • vehicleReporter:didSucceedVehicleUpdate

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

    • vehicleReporter:didFailVehicleUpdate:withError

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

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

    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
    

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

    লোকেশন ট্র্যাকিং সক্ষম করতে, আপনার অ্যাপ GMTDDeliveryVehicleReporterlocationTrackingEnabled YES সেট করতে পারে। তারপর GMTDDeliveryVehicleReporter = স্বয়ংক্রিয়ভাবে অবস্থান আপডেট পাঠাবে। যখন GMSNavigator নেভিগেশন মোডে থাকে (যখন একটি গন্তব্য setDestinations মাধ্যমে সেট করা হয়) এবং locationTrackingEnabled YES সেট করা থাকে, GMTDDeliveryVehicleReporter স্বয়ংক্রিয়ভাবে রুট এবং ETA আপডেটও পাঠাবে।

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

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

    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
    

    আপডেট_মাস্ক ত্রুটিগুলি পরিচালনা করুন

    যখন GMTDDeliveryVehicleReporter একটি গাড়ির আপডেট পাঠায়, মাস্কটি খালি থাকলে একটি 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