我正在尝试在我正在使用的应用上请求位置许可。它在Android设备上完美运行,但在iOS上不提示任何内容。目标iOS版本为11,我使用的软件包为geolocator: ^5.3.1
和permission_handler: ^5.0.0+hotfix.5
。
这是我的代码。
如果状态不是granted
,这是我的实用程序功能,用于请求许可。
Future<PermissionStatus> getDeviceLocationPermission() async {
final PermissionStatus permissionStatus =
await Permission.locationWhenInUse.status;
if (permissionStatus != PermissionStatus.granted) {
await Permission.locationWhenInUse.request();
}
return permissionStatus;
}
这是我的实用程序功能,用于收集位置详细信息。
Future<Position> getDeviceCurrentLocation(
{@required PermissionStatus permissionStatus}) async {
Position position;
Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
if (permissionStatus == null) {
return null;
}
if (permissionStatus == PermissionStatus.granted) {
position = await geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
}
return position;
}
这就是我在有状态的小部件内访问这些实用程序的方式。
getDeviceLocationPermission().then((permissionStatus) {
print(permissionStatus);
getDeviceCurrentLocation(permissionStatus: permissionStatus)
.then((position) {
print(position);
});
});
这是我的位置服务的info.plist权限。
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to location when open.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app needs access to location when open and in the background.</string>
在iOS设备上,它不会提示要求允许或拒绝访问的对话框,并且还返回一个null
值。
请询问是否还需要其他信息。有人可以帮我吗?预先感谢!
答案 0 :(得分:0)
我遵循了您的代码以及他们在packagepermission_handler中提供的代码。同时运行并在代码中重现该问题。
该问题可以通过以下方法解决。 :
创建了通用权限值列表。
Activity
调整了函数getDeviceLocationPermission,如下所示:
List<Permission> lp = Permission.values;
注意:以上是解决问题所需的最少代码。根据您的要求,您可能要取消注释if条件。
我认为,使用更好的软件包是location软件包。一个软件包为您提供了权限处理程序以及latlong,并且代码非常简单。见下文:
Future<PermissionStatus> getDeviceLocationPermission() async {
Permission _permission = lp.elementAt(5); // 5 = location in use permission
// The following line then prompts the required alert dialog
final PermissionStatus permissionStatus = await _permission.request();
/* final PermissionStatus permissionStatus = await Permission.locationWhenInUse.status;
if (permissionStatus != PermissionStatus.granted) {
await Permission.locationWhenInUse.request();
}*/
return permissionStatus;
}
答案 1 :(得分:0)
如果要使用地理位置定位器,则不需要权限Permission_handler。因为geolocator具有_getLocationPermission()方法,并且此方法将在内部获取位置许可。另外,我发现在ios模拟器中获取权限无法正常工作。您也可以检查此issue。因此您可以像这样简化代码:
Future<Position> getDeviceCurrentLocation() async {
Position position;
Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
position = await geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
return position;
}
和
getDeviceCurrentLocation()
.then((position) {
print(position);
});
答案 2 :(得分:0)
将此添加到您的 info.plist
文件中。
<key>NSLocationWhenInUseUsageDescription</key>
<string>Location permission is required.</string>
将 PERMISSION_LOCATION=1
添加到您的 podfile
。检查以下内容:
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
'$(inherited)',
## Add this line
'PERMISSION_LOCATION=1'
]
end
end
end
请求权限:
var status = await Permission.locationWhenInUse.request();