عند تتبُّع رحلة، يعرض تطبيق المستهلك الموقع الجغرافي للمركبة المناسبة للمستهلك. لإجراء ذلك، يجب أن يبدأ تطبيقك في متابعة رحلة معيّنة وأن يعدّل مستوى تقدّم الرحلة وأن يتوقف عن متابعتها عند اكتمالها.
يتناول هذا المستند آلية عمل هذه العملية.
قبل البدء
تأكَّد من إعداد ما يلي:
تمّت إتاحة خدمات الخلفية لتطبيقك المخصّص للمستهلكين وأصبحت خدماتك لإقران المستهلكين بالمركبات تعمل.
إعداد خريطة لتطبيقك
بدء متابعة رحلة
عندما يطابق خادم الخلفية مستهلكًا بمركبة، استخدِم
JourneySharingSession
لبدء تتبُّع الرحلة.
يوضّح الرمز البرمجي النموذجي التالي كيفية بدء تتبُّع رحلة بعد تحميل view.
Java
public class MainActivity extends AppCompatActivity
implements ConsumerViewModel.JourneySharingListener {
// Class implementation
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a TripModel instance to listen for updates to the trip specified by this trip name.
String tripName = ...;
TripModelManager tripModelManager = consumerApi.getTripModelManager();
TripModel tripModel = tripModelManager.getTripModel(tripName);
// Create a JourneySharingSession instance based on the TripModel.
JourneySharingSession session = JourneySharingSession.createInstance(tripModel);
// Add the JourneySharingSession instance on the map for updating the UI.
consumerController.showSession(session);
// Register for trip update events.
tripModel.registerTripCallback(new TripModelCallback() {
@Override
public void onTripETAToNextWaypointUpdated(
TripInfo tripInfo, @Nullable Long timestampMillis) {
// ...
}
@Override
public void onTripActiveRouteRemainingDistanceUpdated(
TripInfo tripInfo, @Nullable Integer distanceMeters) {
// ...
}
// ...
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if (journeySharingSession != null) {
journeySharingSession.stop();
}
}
}
Kotlin
class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {
// Class implementation
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Create a TripModel instance to listen for updates to the trip specified by this trip name.
val tripName = "tripName"
val tripModelManager = consumerApi.getTripModelManager()
val tripModel = tripModelManager.getTripModel(tripName)
// Create a JourneySharingSession instance based on the TripModel.
val session = JourneySharingSession.createInstance(tripModel)
// Add the JourneySharingSession instance on the map for updating the UI.
consumerController.showSession(session)
// Register for trip update events.
tripModel.registerTripCallback(
object : TripModelCallback() {
override fun onTripETAToNextWaypointUpdated(
tripInfo: TripInfo,
timestampMillis: Long?,
) {
// ...
}
override fun onTripActiveRouteRemainingDistanceUpdated(
tripInfo: TripInfo,
distanceMeters: Int?,
) {
// ...
}
// ...
})
}
override fun onDestroy() {
super.onDestroy()
journeySharingSession?.stop()
}
}
تعديل مستوى تقدّم الرحلة
لتعديل تفاصيل مستوى تقدّم الرحلة، مثل المسافة التي تحتاج المركبة إلى قطعها قبل الوصول والوقت المقدَّر للوصول، يجب أن يُسجِّل تطبيقك معالجًا للأحداث ويضبطه كما هو موضّح في الأمثلة التالية.
سجِّل مستمعًا على عنصر
TripModel
.Java
// Create a TripModel instance for listening to updates to the trip specified by this trip name. String tripName = ...; TripModelManager tripModelManager = consumerApi.getTripModelManager(); TripModel tripModel = tripModelManager.getTripModel(tripName); // Create a JourneySharingSession instance based on the TripModel. JourneySharingSession session = JourneySharingSession.createInstance(tripModel); // Add the JourneySharingSession instance on the map for updating the UI. consumerController.showSession(session); // Register for trip update events. tripModel.registerTripCallback(new TripModelCallback() { @Override public void onTripETAToNextWaypointUpdated( TripInfo tripInfo, @Nullable Long timestampMillis) { // ... } @Override public void onTripActiveRouteRemainingDistanceUpdated( TripInfo tripInfo, @Nullable Integer distanceMeters) { // ... } // ... });
Kotlin
// Create a TripModel instance for listening to updates to the trip specified by this trip name. val tripName = "tripName" val tripModelManager = consumerApi.getTripModelManager() val tripModel = tripModelManager.getTripModel(tripName) // Create a JourneySharingSession instance based on the TripModel. val session = JourneySharingSession.createInstance(tripModel) // Add the JourneySharingSession instance on the map for updating the UI. consumerController.showSession(session) // Register for trip update events. tripModel.registerTripCallback( object : TripModelCallback() { override fun onTripETAToNextWaypointUpdated( tripInfo: TripInfo, timestampMillis: Long?, ) { // ... } override fun onTripActiveRouteRemainingDistanceUpdated( tripInfo: TripInfo, distanceMeters: Int?, ) { // ... } // ... })
اضبط أداة الاستماع لرحلتك باستخدام
TripModelOptions
.Java
// Set refresh interval to 2 seconds. TripModelOptions tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build(); tripModel.setTripModelOptions(tripOptions);
Kotlin
// Set refresh interval to 2 seconds. val tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build() tripModel.setTripModelOptions(tripOptions)
إيقاف متابعة رحلة
تأكَّد من أنّ تطبيقك يتوقف عن تتبُّع رحلة عندما لا يعود ذلك ضروريًا، مثلاً عندما يضع السائق علامة "مكتمل" على الرحلة في الخلفية. يؤدي إيقاف مشاركة الرحلات إلى تجنُّب إرسال طلبات غير ضرورية إلى Fleet Engine عبر الشبكة، كما يمنع تسرب الذاكرة.
استخدِم JourneySharingSession
لإيقاف متابعة الرحلة كما هو موضّح في المثال التالي على الرمز البرمجي:
Java
public class MainActivity extends AppCompatActivity
implements ConsumerViewModel.JourneySharingListener {
// Class implementation
@Override
protected void onDestroy() {
super.onDestroy();
if (journeySharingSession != null) {
journeySharingSession.stop();
}
}
}
Kotlin
class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {
// Class implementation
override fun onDestroy() {
super.onDestroy()
journeySharingSession?.stop()
}
}
التعامل مع أخطاء الرحلات
تعرِض طريقة onTripRefreshError
الأخطاء التي تحدث أثناء monitoringرحلة. تتّبع رسائل الخطأ معيار خطأ Google Cloud. للحصول على تعريفات تفصيلية
لرسائل الخطأ وجميع رموز الخطأ، يُرجى الرجوع إلى مستندات أخطاء Google Cloud.
في ما يلي بعض الأخطاء الشائعة التي يمكن أن تحدث أثناء مراقبة الرحلة:
HTTP | متوسط عائد النقرة | الوصف |
---|---|---|
400 | INVALID_ARGUMENT | حدّد العميل اسم رحلة غير صالح. يجب أن يتّبع اسم الرحلة التنسيق التالي:
providers/{provider_id}/trips/{trip_id} . يجب أن يكون
provider_id هو معرّف مشروع Cloud الذي يملكه
مقدّم الخدمة. |
401 | UNAUTHENTICATED | يظهر لك هذا الخطأ في حال عدم توفّر بيانات اعتماد مصادقة صالحة. على سبيل المثال، إذا تم توقيع رمز JWT بدون معرّف رحلة أو إذا انتهت صلاحية رمز JWT. |
403 | PERMISSION_DENIED | يظهر لك هذا الخطأ إذا لم يكن لدى العميل إذن كافٍ (على سبيل المثال، إذا حاول مستخدم لديه دور المستهلك استدعاء updateTrip)، أو إذا كان رمز JWT غير صالح، أو إذا لم تكن واجهة برمجة التطبيقات مفعَّلة لمشروع العميل. قد يكون الرمز المميّز لبروتوكول أمان طبقة النقل (JWT) غير متوفّر أو تم توقيع الرمز المميّز بمعرّف رحلة لا يتطابق مع معرّف الرحلة المطلوب. |
429 | RESOURCE_EXHAUSTED | حصة الموارد هي صفر أو معدّل الزيارات يتجاوز الحدّ المسموح به. |
503 | UNAVAILABLE | الخدمة غير متاحة. عادةً ما يكون الخادم معطّلاً. |
504 | DEADLINE_EXCEEDED | انتهت المهلة النهائية لتقديم الطلب. لا يحدث هذا الخطأ إلا إذا ضبط المُرسِل مهلة أقصر من المهلة التلقائية للطريقة (أي أنّ المهلة المطلوبة ليست كافية لكي يعالج الخادم الطلب) ولم يتم إكمال الطلب خلال المهلة. |
التعامل مع أخطاء حِزم تطوير البرامج (SDK) المخصّصة للمستهلكين
تُرسِل حزمة SDK للمستهلك أخطاء تعديل الرحلة إلى تطبيق المستهلِك باستخدام آلية callback. مَعلمة callback هي نوع إرجاع خاص بنظام التشغيل (
TripUpdateError
على Android و
NSError
على iOS).
استخراج رموز الحالة
عادةً ما تكون الأخطاء التي يتم تمريرها إلى دالة الاستدعاء هي أخطاء gRPC، ويمكنك أيضًا استخراج معلومات إضافية منها في شكل رمز حالة. للاطّلاع على القائمة الكاملة لرموز الحالة، يُرجى الاطّلاع على رموز الحالة واستخدامها في gRPC.
Java
يمكنك استخراج رمز حالة gRPC يقدّم تفاصيل عن الخطأ
من TripUpdateError
الذي تم إرجاعه من onTripUpdateError()
.
// Called when there is a trip update error.
@Override
public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
Status.Code code = error.getStatusCode();
}
Kotlin
يمكنك استخراج رمز حالة gRPC يقدّم تفاصيل عن الخطأ
من TripUpdateError
الذي تم إرجاعه من onTripUpdateError()
.
// Called when there is a trip update error.
override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
val code = error.getStatusCode()
}
تفسير رموز الحالة
تتناول رموز الحالة نوعَين من الأخطاء: الأخطاء المتعلّقة بالخادم والشبكة، وأخطاء العميل.
أخطاء الخادم والشبكة
رموز الحالة التالية هي إما أخطاء في الشبكة أو الخادم، و ليس عليك اتّخاذ أي إجراء لحلّها. وتتم معالجة هذه الأخطاء تلقائيًا في حزمة تطوير البرامج (SDK) المخصّصة للمستهلكين.
رمز الحالة | الوصف |
---|---|
تم إلغاؤه | توقّف الخادم عن إرسال الاستجابة. ويرجع ذلك عادةً إلى مشكلة في الخادم. |
تم إلغاؤها | أنهى الخادم الاستجابة الصادرة. يحدث ذلك عادةً
عند
إرسال التطبيق إلى الخلفية، أو عند حدوث تغيير في الحالة في تطبيق المستخدِم. |
متقطّع | |
DEADLINE_EXCEEDED | استغرق الخادم وقتًا طويلاً للاستجابة. |
UNAVAILABLE | الخادم غير متاح. ويرجع ذلك عادةً إلى مشكلة في الشبكة. |
أخطاء العميل
رموز الحالة التالية هي لأخطاء جهة العميل، ويجب اتّخاذ إجراء لمعالجتها. يواصل حِزم SDK للمستهلكين إعادة المحاولة لإعادة تحميل بيانات الرحلة إلى أن تنتهي من مشاركة الرحلة، ولكن لن يتم استردادها إلى أن تتّخذ إجراءً.
رمز الحالة | الوصف |
---|---|
INVALID_ARGUMENT | حدّد تطبيق Consumer اسم رحلة غير صالح. يجب أن يلي اسم الرحلة التنسيق providers/{provider_id}/trips/{trip_id} .
|
NOT_FOUND | لم يتم إنشاء الرحلة مطلقًا. |
PERMISSION_DENIED | لا يملك تطبيق "المستهلك" أذونات كافية. يحدث هذا الخطأ في الحالات التالية:
|
RESOURCE_EXHAUSTED | حصة الموارد تساوي صفرًا، أو معدل تدفق الزيارات يتجاوز الحد الأقصى للسرعة. |
UNAUTHENTICATED | تعذّرت مصادقة الطلب بسبب رمز JWT غير الصالح. يحدث هذا الخطأ إما عند توقيع رمز JWT بدون رقم تعريف رحلة، أو عند انتهاء صلاحية رمز JWT. |