Flutter-geolocator: المستقبل لا يحسم أبدًا على IOS13

تم إنشاؤها على ٢٩ أبريل ٢٠٢٠  ·  63تعليقات  ·  مصدر: Baseflow/flutter-geolocator

🐛 تقرير الشوائب

عندما أحاول الحصول على موقع getCurrentLocation ، فإنه لا يتم حله أبدًا. لست خبيرًا في IOS ، لذا من فضلك إذا نسيت القيام بشيء ما ، فقط اشرح ذلك لي.

Future<Position> getCurrentPosition({
    LocationAccuracy accuracy = LocationAccuracy.best,
    GeolocationPermission geolocationPermission =
        GeolocationPermission.location,
  }) =>
      _geolocator.getCurrentPosition(
        desiredAccuracy: accuracy,
        locationPermissionLevel: geolocationPermission,
      );

بودفيلي:

config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',

        ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
         'PERMISSION_LOCATION=1',
      ]

Info.plist:

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Need location when in use</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>Always and when in use!</string>
    <key>NSLocationUsageDescription</key>
    <string>Older devices need location.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Can I haz location always?</string>

تعديل:

لقد اختبرت على جهاز Android حقيقي والمشكلة تحدث أيضًا.

أذونات موقع البيان الخاص بي:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

سلوك متوقع

العودة الموقف.

خطوات الاستنساخ

فقط اتصل geolocator.GetCurrentPosition.

الإصدار: 5.1.5.0

برنامج:

  • [x]: iphone: iOS (تم اختباره باستخدام محاكي IOS)
  • [x]: الروبوت: Android (تم اختباره على Xiomi Pocophone F1 مع Android 10QkQ1.190828.002)
android ios triage

التعليق الأكثر فائدة

أهلا بالجميع،

يسعدني أن أعلن عن إصدار I (أخيرًا) 6.0.0-rc.1 والذي يجب أن يتخلص من كل هذه المشكلات.

سأكون ممتنًا حقًا إذا أمكنك تجربته وإعطائي ملاحظاتك.

ال 63 كومينتر

أنا أتلقى نفس الخطأ. يحدث هذا على كل من iOS و Android .....

أتلقى نفس الخطأ في جهاز المحاكاة الذي يعمل بنظام iOS 10.3 أو iOS 13.4 وأيضًا على جهاز iPad الذي يعمل بنظام iOS 13.4 .

mycode.dart:

Position pos = await Geolocator()
              .getCurrentPosition(
                  locationPermissionLevel:
                      GeolocationPermission.locationWhenInUse,
                  desiredAccuracy: LocationAccuracy.high)

Info.plist:

<key>NSLocationAlwaysUsageDescription</key>
<string>Can I haz location always?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Need location when in use</string>

الإصدار: 5.3.1

نفس المشكلة بالنسبة لي على Android 8.0. أفكر في كتابة مؤقت مدته 10 ثوانٍ مباشرة على الكود المصدري الذي يتم إلقاؤه إذا تم الوصول إليه.

brenoasm هل تواجه هذه المشكلة على جهاز محاكاة أم جهاز حقيقي؟

dammel في المحاكاة ، من المهم تكوين المحاكي لإرسال موقع. يمكن القيام بذلك باستخدام عناصر القائمة التالية لتطبيق المحاكاة: الميزات -> الموقع -> (حدد خيارًا آخر ثم "لا شيء").

mvanbeusekom ماذا لو كان الجهاز الحقيقي لا يصدر موقعًا؟ لا ينبغي إذا كان المستخدم قد أوقف تشغيل GPS ، أليس كذلك؟

mvanbeusekom لقد اختبرت على Simulator لـ IOS (ليس لدي هاتف IPhone لاختباره على جهاز حقيقي). لقد اختبرته على جهاز Android حقيقي وواجهت نفس المشكلة ... سأقوم بتحرير وإضافة معلومات جهاز Android الخاص بي.

لدي نفس المشكلة مع جهاز android حقيقي ...

mvanbeusekom شكرا لمساعدتكم. عملت تيب الخاص بك لأجهزة المحاكاة بالنسبة لي.
لم أغير أي شيء ، لكنه يعمل الآن على iPad (جهاز حقيقي) مرة أخرى.

تم اختباره على جهاز محاكاة iOS وجهاز iOS ، ولم أواجه أي مشكلة ولكن لدي نفس المشكلة في محاكي Android

سأحاول شرح حالتي بالتفصيل.

أولاً ، تحدث المشكلة في كل من أجهزة Android و iPhone (أنا أستخدم Testflight لاختبار التطبيق مع فريق QA الخاص بي) ، ولكن أيضًا في Android Emulator و iOS Simulator.

أحيانًا لا تُرجع الطريقة "getCurrentPosition" مركزًا ، ولكن بعد سلسلة من المحاولات تفعل ذلك. عادةً ما أواجه هذه المشكلة عندما أقوم بتثبيت التطبيق لأول مرة. بعد فترة من الوقت ، بدأت الطريقة فجأة في إعادتك إلى الوضع الحالي.

مشكلة هذه المشكلة هي أنها لا تحدث دائمًا. يمكنك تثبيت التطبيق ، وأحيانًا في المحاولة الأولى ، تعيد الطريقة الوضع الحالي ...

ملاحظات إضافية:

  1. إذا بدأت الطريقة في العمل بشكل جيد وقمت بإعادة تحميل ساخنة أو إعادة تشغيل ساخنة ، تستمر الطريقة في العمل بشكل جيد
  2. الطريقة لا تستثني أي استثناء ... ولكن إذا وضعت "انتظار" فإنها تتوقف إلى أجل غير مسمى
  3. حاولت استخدام إصدار أقدم من Geolocator ، واستمرت المشكلة
  4. أنا أستخدم خرائط Google في مشروعي ، لذلك فكرت "ربما هناك تعارض مع إصدار حديث من الخرائط ...؟". لا. أقوم بالتجميع باستخدام الإصدارات القديمة من خرائط Google ولا تزال المشكلة قائمة
  5. الشيء الغريب هو أنه منذ بضعة أسابيع لم أواجه هذه المشكلة ...

بيئتي:

$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.12.13+hotfix.9, on Linux, locale en_GB.UTF-8)

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Android Studio (version 3.6)
[✓] IntelliJ IDEA Community Edition (version 2019.3)
[✓] Connected device (2 available)

• No issues found!

حل مؤقت في مشروعي:

  1. لقد أضفت مهلة إلى طريقة "getCurrentPosition" ، وإذا أعادت "فارغة" ، فأنا أبدأ عداد الوقت وحاول مرارًا وتكرارًا ... بعد فترة قصيرة (أحيانًا ثوانٍ ، وأحيانًا دقيقة واحدة) ، تعيد الطريقة الموضع الحالي
  2. إذا كنت بحاجة إلى موضع مبدئي ، فأنا أستخدم الطريقة "getLastKnownPosition ()"

أعتقد أن # 375 و # 386 مرتبطان بهذه المشكلة

نفس المشكلة هنا ، LG G6 ، Android 9.0.

لم يقرر.

هناك طريقة غريبة في كيفية جعله يعمل:
أبدأ تطبيق خرائط جوجل للحصول على الموضع هناك. لذلك أحتاج إلى تنشيط مستشعر الوضع وواي فاي (ربما يعمل اتصال البيانات المحمول أيضًا ، ولم يتم اختباره).
حتى أحصل على الموقف في خرائط جوجل.
بعد ذلك ، يعمل أيضًا في تطبيقي (بغض النظر عما إذا كان تطبيقي قد تم تشغيله بعد ذلك أو كان قيد التشغيل بالفعل).
إذا قمت بإنهاء wifi أو إيقاف تشغيل الموضع ، فلن يعمل بعد الآن ، حتى لو قمت بتشغيلها مرة أخرى.

لا يهم إغلاق خرائط Google في أي وقت ، حتى قبل فتح تطبيقي (لكن في بعض الأحيان يتعين علي فتح خرائط Google أكثر من مرة.)
يبدو لي أن خرائط Google تؤسس شيئًا ما يستمر حتى بعد إغلاق الخرائط ويحتاجه geolocator.

تحرير / تصحيح:
الأمر أكثر تعقيدًا ، حيث نجح الإجراء باستخدام خرائط Google مع جميع الحجج لـ "الدقة المرغوبة" ، ولكن عند تبديل wifi ، كانت هناك فئتان:

  • LocationAccuracy.best و LocationAccuracy.high كانا لا يزالان يعملان ولكنهما أصبحا أبطأ
  • لم يعد يتم حل LocationAccuracy.medium و LocationAccuracy.lower و LocationAccuracy.lowest بعد الآن ، وأيضًا مع هذه الحجج لن يظهر رمز الموقع في شريط الحالة مطلقًا.

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

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

نفس الإصدار ، Android 10 ، OnePlus 7 Pro.

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

على جهاز المحاكاة كل شيء يعمل بشكل جيد.

بعد رسالة SchmadenSchmuki ، أجريت بعض الاختبارات في مشروعي ، وهذا هو استنتاجي: هناك خطأ ما في المكوِّن الإضافي لخرائط Google والذي يؤثر على المكوِّن الإضافي Geolocator. هناك عدم توافق بينهما.

هذا هو تدفق تطبيقي عندما أبدأ تشغيله لأول مرة:

  1. تظهر شاشة البداية
  2. وفي الوقت نفسه ، يتصل التطبيق بواجهة برمجة تطبيقات لسحب بيانات المستخدم
  3. أستخدم Geolocator لتحديد الموقع الحالي للمستخدم
  4. يخرج التطبيق من شاشة البداية ، ثم أعرض خريطة توضح مكان وجود المستخدم

مع هذا التدفق ، يفشل التطبيق. فشلت طريقة 'getCurrentPosition ()' لـ Geolocator ، ولا تُرجع قيمة أبدًا. ملاحظة: تعمل الطريقتان 'isLocationServiceEnabled ()' و 'getLastKnownPosition ()' بشكل جيد.

ولكن إذا قمت بتغيير التدفق إلى:

  1. شاشة البداية
  2. اتصل بواجهة برمجة التطبيقات لسحب بيانات المستخدم
  3. اعرض الخريطة مع موقع عشوائي
  4. استخدم Geolocator لتحديد الموقع الحالي للمستخدم
  5. انقل كاميرا الخريطة إلى الموضع الحالي

إنها تعمل!!!!!

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

إذا تمكن شخص آخر من تأكيد ذلك ، فيمكننا فتح مشكلة لشباب Flutter لمعرفة ذلك

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

لا أعتقد أن هناك مشكلات متعددة على الإطلاق (الاختلافات بين Android 9 + Android 10 ، يستغرق iOS أحيانًا عدة ثوانٍ لإعادة الموقع ، باستخدام Geolocator مع خرائط Google) وسأبدأ في التركيز على كل هؤلاء ومعرفة ما إذا كان بإمكاني تحسين الوضع. سيستغرق هذا بعض الوقت ، لذا يرجى الانتظار معي بينما أبذل قصارى جهدي وسأحاول ترك تحديثات هنا حول تقدمي.

أنا لا أستخدم المكوِّن الإضافي للخرائط. لقد لاحظت أنه عندما أمنح الإذن فقط أثناء تشغيل التطبيق (locationWhenInUse) ، فإن المرة التالية التي أطلبها لن تظهر ولن يتم حلها أبدًا (Android فقط ، على IOS لم تنجح أبدًا منذ أن فتحت هذه المشكلة).

أنا لا أستخدم المكوِّن الإضافي لخرائط Google.

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

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

  • أنا أستخدم مدير الموقع (Geolocator (). forceAndroidLocationManager = true)
  • أنا أستخدم دقة الموقع الافتراضية ، وهي LocationAccuracy.best
  • أنا داخل

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

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

minusminuszero صحيح ، إنه نفس الشيء بالنسبة لي.
بالنسبة لي ، إنه يفعل ما يجب عليه ، أيضًا فور إعادة التشغيل ، آسف للإزعاج.
(لم أقم بتعيين مدير الموقع ، لذا فهو forceAndroidLocationManager = false في حالتي. أستخدم LocationAccuracy.best وأعتقد أنه سيعمل أيضًا مع LocationAccuracy.high ، ربما لا يعمل مع دقة أقل لأنه في هذه الحالات رمز الموقع لا تظهر في شريط الحالة ، ولكن هناك مشكلة بالفعل لذلك.)

أواجه ما سبق أيضًا ، مع نفس الخطوات بالضبط لإعادة الإنتاج (التواجد بالداخل ، ولغة الموقع الافتراضي ، وما إلى ذلك)

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

  • أنا أستخدم مدير الموقع (Geolocator (). forceAndroidLocationManager = true)
  • أنا أستخدم دقة الموقع الافتراضية ، وهي LocationAccuracy.best
  • أنا داخل

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

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

كيف شرعت في فرض موقع "الشبكة"؟ سيكون هذا كافيًا بالنسبة لي من حيث إصلاح المشكلة لأنها تحدث في الداخل على الأقل

كيف شرعت في فرض موقع "الشبكة"؟ سيكون هذا كافيًا بالنسبة لي من حيث إصلاح المشكلة لأنها تحدث في الداخل على الأقل

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

ربما يجب أن تحتوي الطريقة على معلمة مهلة ، أليس كذلك؟

هل يعمل فريق Flutter / Geolocator على هذه المشكلة؟

نعم نحن

شكرا لك mvanbeusekom!
هل تعلم ما هو مصدر المشكلة؟
هل وجدت طريقة لتجاوزها (أو نوع من الحل المؤقت)؟
(الرجوع إلى 4.0.3 لم يحل المشكلة بالنسبة لنا)

في جهاز المحاكاة ، من المهم تكوين المحاكي لإصدار موقع. يمكن القيام بذلك باستخدام عناصر القائمة التالية لتطبيق المحاكاة: الميزات -> الموقع -> (حدد خيارًا آخر ثم "لا شيء").

هذا أصلح المشكلة بالنسبة لي. لكنه خطأ محير للغاية لأنه فشل دون أي استثناءات أو أي شيء.

في جهاز المحاكاة ، من المهم تكوين المحاكي لإصدار موقع. يمكن القيام بذلك باستخدام عناصر القائمة التالية لتطبيق المحاكاة: الميزات -> الموقع -> (حدد خيارًا آخر ثم "لا شيء").

هذا أصلح المشكلة بالنسبة لي. لكنه خطأ محير للغاية لأنه فشل دون أي استثناءات أو أي شيء.

نعم ، بالنسبة لي أيضًا.
الرجاء إضافة مهلة في طلب الموقع وطرح استثناء في المحاكاة التي لم يتم تعيين موقع.

شكرا :)

لدي نفس المشكلة على نظام التشغيل iOS ، وأنا أستخدم أيضًا المكوّن الإضافي لخرائط Google.
لدي تطبيق يستخدم getLocationStream ولكني لا أحصل على مربع حوار إذن حتى انتقل إلى علامة التبويب حيث لدي خريطة google.
لدي تطبيق آخر حيث لم أعد أستخدم خرائط Google ولكني نسيت إزالة المكون الإضافي وواجهت نفس المشكلة. لقد أزلت المكوّن الإضافي لخرائط Google وهو الآن يعمل بشكل صحيح.

أي تحديثات على هذا؟

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

النقاط التي سيتم تضمينها هي:

  • إصلاح مشكلات الإذن ؛
  • تأكد من استرداد getCurrentLocation خلال فترة زمنية معقولة ؛
  • أضف مهلة إلى طرق getCurrentLocation و getPositionStream ، بحيث إذا استغرق الحصول على الموقع وقتًا أطول ، فمن المتوقع أن تنتهي مهلة الطلب ويمكنك إعادة تشغيل الطلب ؛
  • تحسين رسائل الخطأ المحتملة ؛
  • انتقل إلى بنية البرنامج المساعد الموحدة حتى نكون جاهزين لدعم الويب ؛
  • التحديث إلى البرنامج المساعد Android v2 ؛

كانت الخطوة الأولى التي يجب اتخاذها هي نقل ميزات الترميز الجغرافي واستضافتها في المكون الإضافي الخاص بها (والذي يتوفر الآن على pub.dev .

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

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

على أي حال ، أود أن أشكر الجميع على الصبر وردود الفعل ، يرجى الانتظار لفترة أطول قليلاً.

تضمين التغريدة
إنه خبر سار. أنا سعيد لأنك تأخذ الوقت الكافي لتزويدنا بهذا البرنامج المساعد.

شكرا جزيلا لك!

إنني أتطلع إلى التحديثات التالية.

شكرا مع اطيب التحيات

لطيف - جيد! أخبرنا عندما يتم إصداره حتى نتمكن من اختباره.

للحصول على حل مؤقت ، يمكنك التحقق من الحالة على الجهاز باستخدام الطريقة GeolocationStatus checkGeolocationPermissionStatus() . إذا كان الموقع معطلاً ، فإن هذه الطريقة ترجع "معطلة". ثم لا تحتاج إلى استدعاء طريقة getCurrentPosition() .

مثال:

  Future<Position> getCurrentPosition() async {
    Position position;
    GeolocationStatus status = await _geolocator.checkGeolocationPermissionStatus(); 

    if (status != GeolocationStatus.disabled) {
      position = await _geolocator.getLastKnownPosition();

      if (position == null && status == GeolocationStatus.granted) {
        position = await _geolocator.getCurrentPosition(
          desiredAccuracy: LocationAccuracy.high,
          locationPermissionLevel: GeolocationPermission.locationWhenInUse,
        );
      }
    }

    return position;
  }

القليل من التحديث هنا ، لقد قمت هذا الصباح بدفع تحديث جديد لفرع federated_plugin والذي يتضمن دعمًا كاملاً لنظام iOS بما في ذلك تطبيق Flutter كمثال.

لقد بدأنا أيضًا العمل على نظام Android الذي يدعم التحقق من حالة الإذن ، وسنقوم بتنفيذ طلب الأذونات ومعالجة خدمات الموقع الآن.

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

القليل من التحديث هنا ، لقد قمت هذا الصباح بدفع تحديث جديد لفرع federated_plugin والذي يتضمن دعمًا كاملاً لنظام iOS بما في ذلك تطبيق Flutter كمثال.

لقد بدأنا أيضًا العمل على نظام Android الذي يدعم التحقق من حالة الإذن ، وسنقوم بتنفيذ طلب الأذونات ومعالجة خدمات الموقع الآن.

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

شكرا للعمل الجاد على هذا. هل ستقوم بتحديث حزمة geolocator في pub.dev بهذا التغيير؟

هل هذا أيضًا ملف المثال الذي ذكرته أعلاه: position_updates_example_widget.dart؟

شكرا للعمل الجاد على هذا. هل ستقوم بتحديث حزمة geolocator في pub.dev بهذا التغيير؟

هل هذا أيضًا ملف المثال الذي ذكرته أعلاه: position_updates_example_widget.dart؟

لا ، لن أنشر على pub.dev حتى الآن. هذا إعادة صياغة كاملة للمكوِّن الإضافي geolocator ولا يدعم Android حتى الآن. بمجرد انتهاء Android والوثائق ، سأصدره في pub.dev.

نعم ، تعد هذه الأداة جزءًا من مثال التطبيق وتوضح كيف يمكنك الاستماع لتحديثات الموقع.

أهلا،

شكرا لهذه الحزمة.

هل هناك فرصة لإكمال جميع المهام المذكورة أعلاه لنظام Android في هذا الأسبوع؟

أي تحديث على هذا؟

فقط في انتظار تأخر الموقع عند الطلب لأول مرة.

أي تحديثات حول موعد إصدار النسخة المعاد صياغتها؟ تضمين التغريدة

@ dalmia007 ، ليس لدي موعد حتى الآن ولكن تم إحراز تقدم. لقد أضفت دعمًا أوليًا لنظام Android على الفرع feature/federated_android . يحتوي على طلب الأذونات ، والحصول على آخر موقع معروف ، والحصول على تحديثات الموقع والموقع الحالي ، وكل ذلك باستخدام عميل مزود الموقع المدمج (جزء من خدمات Google Play).

ما زلت أعمل على ما يلي:

خاص بـ Android:

  • تنفيذ الميزات المذكورة أعلاه عندما لا تتوفر خدمات Google Play ؛
  • حل المشكلات تلقائيًا عند عدم تمكين خدمات الموقع ؛

عام:

  • قم بتحديث الوثائق

لا تتردد في التحقق من ذلك هنا

mvanbeusekom شكرا جزيلا على التحديث! 👍

أهلا بالجميع،

يسعدني أن أعلن عن إصدار I (أخيرًا) 6.0.0-rc.1 والذي يجب أن يتخلص من كل هذه المشكلات.

سأكون ممتنًا حقًا إذا أمكنك تجربته وإعطائي ملاحظاتك.

يؤسفني أن أقول هذا ولكنه تحطم مرتين الآن ، وهو ما يكفي للعودة إلى 4.0.3 بالفعل.

E/AndroidRuntime(19881): java.lang.RuntimeException: Failure delivering result ResultInfo{who=<strong i="6">@android</strong>:requestPermissions:, request=24, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.packagename.consumer.app/com.packagename.consumer.app.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.baseflow.geolocator.permission.PermissionResultCallback.onResult(com.baseflow.geolocator.permission.LocationPermission)' on a null object reference

حدث عندما ضغطت على السماح لمنح الحوار وأيضًا عندما ضغطت على رفض. اسمحوا لي أن أعرف إذا فاتني شيء.

Dohmanlechx فقط تأكد ، هل حصلت على هذا على 6.0.0-rc.x أو على الإصدار 5.3.2؟

لقد تلقيت هذا على 6.0.0-rc.1 (طلب مني IDE "التحديث" إلى 5.3.2+2 ، لمعلوماتك)

Dohmanlechx بفضل ملاحظاتك وجدت مشكلة. يبدو في حالتك أن أداة تحديد الموقع الجغرافي تحصل على تعليقات من مكون إضافي آخر (أظن أنك تستخدم إذن_المعالج للتعامل مع الأذونات منذ كود الطلب == 24 وهو نفس معالج الإذن) الذي يحاول معالجته والذي من الواضح أنه فشل. في هذه الحالات ، يجب أن يتجاهل محدد الموقع الجغرافي هذه الرسائل لأنها لا تنتمي إلى محدد الموقع الجغرافي. سأصلح هذا اليوم وأطلق إصدارًا جديدًا مرشحًا.

شكرا لملاحظاتك!

أوه ، بالفعل ، نحن نستخدم permission_handler . بحث جيد!

جميع الاعتمادات تذهب إليك Dohmanlechx ؛). بفضل ملاحظاتك ، تمكنت من اكتشاف هذا الخطأ وسأكون قادرًا على إصدار إصدار جديد قريبًا.

Dohmanlechx لقد قمت للتو بإصدار الإصدار 6.0.0-rc.3 والذي يجب أن يصلح الخطأ الذي واجهته.

رائع جدًا ، تم اختباره بعناية على Android Emulator ، حيث عمل المنح والرفض والتلاعب بالموقع بشكل مثالي. عملت بشكل جيد على جهاز Android الحقيقي الخاص بي أيضًا.

ولكن لم يتم عرض أي طلب لنظام iOS Simulator على الإطلاق ، فهل تعتقد أنه المقصود؟ ومع ذلك ، لن يتعطل على الأقل وسيعمل التطبيق كما يحلو له دون توفر أي موقع. لسوء الحظ ، ما زلت غير قادر على الاختبار على جهاز iPhone الخاص بي بسبب مشكلة اتصال Xcode ولا أريد نشر تصميم على TestFlight فقط للاختبار الآن. سأخبرك بمجرد أن اختبرت على iPhone.

لكن حتى الآن ، جيد جدًا!

شكرًا جزيلاً على الاختبار الشامل Dohmanlechx ، إنه موضع تقدير كبير جدًا!

لا يُظهر المكون الإضافي بالفعل طلب خدمة على iOS ، نظرًا لعدم وجود واجهة برمجة تطبيقات (عامة) للقيام بذلك. الخيار الوحيد المتاح لدينا هنا هو إظهار رسالة للمستخدم يدويًا تشرح كيفية تحديث الإعدادات يدويًا. لدينا خيار لإعادة توجيه المستخدم إلى تطبيق الإعدادات (من خلال استدعاء الطرق openAppSettings() أو openLocationSettings() ). لقد وثقت هذا بشكل أكثر تفصيلاً في ملف README.md .

يؤسفني أن أبلغ عن ذلك ، لكنها عملت مثل كارثة على جهاز iPhone XS Max ، OS 13.6.1.

نجح جلب الموضع لأول مرة تمامًا مثل الإصدار القديم ، حيث تم إرجاع الموضع الصحيح ولكنه لا يزال يستغرق من 7 إلى 8 ثوانٍ.

ولكن من المرة الثانية وما بعدها ، استمر في الرمي على الفور. اضطررت للتغيير من Exception err إلى dynamic err للأسباب التالية:
_ استثناء غير معالج: النوع "_TypeError" ليس نوعًا فرعيًا من النوع "استثناء" _.

أحصل على هؤلاء عندما يفشل (بعد أول مرة في الجلب):

2020-08-26 14: 01: 45.670206 + 0200 عداء [4565: 206487] رفرفة: تعذر جلب الموقع: حالة سيئة: لا يوجد عنصر
2020-08-26 14: 01: 45.670416 + 0200 عداء [4565: 206487] رفرفة: تعذر جلب الموقع: مثيل "NoLocationFoundException"

( NoLocationFoundException هو صفي المخصص)

_حالة سيئة: لا يوجد عنصر _ لا يخبرنا كثيرًا للأسف ... تحته الكود الخاص بي:

static Future<void> _getUserLocation({bool isSneaky = false}) async {

  void _throw(dynamic err) {
    print("Could not fetch location: $err");
    if (!isSneaky) Fluttertoast.showToast(msg: getTranslation("location_fetch_error"));
    throw NoLocationFoundException();
  }

  await GeolocatorPlatform.instance
      .getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high,
        timeLimit: const Duration(seconds: _TIMEOUT_DELAY),
      )
      .then((position) => _userLatestPosition = position)
      .catchError(
    (err) {
      // Debug only, remove later
      Fluttertoast.showToast(msg: "error: $err");

      if (err is TimeoutException) {
        GeolocatorPlatform.instance.getLastKnownPosition().then((position) {
          if (position == null) _throw(err);
          return position;
        }, onError: (err) {
          _throw(err);
        });
      } else if (err is PermissionDeniedException) {
        XxlPermissionsHandler.request(Permission.location);
      } else {
        _throw(err);
      }
    },
  ).catchError((err) => _throw(err));
}

أتمنى مخلصًا أن تتمكن من إعادة إنتاج هذا على جهاز iPhone الخاص بك.

Dohmanlechx ، شكرًا لك على التعليقات المكثفة ، أعتقد أنني وجدت المشكلة هنا. الآن أنا بحاجة إلى إيجاد طريقة جيدة لإصلاحها ؛)

باختصار ، تستدعي الطريقة getCurrentPosition getPositionStream وتأخذ العنصر الأول ثم تغلق الدفق. المشكلة هي أن getPositionStream يحتوي على رمز مثل هذا:

    if (_positionStream != null) {
      return _positionStream;
    }

وهو ما يمكنك تخمينه يتسبب في حدوث استثناء Bad state: No element عند استدعاء getCurrentPosition للمرة الثانية ، لأنه سيتصل بـ first في دفق مغلق بالفعل. سأعمل على هذا وأطلق مرشحًا جديدًا قريبًا.

Dohmanlechx ، أنت تصدر حيث تحصل على "حالة سيئة: لا يوجد عنصر" كان يجب إصلاحه في 6.0.0-rc.4 الذي نشرته للتو. لم أتمكن من إعادة إنتاج المشكلة ، لكنني تمكنت من التأكد من أن getCurrentPosition سيستخدم دفقًا جديدًا عندما تسميه ثانية (وأي وقت لاحق).

سأكون ممتنًا حقًا لأنه يمكنك إعطائها محاولة أخرى وإخباري إذا كانت تعمل.

ما لاحظته هو أنك تستخدم مباشرة GeolocatorPlatform.instance.<some_method> ، من خلال القيام بذلك أنت تمر بأي منطق موجود في حزمة geolocator وتنتقل مباشرة إلى التطبيق الافتراضي الموجود في geolocator_platform_instance حزمة. في الوقت الحالي ، لا يوجد تطبيق محدد في حزمة geolocator ولكن لا يزال من الأفضل عدم تجاوزها.

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

import 'package:geolocator/geolocator.dart';

final position = await getCurrentPosition();

إذا واجهت تضاربات أو أردت ببساطة أن تسبق الطرق العامة ، يمكنك إضافة اسم مستعار إلى الاستيراد ، مثل:

import 'package:geolocator/geolocator.dart' as geolocator;

final position = await geolocator.getCurrentPosition();

شكرًا ، لقد غيرت الرمز أيضًا وفقًا لاقتراحاتكم.

ذهب الانهيار الآن ولكن لسوء الحظ ، لا يزال الوضع غير مستقر للغاية. إنه سريع للغاية 3 من أصل 10 مرات (أتمنى حقًا أن يكون 10 من 10 مرات) ، ولكن 7 من أصل 10 أضعاف الحد الزمني (10 ثوانٍ) يتم تجاوزه ويتم رميات الوظيفة. هل اختبرت على جهاز iPhone إرسال رسائل غير مرغوب فيها إلى getCurrentPosition() ؟ لقد اختبرت على iPhone XS Max ، OS 13.6.1.

_4.0.3_ بطيئة لكنها مستقرة
_6.0.0-rc.4_ سريع ولكنه غير مستقر

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

Dohmanlechx سعيد لسماع أن الحادث قد تم حله ، وهذا شيء على الأقل ؛)

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

main.dart:

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  <strong i="10">@override</strong>
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Position> _positions = <Position>[];

  <strong i="11">@override</strong>
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(
        body: ListView.builder(
          itemCount: _positions.length,
          itemBuilder: (BuildContext context, int index) {
            return ListTile(title: Text(_positions[index].toString()),);
          },),
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () => getCurrentPosition().then((position) {
            setState(() {
              _positions.add(position);
            });
          }),
        ),
      ),
    );
  }
}

Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>$(DEVELOPMENT_LANGUAGE)</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>geolocator_issue</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>$(FLUTTER_BUILD_NAME)</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>$(FLUTTER_BUILD_NUMBER)</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIMainStoryboardFile</key>
    <string>Main</string>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>The example App requires access to the device's location.</string>
</dict>
</plist>

لذلك في كل مرة أضغط فيها على زر الإجراء العائم يتم استدعاء getCurrentPosition وتتم إضافة النتيجة إلى ListView . لقد اختبرت هذا التطبيق على جهاز iPhone 7 الشخصي الخاص بي ، و iPhone 6 الخاص بزوجتي والمحاكي (جميعها تعمل بأحدث إصدار من نظام التشغيل iOS) ولكن يمكنني إرسال بريد عشوائي على الزر ويتم إرجاع الموقع على الفور تقريبًا. أنا في حيرة من أمري حقًا لماذا لديك تجربة مختلفة. ربما يمكنك اختبار نموذج التعليمات البرمجية هذا ومعرفة ما إذا كنت لا تزال تواجه نفس المشكلة؟

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

شكرا لردود الفعل والكلمات الرقيقة ، حقا أقدر ذلك. لقد بذلت الكثير من الجهد في إعادة بناء أداة تحديد المواقع الجغرافية وكانت هذه المشكلة هي التي جعلتني أقرر البدء بها ، لذلك أود حقًا أن تكون جيدة هذه المرة ؛)

يرجى إعلامي كيف ستسير الأمور وإذا كان بإمكاني المساعدة.

getCurrentPosition().then((position) {
   print(position);
}).catchError((err) {
   print(err);
});

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

بالرغم من ذلك ، يحدث هذا _ أحيانًا_أثناء جلب الموضع:

I/flutter (  393): ══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
I/flutter (  393): The following PlatformException was thrown while de-activating platform stream on channel
I/flutter (  393): flutter.baseflow.com/geolocator_updates:
I/flutter (  393): PlatformException(error, No active stream to cancel, null)
I/flutter (  393): 
I/flutter (  393): When the exception was thrown, this was the stack:
I/flutter (  393): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:572:7)
I/flutter (  393): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:161:18)
I/flutter (  393): <asynchronous suspension>
I/flutter (  393): #2      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12)
I/flutter (  393): #3      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:554:29)
I/flutter (  393): #4      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:551:18)
I/flutter (  393): #18     MethodChannelGeolocator.getPositionStream.<anonymous closure> (package:geolocator_platform_interface/src/implementations/method_channel_geolocator.dart:135:13)
I/flutter (  393): (elided 24 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
I/flutter (  393): ════════════════════════════════════════════════════════════════════════════════════════════════════

mvanbeusekom لا يمكنني الحصول على المركز مطلقًا باستخدام أحدث إصدار 6.0.0 + 1. تمت المحاولة على محاكي iOS ، ومحاكي Android API 29 ، و OnePlus الفعلي 6. يتم إلقاء المهلة في كل مرة.

image

image

لا أعرف ما الذي يمكنني إضافته هنا لدعمك في العثور على المشكلة ، أو getCurrentPosition يُرجع المهلة أو يتوقف فقط إذا لم يتم تحديد المعلمة timeLimit . لقد جربت دقة موقع مختلفة. هل لدى أي شخص هذه المشكلة؟

يعمل الإصدار 5.3.2 + 2 بشكل جيد على محاكي iOS (مع تحديد الموقع المخصص) وجهاز Android الحقيقي ومحاكي Android

mvanbeusekom ، لقد قرأت كل هذه الأشياء ، وأنا أقوم بالترقية إلى أحدث إصدار لإصلاح مشكلة التأخير لمدة 10 ثوانٍ.

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

Position userLocation;
List<Placemark> listAddresses = [];
if(permission.toString() != "PermissionStatus.granted"){
        listAddresses = await placemarkFromAddress("$city, $state");
         userLocation = listAddresses[0].position;
    }else{
getCurrentPosition...
}

الآن ، يبدو أنه تم تغيير _placemarkFromAddress_ إلى _ locationFromAddress _ ، لذلك حاولت التكيف مع إجراء التغييرات التالية في الصيغة الخاصة بي:

Position userLocation;
List<Location> listAddresses = [];
if(permission.toString() != "PermissionStatus.granted"){
        listAddresses = await locationFromAddress("$city, $state");
         userLocation = listAddresses[0].position;
    }else{
getCurrentPosition...
}

لكني أتلقى الخطأ التالي:

A value type 'Location' can't be assigned to a variable of type 'Position'.

كيف يمكنني تحويل الموقع إلى Position ، أو في النهاية ، في حالة رفض المستخدم للموقع ، كيف يمكنني الآن تعيين موقعه على مركز مدينته؟

شكرا.

لقد قمت بالتحديث إلى أحدث إصدار ، وحللت المشكلة بالنسبة لي 👍👍👍

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات