بدء استخدام Driver SDK لنظام التشغيل iOS

يمكنك استخدام Driver SDK لتوفير تنقل وتتبّع محسّن تطبيق Trip and Order Progress توفّر "حزمة تطوير البرامج (SDK) للسائق" معلومات عن المركبة الموقع وتحديثات المهمة الخاصة بمحرك مجموعة حلول النقل عند الطلب وعمليات التسليم.

تُبقي "حزمة تطوير البرامج (SDK) لبرنامج التشغيل" خدمات Fleet Engine والخدمات المخصّصة على دراية بها. موقع المركبة وحالتها. على سبيل المثال، يمكن أن تكون المركبة ONLINE أو OFFLINE، ويتغير الموقع الجغرافي للمركبة مع تقدّم الرحلة.

الحد الأدنى لمتطلبات النظام

  • يجب أن يعمل الجهاز الجوّال بنظام التشغيل iOS 14 أو إصدار أحدث.
  • Xcode الإصدار 15 أو إصدار أحدث
  • المتطلبات الأساسية

    يفترض هذا الدليل أن تطبيقك يستخدم ميزة التنقل لحزمة SDK وFleet المحرّك إعداد الواجهة الخلفية وإتاحتها. ومع ذلك، يوفر مثال التعليمة البرمجية عينة من كيفية إعداد حزمة SDK للتنقل.

    يجب أيضًا تفعيل حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" لنظام التشغيل iOS في مشروع Google Cloud والحصول على واجهة برمجة تطبيقات المفتاح:

    إعدادات المشروع

    مدير حزم Swift

    يمكن تثبيت Driver SDK من خلال مدير حزم Swift لإضافة حزمة تطوير البرامج (SDK)، تأكَّد من أنّ لديك إزالة أي تبعيات حالية لحزمة تطوير البرامج (SDK) لبرنامج التشغيل.

    لإضافة حزمة تطوير البرامج (SDK) إلى مشروع جديد أو حالي، اتّبِع الخطوات التالية:

    1. افتح Xcode project أو workspace، ثم انتقِل إلى File >. أضِف تبعيات الحزمة.
    2. أدخِل https://github.com/googlemaps/ios-driver-sdk كعنوان URL واضغط على Enter. لسحب الحزمة، والنقر فوق "Add Package" (إضافة حزمة).
    3. لتثبيت قاعدة version محدّدة، اضبط حقل قاعدة التبعية على أحد الخيارات المستندة إلى الإصدار. وبالنسبة للمشروعات الجديدة، نوصي بتحديد أحدث إصدار باستخدام "الإصدار الدقيق" . بعد اكتمال عملية النقل، انقر على "إضافة حزمة".
    4. من نافذة اختيار منتجات الحزمة، تأكَّد من إضافة GoogleRidesharingDriver إلى هدف main المحدد. بعد اكتمال عملية النقل، انقر على "إضافة حزمة".
    5. للتحقّق من عملية التثبيت، انتقِل إلى جزء General في استهدافك. من المفترَض أن تظهر الحِزَم المثبَّتة في أُطر العمل والمكتبات والمحتوى المضمَّن. يمكنك أيضًا عرض قسم "تبعيات الحزمة" قسم "مستكشف المشروع" للتحقق من الحزمة وإصدارها.

    لتعديل package لمشروع حالي، اتّبِع الخطوات التالية:

    1. في حال الترقية من إصدار أقدم من 9.0.0، يجب إزالة التبعيات التالية: GoogleMapsBase وGoogleMapsCore و GoogleMapsM4B بعد الترقية. لا تقم بإزالة تبعية GoogleMaps لمزيد من المعلومات، يُرجى الاطّلاع على ملاحظات الإصدار 9.0.0:

      من إعدادات ضبط مشروع Xcode، ابحث عن Frameworks وLibraries والمحتوى المضمَّن استخدِم علامة الطرح(-) لإزالة إطار العمل التالي:

      • GoogleMapsBase (للترقيات من الإصدارات السابقة على 9.0.0 فقط)
      • GoogleMapsCore (للترقيات من الإصدارات السابقة على 9.0.0 فقط)
      • GoogleMapsM4B (للترقيات من الإصدارات السابقة على 9.0.0 فقط)
    2. من Xcode، انتقل إلى "File >" (ملف >) الحزم > التحديث إلى أحدث إصدارات الحزمة".
    3. للتحقّق من عملية التثبيت، انتقِل إلى قسم تبعيات الحزمة في Project Navigator (أداة التنقّل في المشروع) للتحقق من الحزمة وإصدارها.

    لإزالة العناصر الاعتمادية الحالية لـ Driver SDK التي تمت إضافتها باستخدام CocoaPods، يُرجى اتّباع الخطوات التالية:

    1. أغلِق مساحة عمل Xcode. افتح المحطة الطرفية ونفِّذ الأمر التالي:
      sudo gem install cocoapods-deintegrate cocoapods-clean 
      pod deintegrate 
      pod cache clean --all
    2. إزالة Podfile وPodfile.resolved و Xcode workspace إذا كنت لا تستخدمهم لأي غرض آخر غير CocoaPods.

    لإزالة تثبيت Driver SDK الحالي، يدويًا، اتبع الخطوات التالية:

    1. من إعدادات ضبط مشروع Xcode، ابحث عن Frameworks، المكتبات والمحتوى المضمَّن استخدِم علامة الطرح(-) لإزالتها إطار العمل التالي:

      • GoogleRidesharingDriver.xcframework
    2. من دليل المستوى الأعلى لمشروع Xcode، أزِل حزمة GoogleRidesharingDriver.

    CocoaPods

    لضبط حزمة تطوير البرامج (SDK) لبرنامج التشغيل باستخدام CocoaPods، ستحتاج إلى العناصر التالية:

    • أداة CocoaPods: لتثبيت هذه الأداة، افتح المحطة الطرفية وشغِّل الأمر التالي.
       sudo gem install cocoapods
    
    1. إنشاء ملف Podfile لـ Driver SDK واستخدامه لتثبيت واجهة برمجة التطبيقات ملحقاته: قم بإنشاء ملف يسمى 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. شغِّل الأمر pod install. سيؤدي هذا إلى تثبيت واجهات برمجة التطبيقات المحددة في Podfile، إلى جانب أي تبعيات قد تكون موجودة.

      pod install
      
    4. أغلِق Xcode، ثم افتح ملف xcworkspace لمشروعك (بالنقر مرّتين). لتشغيل Xcode. ومن الآن فصاعدًا، يجب عليك استخدام .xcworkspace لفتح المشروع.

    يُرجى الاطّلاع على مقالة بدء استخدام CocoaPods. لمزيد من المعلومات التفاصيل.

    التثبيت اليدوي

    XCFramework عبارة عن حزمة ثنائية تستخدمها لتثبيت SDK لبرنامج التشغيل. يمكنك استخدام هذه الحزمة على عدة حِزم بما في ذلك الأجهزة التي تستخدم نظام Apple السيليكون. يوضح هذا الدليل كيفية أضف XCFramework يدويًا الذي يحتوي على حزمة تطوير البرامج (SDK) لبرنامج التشغيل إلى مشروعك وإعداد إصدارك الإعدادات في Xcode.

    تنزيل البرنامج الثنائي لحزمة SDK والموارد:

    1. يمكنك استخراج الملفات للوصول إلى XCFramework والموارد.

    2. ابدأ Xcode وافتح مشروعًا حاليًا أو أنشئ مشروعًا جديدًا مشروعك. إذا كنت مستخدمًا جديدًا لنظام التشغيل iOS، أنشئ مشروعًا جديدًا واختَر نظام التشغيل iOS. نموذج التطبيق.

    3. إنشاء مجموعة أطر عمل ضمن مجموعة المشروعات إذا لم تكن هناك مجموعة بالفعل.

    4. لتثبيت Driver SDK، اسحب ملف واحد (GoogleRidesharingDriver.xcframework) إلى مشروعك ضمن أُطر العمل والمكتبات والمحتوى المضمَّن: عندما يُطلب منك ذلك، اختَر انسخ العناصر إذا لزم الأمر.

    5. اسحب "GoogleRidesharingDriver.bundle" الذي تم تنزيله إلى المستوى الأعلى. دليل مشروع Xcode الخاص بك. اختَر "Copy items if needed" عندما يُطلب منك ذلك.

    6. اختَر مشروعك من Project Navigator، ثم اختَر هدف التطبيق.

    7. افتح علامة التبويب "مراحل الإنشاء"، وفي "Link Binary with Libraries" (رابط ثنائي مع المكتبات)، أضف أُطر العمل والمكتبات التالية إذا لم تكن موجودة بالفعل:

      • 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 لمعرفة آخر الأخبار ومزيد من المعلومات.

    يتم تضمين ملف بيان الخصوصية من Apple في حزمة الموارد لحزمة تطوير البرامج (SDK). للتأكّد من تضمين "ملف بيان الخصوصية" وفحص محتواه، عليك إنشاء أرشيف لتطبيقك وإنشاء تقرير خصوصية من الأرشيف.

    تنفيذ التفويض والمصادقة

    عندما ينشئ تطبيق Driver التحديثات ويرسلها إلى خلفية Fleet Engine، يجب أن تتضمن الطلبات رموز دخول صالحة. للتفويض والمصادقة هذه الطلبات، تستدعي حزمة Driver SDK كائن بما يتوافق مع بروتوكول GMTDAuthorization. الكائن مسئول عن توفير رمز الدخول المطلوب.

    بصفتك مطوّر التطبيق، أنت تختار كيفية إنشاء الرموز المميّزة. عملية التنفيذ القدرة على إجراء ما يلي:

    • استرجاع رمز دخول، ربما بتنسيق JSON، من خادم HTTPS.
    • تحليل الرمز المميّز وتخزينه مؤقتًا
    • أعِد تحميل الرمز المميّز عند انتهاء صلاحيته.

    للحصول على تفاصيل الرموز المميّزة المتوقعة من خادم Fleet Engine، يُرجى الاطّلاع على إنشاء رمز JSON المميّز للويب (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، عليك أولاً إنشاء مثيل واحد (GMTDRidesharingDriverAPI) يستخدم رقم تعريف المركبة ورقم تعريف المركبة driverContext وaccessTokenProvider. معرِّف مقدم الخدمة هو نفسه Google رقم تعريف مشروع Cloud ويمكنك الوصول إلى المثيل GMTDVehicleReporter من واجهة برمجة تطبيقات برنامج التشغيل مباشرةً.

    ينشئ المثال التالي مثيل 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];
    }
    

    الاستماع بشكل اختياري إلى أحداث AutomotiveReporter

    تُحدِّث "GMTDVehicleReporter" المركبة بشكل دوري في حال locationTrackingEnabled هي true. للاستجابة لهذه التحديثات الدورية، سيتم يمكن للعنصر الاشتراك في أحداث GMTDVehicleReporter من خلال التوافق مع بروتوكول GMTDVehicleReporterListener.

    يمكنك التعامل مع الأحداث التالية:

    • vehicleReporter(_:didSucceed:)

      تُبلغ تطبيق Driver بأنّ خدمات الخلفية قد تلقّت بنجاح وتحديث موقع المركبة والحالة.

    • 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
    

    إضافة GMTDVehicleReporter كمستمع إلى GMSRoadSnappedLocationProvider

    لتوفير تحديثات الموقع الجغرافي في "حزمة تطوير البرامج (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
    

    تفعيل تتبع الموقع الجغرافي

    لتفعيل ميزة تتبُّع الموقع الجغرافي، يمكن لتطبيقك ضبط locationTrackingEnabled على true على GMTDVehicleReporter. يرسل GMTDVehicleReporter تلقائيًا تحديثات الموقع الجغرافي. بعد تطابق الخدمات وتخصيص المركبة لرحلة، يرسل تطبيق "GMTDVehicleReporter" تحديثات المسار تلقائيًا عند استخدام "GMSNavigator" في وضع التنقل (عند تحديد وجهة من خلال setDestinations).

    سيكون المسار الذي تم ضبطه أثناء تعديل الرحلة هو المسار نفسه الذي يسلكه السائق. الانتقال إليه أثناء جلسة التنقل. وبالتالي، لكي تعمل مشاركة الرحلة بشكل صحيح، يجب أن تتطابق النقطة الوسيطة المحددة من خلال setDestinations مع البيانات المحددة في خلفية Fleet Engine.

    إذا تم ضبط locationTrackingEnabled على true، سيتم إرسال آخر المعلومات عن الرحلة والمركبة. إلى خلفية Fleet Engine على فترات منتظمة بناءً على القيمة المعينة locationUpdateInterval إذا تم ضبط locationTrackingEnabled على false، إجراء التحديثات وإرسال طلب التحديث النهائي للمركبة إلى Fleet Engine الخلفية لضبط حالة المركبة على GMTDVehicleState.offline. عرض updateVehicleState لاعتبارات خاصة بشأن التعامل مع حالات الإخفاق عند locationTrackingEnabled تم تعيينها على false.

    يوضّح المثال التالي ميزة تتبُّع الموقع الجغرافي:

    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 عندما يكون القناع فارغًا، وعادةً ما يحدث ذلك. لأول تحديث بعد بدء التشغيل. يوضح المثال التالي كيفية التعامل مع هذا الخطأ:

    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. يؤدي إيقاف التعديلات أيضًا إلى ضبط حالة المركبة على OFFLINE في Fleet Engine. الخلفية.

    Swift

    vehicleReporter.locationTrackingEnabled = false
    

    Objective-C

    _vehicleReporter.locationTrackingEnabled = NO;