使用 Capacitor 构建的 iOS 应用程序的位置权限

Posted

技术标签:

【中文标题】使用 Capacitor 构建的 iOS 应用程序的位置权限【英文标题】:Location Permission on iOS app built with Capacitor 【发布时间】:2021-09-16 17:28:52 【问题描述】:

我正在为需要地理定位权限的 iosandroid 构建一个移动应用程序。使用 Capacitor 来构建它,它在 Android 中运行良好。但是在 iOS 上,我的 Mapbox 地图中的“用户中心”按钮不起作用,当您尝试单击它时会被划掉并禁用。网上有很多答案,例如this one,人们解释说您必须向 Info.plist 文件添加三个权限:

NSLocationAlwaysUsageDescription NSLocationWhenInUseUsageDescription NSLocationAlwaysAndWhenInUseUsageDescription

我只添加了第二个,因为我只需要在使用应用程序时访问地理位置。但是仍然无法访问位置服务。我也尝试添加几个插件,但这也没有解决问题。以下是 package.json 文件中相关项目的列表:

  "dependencies": 
    "@capacitor/core": "^3.0.2",
    "@capacitor/ios": "^3.0.2",
    "@ionic-native/location-accuracy": "^5.34.0",
    "@mapbox/mapbox-gl-geocoder": "^4.7.1",
    "@mapbox/mapbox-sdk": "^0.13.0",
    "cordova-plugin-request-location-accuracy": "^2.3.0",
    "mapbox-gl": "^2.3.1",
    "react": "^17.0.2",
    "react-dom": "^17.0.2"
  ,
  "devDependencies": 
    "@capacitor/app": "^1.0.2",
    "@capacitor/cli": "^3.0.2",
    "@capacitor/geolocation": "^1.0.2",
    "capacitor-resources": "^2.0.5"
  

对于正常运行的android构建,我不必导入任何插件或任何东西,我只需添加权限即可。如何让用户使用 Capacitor 将地图以他们在 ios 上的位置为中心?谢谢。

【问题讨论】:

【参考方案1】:

问题是 Android 和 iOS 在我的用例中表现得非常不同。在 Android 版本中,提供位置权限就足够了。有了这些权限,作为我应用程序重要组成部分的 mapbox 地图就能够像在 Web 构建中通常那样使用用户的位置。不需要插件,所以基本上是理想的场景。

在 iOS 上,mapbox 地图仍然无法直接访问用户的位置。因此,当您单击目标符号按钮以您的位置为中心时,即使具有权限,mapbox 地图也无法完成请求。但是您可以做的是使用@capacitor/geolocation 插件来获取坐标(和其他gps 数据),然后将地图设置为您传递给它的特定坐标。

我不确定为什么 Android 和 iOS 在这种情况下表现如此不同。

【讨论】:

以上是关于使用 Capacitor 构建的 iOS 应用程序的位置权限的主要内容,如果未能解决你的问题,请参考以下文章

Ionic Capacitor 无法再生成可构建的 iOS 项目,CompileAssetCatalog 错误

您如何在 Ionic w/ Capacitor 中更新 iOS 和 Android 应用程序版本?

Capacitor v3 插件不适用于 android 构建

状态栏使用 Capacitor 覆盖 iOS 上的 webview

将 iOS 事件传递给 Ionic/Capacitor webview

电容器:在不使用 Xcode 的情况下添加 IOS 权利