شروع کار با Driver SDK برای iOS

می توانید از Driver SDK برای ارائه ناوبری و ردیابی پیشرفته به برنامه سفر و پیشرفت سفارش خود استفاده کنید. Driver SDK به‌روزرسانی‌های مکان خودرو و وظایف را به موتور ناوگان راه‌حل بر اساس تقاضا و تحویل ارائه می‌کند.

Driver SDK خدمات Fleet Engine و خدمات سفارشی شما را از موقعیت و وضعیت خودرو آگاه می کند. برای مثال، وسیله نقلیه می‌تواند ONLINE یا OFFLINE باشد، و مکان وسیله نقلیه با پیشرفت سفر تغییر می‌کند.

کمترین سیستم مورد نیاز

  • دستگاه تلفن همراه باید دارای iOS 14 یا جدیدتر باشد.
  • Xcode نسخه 15 یا بالاتر.
  • پیش نیازها

    این راهنما فرض می‌کند که برنامه شما قبلاً Navigation SDK را پیاده‌سازی کرده است و پشتیبان Fleet Engine راه‌اندازی و در دسترس است. با این حال، کد مثال نمونه ای از نحوه راه اندازی Navigation SDK را ارائه می دهد.

    همچنین باید Maps SDK برای iOS را در پروژه Google Cloud خود فعال کنید و یک کلید API دریافت کنید .

    پیکربندی پروژه

    مدیر بسته سوئیفت

    Driver SDK را می توان از طریق Swift Package Manager نصب کرد. برای افزودن SDK، مطمئن شوید که وابستگی‌های Driver SDK موجود را حذف کرده‌اید.

    برای افزودن SDK به یک پروژه جدید یا موجود، مراحل زیر را دنبال کنید:

    1. project یا workspace Xcode خود را باز کنید، سپس به File > Add Package Dependencies بروید.
    2. https://github.com/googlemaps/ios-driver-sdk را به عنوان URL وارد کنید، Enter را فشار دهید تا بسته را وارد کنید و روی «افزودن بسته» کلیک کنید.
    3. برای نصب یک version خاص، قسمت Dependency Rule را روی یکی از گزینه های مبتنی بر نسخه تنظیم کنید. برای پروژه های جدید، توصیه می کنیم آخرین نسخه را مشخص کنید و از گزینه "نسخه دقیق" استفاده کنید. پس از تکمیل، روی "افزودن بسته" کلیک کنید.
    4. از پنجره انتخاب محصولات بسته ، تأیید کنید که GoogleRidesharingDriver به هدف main تعیین‌شده شما اضافه می‌شود. پس از تکمیل، روی "افزودن بسته" کلیک کنید.
    5. برای تأیید نصب خود، به صفحه General هدف خود بروید. در Frameworks، Libraries و Embedded Content باید بسته های نصب شده را ببینید. همچنین می‌توانید برای تأیید بسته و نسخه آن، بخش «وابستگی‌های بسته» در «ناوبر پروژه» را مشاهده کنید.

    برای به روز رسانی package برای یک پروژه موجود، این مراحل را دنبال کنید:

    1. اگر از نسخه‌ای زودتر از 9.0.0 ارتقا می‌دهید، باید وابستگی‌های زیر را حذف کنید: GoogleMapsBase ، GoogleMapsCore ، و GoogleMapsM4B پس از ارتقا. وابستگی GoogleMaps را حذف نکنید. برای اطلاعات بیشتر، به یادداشت‌های انتشار نسخه 9.0.0 مراجعه کنید.

      از تنظیمات پیکربندی پروژه Xcode خود، Frameworks، Libraries و Embedded Content را پیدا کنید. برای حذف چارچوب زیر از علامت منفی (-) استفاده کنید:

      • GoogleMapsBase (فقط برای ارتقا از نسخه های قبل از 9.0.0)
      • GoogleMapsCore (فقط برای ارتقا از نسخه های قبل از 9.0.0)
      • GoogleMapsM4B (فقط برای ارتقاء نسخه های قبل از 9.0.0)
    2. از Xcode، به "File > Packages > Update To Latest Package Versions" بروید.
    3. برای تأیید نصب خود، به بخش Package Dependencies در Project Navigator بروید تا بسته و نسخه آن را تأیید کنید.

    برای حذف وابستگی‌های Driver SDK موجود با استفاده از CocoaPods ، این مراحل را دنبال کنید:

    1. فضای کاری Xcode خود را ببندید. ترمینال را باز کنید و دستور زیر را اجرا کنید:
      sudo gem install cocoapods-deintegrate cocoapods-clean 
      pod deintegrate 
      pod cache clean --all
    2. اگر از آنها برای چیزی غیر از CocoaPods استفاده نمی کنید، Podfile ، Podfile.resolved و workspace Xcode را حذف کنید.

    برای حذف Driver SDK نصب شده به صورت دستی، این مراحل را دنبال کنید:

    1. از تنظیمات پیکربندی پروژه Xcode خود، Frameworks، Libraries و Embedded Content را پیدا کنید. از علامت منفی (-) برای حذف چارچوب زیر استفاده کنید:

      • GoogleRidesharingDriver.xcframework
    2. از دایرکتوری سطح بالای پروژه Xcode خود، بسته GoogleRidesharingDriver را حذف کنید.

    CocoaPods

    برای پیکربندی Driver SDK با استفاده از CocoaPods، به موارد زیر نیاز دارید:

    • ابزار CocoaPods: برای نصب این ابزار، Terminal را باز کرده و دستور زیر را اجرا کنید.
       sudo gem install cocoapods
    
    1. یک Podfile برای Driver SDK ایجاد کنید و از آن برای نصب API و وابستگی های آن استفاده کنید: فایلی به نام 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 بروید:

      cd <path-to-project>
      
    3. دستور نصب pod را اجرا کنید. این API های مشخص شده در Podfile را به همراه وابستگی هایی که ممکن است داشته باشند نصب می کند.

      pod install
      
    4. Xcode را ببندید و سپس فایل xcworkspace. پروژه خود را باز کنید (دوبار کلیک کنید) تا Xcode راه اندازی شود. از این زمان به بعد باید از فایل .xcworkspace برای باز کردن پروژه استفاده کنید.

    برای جزئیات بیشتر به راهنمای شروع CocoaPods مراجعه کنید.

    نصب دستی

    XCFramework یک بسته باینری است که برای نصب Driver SDK از آن استفاده می کنید. شما می توانید از این بسته بر روی چندین پلتفرم از جمله ماشین هایی که از سیلیکون اپل استفاده می کنند استفاده کنید. این راهنما نشان می دهد که چگونه XCFramework حاوی Driver SDK را به صورت دستی به پروژه خود اضافه کنید و تنظیمات ساخت خود را در Xcode پیکربندی کنید.

    باینری و منابع SDK را دانلود کنید:

    1. برای دسترسی به XCFramework و منابع، فایل ها را استخراج کنید.

    2. Xcode را راه اندازی کنید و یک پروژه موجود را باز کنید یا یک پروژه جدید ایجاد کنید. اگر در iOS تازه کار هستید، یک پروژه جدید ایجاد کنید و قالب iOS App را انتخاب کنید.

    3. در صورتی که قبلاً وجود نداشته باشد، یک گروه Frameworks در زیر گروه پروژه خود ایجاد کنید.

    4. برای نصب Driver SDK، فایل GoogleRidesharingDriver.xcframework را به داخل پروژه خود در بخش Frameworks, Libraries, and Embedded Content بکشید. هنگامی که از شما خواسته شد، در صورت نیاز، کپی موارد را انتخاب کنید.

    5. GoogleRidesharingDriver.bundle دانلود شده را به دایرکتوری سطح بالای پروژه Xcode خود بکشید. هنگامی که از شما خواسته شد، Copy items if needed را انتخاب کنید.

    6. پروژه خود را از Project Navigator انتخاب کنید و هدف برنامه خود را انتخاب کنید.

    7. تب Build Phases را باز کنید و در پیوند باینری با کتابخانه‌ها، چارچوب‌ها و کتابخانه‌های زیر را در صورتی که قبلاً موجود نیستند اضافه کنید:

      • 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. پروژه خود را به جای یک هدف خاص انتخاب کنید و تب Build Settings را باز کنید. در بخش Other Linker Flags ، -ObjC هم برای رفع اشکال و هم برای انتشار اضافه کنید. اگر این تنظیمات قابل مشاهده نیستند، فیلتر موجود در نوار تنظیمات ساخت را از Basic به All تغییر دهید.

    فایل Manifest Privacy Apple را اضافه کنید

    اپل به جزئیات حریم خصوصی برنامه برای برنامه های موجود در فروشگاه App نیاز دارد. برای به‌روزرسانی‌ها و اطلاعات بیشتر، از صفحه جزئیات حریم خصوصی فروشگاه App Apple دیدن کنید.

    1. بسته Manifest را برای Driver SDK برای iOS دانلود کنید: GoogleRidesharingDriverPrivacy .
    2. برای دسترسی به GoogleRidesharingDriverPrivacy.bundle فایل را استخراج کنید.
    3. GoogleRidesharingDriverPrivacy.bundle را با استفاده از یکی از این روش ها به ناوبری پروژه Xcode اضافه کنید. مطمئن شوید که کادر «افزودن به اهداف» برای هدف برنامه شما علامت زده شده است. پس از اضافه شدن، فایل PrivacyInfo در Project Navigator نمایش داده می شود و می توانید مقادیر را بررسی کنید.
    4. عکس صفحه اطلاعات حریم خصوصی Xcode
    5. با ایجاد یک بایگانی از برنامه خود و ایجاد یک گزارش حریم خصوصی از بایگانی، تأیید کنید که مانیفست حریم خصوصی اضافه شده است.

    اجرای مجوز و احراز هویت

    هنگامی که برنامه Driver شما به‌روزرسانی‌هایی را به باطن Fleet Engine ارسال می‌کند، درخواست‌ها باید شامل نشانه‌های دسترسی معتبر باشند. برای تأیید و تأیید اعتبار این درخواست‌ها، Driver SDK شی شما را مطابق با پروتکل GMTDAuthorization فراخوانی می‌کند. شی مسئول ارائه نشانه دسترسی مورد نیاز است.

    به عنوان توسعه‌دهنده برنامه، نحوه تولید توکن‌ها را انتخاب می‌کنید. پیاده سازی شما باید توانایی انجام موارد زیر را داشته باشد:

    • یک نشانه دسترسی، احتمالاً در قالب JSON، از یک سرور HTTPS واکشی کنید.
    • رمز را تجزیه و کش کنید.
    • زمانی که توکن منقضی شد، آن را رفرش کنید.

    برای جزئیات بیشتر توکن‌های مورد انتظار توسط سرور Fleet Engine، به ایجاد یک نشانه وب JSON (JWT) برای مجوز مراجعه کنید.

    شناسه ارائه دهنده همان شناسه پروژه Google Cloud است. برای اطلاعات بیشتر به راهنمای Fleet Engine Quick Start مراجعه کنید.

    مثال زیر یک ارائه دهنده نشانه دسترسی را پیاده سازی می کند:

    سریع

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

    هدف-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
    

    یک نمونه RidesharingDriverAPI ایجاد کنید

    برای دریافت نمونه GMTDVehicleReporter ، ابتدا باید با استفاده از شناسه ارائه دهنده، شناسه خودرو، driverContext و accessTokenProvider یک نمونه GMTDRidesharingDriverAPI ایجاد کنید. شناسه ارائه دهنده همان شناسه پروژه Google Cloud است. و می توانید مستقیماً از 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)
      }
    }
    

    هدف-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 گوش دهید

    GMTDVehicleReporter به صورت دوره ای وسیله نقلیه را زمانی که locationTrackingEnabled true باشد به روز می کند. برای پاسخ به این به‌روزرسانی‌های دوره‌ای، هر شی می‌تواند با انطباق با پروتکل GMTDVehicleReporterListener GMTDVehicleReporter شود.

    شما می توانید رویدادهای زیر را مدیریت کنید:

    • vehicleReporter(_:didSucceed:)

      به برنامه Driver اطلاع می دهد که سرویس های پشتیبان با موفقیت موقعیت خودرو و به روز رسانی وضعیت را دریافت کردند.

    • vehicleReporter(_:didFail:withError:)

      به شنونده اطلاع می دهد که به روز رسانی خودرو ناموفق است. تا زمانی که ردیابی موقعیت مکانی فعال باشد، GMTDVehicleReporter به ارسال آخرین داده‌ها به Fleet Engine ادامه می‌دهد.

    مثال زیر به این رویدادها رسیدگی می کند:

    سریع

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

    هدف-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
    

    GMTDVehicleReporter را به عنوان شنونده به GMSRoadSnappedLocationProvider اضافه کنید

    برای ارائه به‌روزرسانی‌های مکان در Driver 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()
        }
      }
    }
    

    هدف-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
    

    ردیابی موقعیت مکانی را فعال کنید

    برای فعال کردن ردیابی موقعیت مکانی، برنامه شما می‌تواند locationTrackingEnabled را روی true در GMTDVehicleReporter تنظیم کند. GMTDVehicleReporter به‌طور خودکار به‌روزرسانی‌های مکان را ارسال می‌کند. پس از تطبیق سرویس‌ها و اختصاص وسیله نقلیه به سفر، GMTDVehicleReporter به‌روزرسانی‌های مسیر را به‌طور خودکار هنگامی که GMSNavigator در حالت ناوبری است ارسال می‌کند (زمانی که مقصدی از طریق setDestinations تنظیم شده است).

    مسیری که در طول به‌روزرسانی سفر تعیین می‌شود، همان مسیری است که راننده در طول جلسه ناوبری به آن پیمایش می‌کند. بنابراین، برای اینکه اشتراک گذاری سفر به درستی کار کند، نقطه بین تعیین شده از طریق setDestinations باید با مقصد تعیین شده در باطن موتور ناوگان مطابقت داشته باشد.

    اگر locationTrackingEnabled روی true تنظیم شده باشد، به‌روزرسانی‌های سفر و وسیله نقلیه در یک بازه زمانی منظم بر اساس مقدار تعیین‌شده برای locationUpdateInterval ، به پشتیبان Fleet Engine ارسال می‌شوند. اگر locationTrackingEnabled روی false تنظیم شود، به‌روزرسانی‌ها متوقف می‌شوند و درخواست به‌روزرسانی نهایی خودرو به بخش پشتیبان Fleet Engine ارسال می‌شود تا وضعیت خودرو را روی 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
      }
    }
    

    هدف-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
    

    به طور پیش فرض، فاصله گزارش دهی ثانیه است، اما فاصله گزارش را می توان با 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)
      }
    }
    

    هدف-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 ممکن است زمانی رخ دهد که ماسک خالی باشد و معمولاً برای اولین به‌روزرسانی پس از راه‌اندازی رخ می‌دهد. مثال زیر نحوه رسیدگی به این خطا را نشان می دهد:

    سریع

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

    هدف-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 تنظیم می‌کند.

    سریع

    vehicleReporter.locationTrackingEnabled = false
    

    هدف-C

    _vehicleReporter.locationTrackingEnabled = NO;