Flutter-geolocator: خطأ بعد الموافقة على iOS: PlatformException (PERMISSION_DENIED ، تم رفض الوصول إلى بيانات الموقع ، فارغ)

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

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

  1. يسأل الرمز عن الوظيفة ، ويوافق المستخدم ، ويطرح الرمز خطأ:
    PlatformException (PERMISSION_DENIED ، رفض الوصول إلى بيانات الموقع ، فارغ)

  2. ولكن بعد طلب الوظيفة للمرة الثانية ، يتم إرجاع الموضع الصحيح على الفور دون حوار أو أخطاء.

سلوك متوقع

يتم إرجاع الموضع ولا يتم إلقاء أي أخطاء عند طلب المنصب وموافقة المستخدم.

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

import 'package:geolocator/geolocator.dart';
try{
   position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
}
catch(error)
{
  print("error in geolocation: $error"); //error in geolocation: PlatformException(PERMISSION_DENIED, Access to location data denied, null)
  print("position: $position"); // position: null
  print("retrying");  // retrying
  try{
    position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
  }
  catch(error)
  {
    await printGeoStatus(5);
    print("2nd error in geolocation $error");
  }
  print("final position: $position"); //flutter: final position: Lat: 59.xyz, Long: 17.xyz

}

إعدادات

إصدار Flutter
إصدار Geolocator: ^ 4.0.2

برنامج:

  • [x]: iphone: iOS
  • []: الروبوت: Android
ios triage bug

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

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

جانب iOS جاهز حاليًا وسيعمل على جانب Android الآن.

ال 12 كومينتر

FlashJonas مؤخرًا قمنا geolocator بالكامل (الإصدار 5.0.0) وكنت أتساءل عما إذا كنت لا تزال تواجه هذه المشكلة في الإصدار الأخير؟

mvanbeusekom أؤكد أن المشكلة لا تزال موجودة في 5.0.0
اكتشفت للتو الحزمة الخاصة بك من خلال دورات AppBrewery.

قررت متابعة مستندات الحزم وأضفت إلى ملف plist المفاتيح الثلاثة:

<key>NSLocationWhenInUseUsageDescription</key>
    <string>This app needs access to location when open.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>This app needs access to location when in the background.</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>This app needs access to location when open and in the background.</string>

أول دعوة إلى

Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.low);

مطالبة المستخدم بالحصول على إذن (مع 3 خيارات):
image

إذا قمت بالضغط على "أثناء استخدام التطبيق فقط" ، فسيتم تسجيل ما يلي في المحطة الطرفية:

[VERBOSE-2: ui_dart_state.cc (148)] استثناء غير معالج: PlatformException (PERMISSION_DENIED ، تم رفض الوصول إلى بيانات الموقع ، فارغ)

0 Geolocator._handleInvalidPermissions (الحزمة: geolocator / geolocator.dart: 191: 7)

1 Geolocator.getCurrentPosition (الحزمة: geolocator / geolocator.dart: 102: 7)

2 _LoadingScreenState.getLocation (الحزمة: clima / screens / loading_screen.dart: 13: 10)

3 _LoadingScreenState.build.(الحزمة: clima / screens / loading_screen.dart: 23:13)

4 _InkResponseState._handleTap (الحزمة: flutter / src / material / ink_well.dart: 511: 14)

5 _InkResponseState.build.(العبوة: رفرفة / src / material / ink_well.dart: 566: 30)

6 GestureRecognizer.invokeCallback (الحزمة: رفرفة / src / الإيماءات / أداة التعرف. الجزء: 166: 24)

7 TapGestureRecognizer._checkUp (الحزمة: flutter / src / gestures / tap.dart: 240: 9)

8 TapGestureRecognizer.handlePrimaryPointer (الحزمة: الرفرفة / src / الإيماءات / النقر. الجزء: 177: 9)

9 <…>

الضغط الثاني على ما يرام ويتم تسجيل الموضع بدون مشكلة:

الرفرفة: خط العرض: 37.785834 ، طويل: -122.406417

شفرة :
image

لا تزال تواجه نفس المشكلة على جهاز iPhone 5s ، 12.2 ، باستخدام geolocator 5.1.2.
* تحرير (Flutter Channel dev، v1.8.4)

// Called after closing welcome alert
Future getFirstLocation() async {
    Position position;
    try {
      position = await Geolocator()
          .getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    } catch (error) {
      print("getfirstlocation error 1");
      try {
        position = await Geolocator()
            .getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
      } catch (error) {
        print("error in geolocation $error");
      }
    }

    print("getfirstlocation position: $position");

    if (position != null) {
     // send to database
    }
  }

سجلات من تشغيل الكود أعلاه:
flutter: getfirstlocation error 1
flutter: getfirstlocation position: Lat: 59.xxxx, Long: 17.yyyy

أواجه نفس الخطأ:
Android (Oneplus 2) - Android 8.1.0 - Geolocator 5.1.2
(تم منح إذن الموقع)

2019-08-15 16:54:22.606 926-1110/system_process E/InputDispatcher: channel '569829a de.paschke.coffeebreak/de.paschke.coffeebreak.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2019-08-15 16:54:56.808 14735-14766/? E/flutter: [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(PERMISSION_DENIED, Access to location data denied, null)
    #0      Geolocator._handleInvalidPermissions (package:geolocator/geolocator.dart:207:7)
    #1      Geolocator.getLastKnownPosition (package:geolocator/geolocator.dart:146:7)
    <asynchronous suspension>
    #2      LocationService.getLastKnownLocation (package:coffee_break/services/location_service.dart:24:51)
    <asynchronous suspension>
    #3      UserStoreBase.checkLastLocation (package:coffee_break/stores/user_store.dart:125:36)

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

نفس المشكلة :( في الإصدار الأخير قناة مستقرة من الرفرفة.

هذه الحزمة تمتص ...

نفس الخطأ ، أحدث إصدار من flutter على نظام Android 10.

لدي نفس المشكلة!

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

عندما أحدد خيار "فقط أثناء استخدام التطبيق" من موجه iOS ، أحصل على استثناء في وحدة التحكم flutter حتى في المرة الثانية التي أطلب فيها الموقع من التطبيق أحصل على بيانات الموقع الصحيحة.

PS باستخدام أحدث إصدار 5.3.2+2

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

جانب iOS جاهز حاليًا وسيعمل على جانب Android الآن.

يجب إصلاح ذلك في الإصدار 6.0.0

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

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

الخطوات التي يجب القيام بها هي التالية

  1. أضف "location_permissions: 3.0.0 + 1" هذه التبعيات في "pubspec.yaml". يرجى ملاحظة أنني فعلت ذلك من أجل flutter 1.22.0 ، لذا فقد تكون هذه مشكلة بالنسبة إلى flutter 2.0.
  2. قم باستيراد الحزمة في الملف

    استيراد ' package: location_permissions / location_permissions.dart ' ؛

  3. أضف الكود التالي على الصفحة حيث تريد طلب الإذن. (من الأفضل إضافة ذلك في الصفحة الأولى من تطبيقك.)

     <strong i="16">@override</strong>
      void initState() {
       ....
      if (Platform.isIOS) {
        location_permission();
      }
      ....
    

    }

  4. أضف الطريقتين التاليتين في نفس الملف

    باطل location_permission () غير متزامن {
    إذن PermissionStatus النهائي = انتظار _getLocationPermission () ؛
    إذا (إذن == PermissionStatus.granted) {
    الموضع النهائي = انتظار geolocator.getCurrentPosition (
    wantAccuracy: LocationAccuracy.best) ؛

      // Use the position to do whatever...
    }
    

    }

    مستقبل_getLocationPermission () غير متزامن {
    إذن الحالة النهائية = انتظار LocationPermissions ()
    .checkPermissionStatus (المستوى: LocationPermissionLevel.location) ؛

    if (permission != PermissionStatus.granted) {
      final PermissionStatus permissionStatus = await LocationPermissions()
          .requestPermissions(
              permissionLevel: LocationPermissionLevel.location);
    
      return permissionStatus;
    } else {
      return permission;
    }
    

    }

هذا كل شيء الآن يجب أن تحصل على نافذة منبثقة في تطبيق iOS والتي ستطلب إذن الموقع.

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

القضايا ذات الصلة

deisold picture deisold  ·  3تعليقات

prasant10050 picture prasant10050  ·  6تعليقات

shrishti08 picture shrishti08  ·  3تعليقات

hectorAguero picture hectorAguero  ·  5تعليقات

estevez-dev picture estevez-dev  ·  6تعليقات