كشف المنطقة الزمنية الهاتفية

بالنسبة للأجهزة التي تعمل بنظام التشغيل Android 11 أو الإصدارات الأقدم، يعتمد الاكتشاف التلقائي للمنطقة الزمنية في AOSP على إشارات من النظام الفرعي للاتصال الهاتفي. ونظرًا للاعتماد على النظام الفرعي للاتصالات الهاتفية، يقتصر الكشف التلقائي عن المنطقة الزمنية على نظام التشغيل Android 11 أو الإصدارات الأقدم على أجهزة الاتصال الهاتفي.

عندما يكون اكتشاف المنطقة الزمنية للاتصالات الهاتفية متاحًا، فإنه يعمل باستخدام إشارات رمز البلد المحمول (MCC) وهوية الشبكة والمنطقة الزمنية (NITZ) .

على سبيل المثال، يمكن لجهاز في فرنسا تحديد المنطقة الزمنية استنادًا فقط إلى مركز عملائي (MCC) الذي أبلغت عنه أبراج الاتصالات الخلوية القريبة. وهذا ممكن لأن فرنسا معروفة باستخدام منطقة زمنية واحدة.

عندما يستخدم بلد ما مناطق زمنية متعددة، فإن مركز عملائي (MCC) وحده لا يكفي لتحديد المنطقة الزمنية. بالنسبة لهذه البلدان، يستخدم الجهاز أيضًا إشارات NITZ لتحديد المنطقة الزمنية الصحيحة. يعمل هذا بشكل جيد في العديد من الأماكن حول العالم ولكنه يتطلب أن تكون إشارات NITZ متاحة وصحيحة وبالتالي فهي تعتمد على شركات الاتصالات.

الكشف عن المنطقة الزمنية للاتصالات الهاتفية هو كاشف سلبي . يتم تشغيله في جميع الأوقات ولذلك غالبًا ما يتم تقديم اقتراحات الاتصال الهاتفي حتى عندما لا تكون خوارزمية time_zone_detector النشطة عبارة عن اتصال هاتفي حاليًا.

حدود الكشف عن المنطقة الزمنية للاتصالات الهاتفية

حتى مع توفر إشارات NITZ الصحيحة، فإن اكتشاف المنطقة الزمنية للاتصالات الهاتفية لا يعمل دائمًا بشكل جيد في كل بلد. وذلك لأن NITZ يحتوي فقط على معلومات الإزاحة والتوقيت الصيفي، وهي ليست كافية دائمًا لتحديد المنطقة الزمنية بشكل فريد.

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

يوضح الجدول التالي سلوك الجهاز حسب الموسم في دنفر وفينيكس على سبيل المثال:

الموقع والموسم معلومات من MCC أو NITZ تم اكتشاف المنطقة الزمنية والسلوك
دنفر، كولورادو
شتاء
الوقت: 1 يناير 2021 الساعة 12:00:00
الدولة: الولايات المتحدة
الإزاحة: UTC-7، لا يوجد توقيت صيفي
تتطابق معرفتا المنطقة:
  • امريكا/دنفر
  • أمريكا/فينيكس

تم ضبط الجهاز بشكل صحيح على America/Denver.
فينيكس، أريزونا
شتاء
الوقت: 1 يناير 2021 الساعة 12:00:00
الدولة: الولايات المتحدة
الإزاحة: UTC-7، لا يوجد توقيت صيفي
تتطابق معرفتا المنطقة:
  • امريكا/دنفر
  • أمريكا/فينيكس

تم ضبط الجهاز بشكل غير صحيح على America/Denver.
دنفر، كولورادو
صيف
الوقت: 1 يوليو 2021 الساعة 12:00:00
الدولة: الولايات المتحدة
الإزاحة: UTC-6، التوقيت الصيفي
معرف منطقة واحد يطابق:
  • امريكا/دنفر

تم ضبط الجهاز بشكل صحيح على America/Denver.
فينيكس، أريزونا
صيف
الوقت: 1 يوليو 2021 الساعة 12:00:00
الدولة: الولايات المتحدة
الإزاحة: UTC-7، لا يوجد توقيت صيفي
معرف منطقة واحد يطابق:
  • أمريكا/فينيكس

تم ضبط الجهاز بشكل صحيح على America/Phoenix.

توضح الأمثلة أعلاه أنه خلال فصل الشتاء، يجب على أجهزة Android في دنفر أو أريزونا اختيار أحد معرفي المنطقة الزمنية المتطابقين، وهو ما قد يكون غير صحيح لبعض الأجهزة ولكنه لا يزال يعرض التوقيت المحلي الصحيح على ما يبدو. تعرض ساعة الجهاز والتقويمات والتطبيقات الأخرى التوقيت المحلي المتوقع حتى إذا كان معرف المنطقة الزمنية غير صحيح لأن كلا معرفي المنطقة الزمنية يحسبان نفس التوقيت المحلي خلال فصل الشتاء.

ومع ذلك، في فصل الربيع، عندما تلتزم دنفر بالتوقيت الصيفي ولا تفعله فينيكس، قد تعرض بعض الأجهزة مؤقتًا التوقيت المحلي غير الصحيح إذا تم ضبطها على معرف المنطقة الزمنية الخاطئة لموقع المستخدم. يتم تصحيح ذلك بمجرد أن يتلقى الجهاز إشارة NITZ جديدة (على وجه التحديد، تلك التي تحتوي على معلومات إزاحة "UTC-7، لا يوجد التوقيت الصيفي")، ولكن هذا قد يستغرق بعض الوقت ويعتمد على شركات الاتصالات.

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

التصحيح والاختبار

يصف القسم التالي أوامر shell لتصحيح واختبار ميزة الكشف عن المنطقة الزمنية للاتصالات الهاتفية.

إعداد بيئة الاختبار

يستخدم القائمون على الاختبار عادةً بيئة اختبار تحتوي على خلية هاتفية اختبارية أو محاكاة للتحقق من سلوك اكتشاف المنطقة الزمنية للاتصالات الهاتفية. يمكن استخدام خلية الاختبار لمحاكاة الشبكات ذات مراكز عملائي مختلفة ولإرسال إشارات NITZ إلى الأجهزة ثم مراقبة تأثيراتها.

لكي يتمكن الجهاز من اكتشاف المنطقة الزمنية، يجب أن تكون معلومات إشارة NITZ صحيحة، ومتوافقة مع MCC، ومطابقة لنسخة الجهاز من IANA TZDB (قواعد المنطقة الزمنية). تؤدي إشارات NITZ غير المتوافقة مع مركز عملائي (MCC) إلى عدم التأكد من خوارزمية الاتصال الهاتفي.

على سبيل المثال، إذا كان مركز عملائي (MCC) الذي تستخدمه خلية الاختبار مخصصًا للولايات المتحدة الأمريكية، فيجب أن تحتوي إشارة NITZ على معلومات "التوقيت العالمي" والإزاحة والتوقيت الصيفي الصحيحة لمكان ما في الولايات المتحدة الأمريكية.

التفاعل مع خدمة com.android.phone

للتحقق من أن الجهاز يتلقى اقتراحات المنطقة الزمنية الهاتفية الصحيحة، استخدم:

adb shell dumpsys activity service \
    com.android.phone/com.android.phone.TelephonyDebugService

يؤدي هذا إلى تفريغ المعلومات الهاتفية، والتي يمكن العثور عليها أيضًا في تقارير أخطاء Android. على الأجهزة التي تحتوي على شرائح SIM متعددة، تتوفر معلومات لكل راديو SIM.

تعرض سجلات المنطقة الزمنية الاقتراحات التي أرسلتها عملية الاتصال الهاتفي إلى time_zone_detector وأسباب إرسال الاقتراحات.

TimeServiceHelperImpl:
          SystemClock.elapsedRealtime()=11864061
          System.currentTimeMillis()=1620652067178
          Time Logs:
...

Time zone Logs:
    18602 / 2021-05-10T09:50:21.718Z - Suggesting time zone update:
    TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='null', mMatchType=0, mQuality=0,
    mDebugInfo=[getTimeZoneSuggestion: nitzSignal=TimestampedValue{mReferenceTimeMillis=14098,
    mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000,
    mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}},
    countryIsoCode=null, Detection
    reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=14098,
    mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000,
    mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}})]}
    18831 / 2021-05-10T09:50:21.948Z - Suggesting time zone update:
    TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='Europe/London', mMatchType=3, mQuality=1,
    mDebugInfo=[findTimeZoneFromCountryAndNitz: countryIsoCode=gb,
    nitzSignal=TimestampedValue{mReferenceTimeMillis=14098,
    mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000,
    mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}},
    findTimeZoneFromCountryAndNitz: lookupResult=OffsetResult{mTimeZone(ID)=Europe/London,
    mIsOnlyMatch=true}, Detection reason=handleCountryDetected("gb")]}