android react-native 避免 "Background location access not declared" 在 Google 批准过程中

android react-native avoiding "Background location access not declared" in Google approval process

好的,所以 Google 告诉我们“未声明后台位置访问”并且不允许我们发布我们的应用程序。我们没有用到背景位置,所以我们试图完全消除它。

我的清单当然没有:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-feature android:name="android.hardware.location.gps"/>

我到处搜索任何可以添加 ACCESS_BACKGROUND_LOCATION 到我们的应用程序的东西,但一无所获。

使用银色搜索器:

ag ACCESS_BACKGROUND_LOCATION .

我已经检查了 blame 报告以寻找线索,并对任何包含 'background' 一词的内容进行了倒推,但无济于事: android/app/build/intermediates/manifest_merge_blame_file/myAppRelease/manifest-merger-blame-myapp-release-report.txt

虽然我确实找到了一些额外的权限:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

但我在那里没有看到任何危险信号..

我试过节点删除选项:

<manifest ...xmlns:tools="http://schemas.android.com/tools"...>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" tools:node="remove" />

但是什么都没有。

我也运行 aapt2

$ aapt2 d permissions android/app/build/outputs/apk/myapp/release/app-myapp-release.apk
package: com.myapp
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.ACCESS_COARSE_LOCATION'
uses-permission: name='android.permission.ACCESS_FINE_LOCATION'
uses-permission: name='android.permission.SYSTEM_ALERT_WINDOW'
uses-permission: name='com.android.vending.BILLING'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.ACCESS_WIFI_STATE'
uses-permission: name='android.permission.WAKE_LOCK'

这并没有告诉我更多..

我还观看了整个 youtube 视频 google posted 关于背景位置,阅读官方文档,并检查了每个堆栈溢出 post - 但他们只是推荐我已经采取的步骤。

这是一个令人筋疲力尽的过程!我累极了。我最好的猜测是我们的一个依赖项是问题所在,但我不知道它可能是哪一个。

真的很感谢一些新鲜的眼光.. 也许有人在使用下面这些软件包之一时遇到了这个问题,并且会说,就是那个!删除它!

否则它又回到了绝望的搜索和基于最少信息的暴力重建..

  "dependencies": {
    "@mapbox/geo-viewport": "0.4.1",
    "@mapbox/geojson-extent": "0.3.2",
    "@mapbox/polyline": "1.1.1",
    "@ptomasroos/react-native-multi-slider": "1.0.0",
    "@react-native-community/async-storage": "1.12.0",
    "@react-native-community/masked-view": "0.1.10",
    "@react-native-community/netinfo": "4.7.0",
    "@react-native-mapbox-gl/maps": "7.0.8",
    "@sentry/react-native": "1.8.2",
    "@turf/along": "^6.0.1",
    "@turf/bearing": "^6.0.1",
    "@turf/distance": "^6.0.1",
    "@turf/helpers": "^6.1.4",
    "@turf/line-distance": "^4.7.3",
    "@turf/nearest": "^4.7.3",
    "check-node-version": "4.0.3",
    "deprecated-react-native-listview": "^0.0.6",
    "eslint-plugin-react": "7.21.2",
    "install": "^0.13.0",
    "npm": "6.14.8",
    "prop-types": "^15.6.0",
    "react": "16.11.0",
    "react-native": "0.62.2",
    "react-native-billing": "^3.0.0",
    "react-native-config": "^1.4.2",
    "react-native-elements": "^1.2.7",
    "react-native-gesture-handler": "1.8.0",
    "react-native-in-app-utils": "6.1.0",
    "react-native-linear-gradient": "^2.5.6",
    "react-native-mixpanel": "1.2.5",
    "react-native-rate": "1.0.9",
    "react-native-safe-area-context": "^3.1.8",
    "react-native-screens": "2.8.0",
    "react-native-splash-screen": "3.2.0",
    "react-native-sqlite-2": "1.7.0",
    "react-native-vector-icons": "^6.6.0",
    "react-native-webview": "10.9.3",
    "react-navigation": "4.0.10",
    "react-navigation-stack": "2.0.16",
    "url": "^0.11.0",
    "util": "0.12.3",
    "which-polygon": "2.2.0"
  },
  "devDependencies": {
    "babel-eslint": "^10.1.0",
    "eslint": "^6.8.0",
    "eslint-plugin-import": "2.22.1",
    "fs-extra": "^8.1.0",
    "jetifier": "1.6.6",
    "metro-react-native-babel-preset": "^0.58.0",
    "minimatch": "^3.0.4",
    "node-watch": "0.6.4",
    "rimraf": "2.7.1"
  }

希望右眼看到这个,或者可以指出一些东西..谢谢!

更新,从 google:

获得了更多细节

Since your app does not need background location, please request to remove background usage and reach compliance:

If you are targeting Android 10 or newer (SDK level 29 or higher): Remove the ACCESS_BACKGROUND_LOCATION permission from your app APK or app bundle. If you’re using ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION, examine your code paths and restrict usage to foreground purposes only. (learn more: https://developer.android.com/training/location/background) You should no longer see the Location declaration listed in console under App Content. If your are targeting Android 9 or older (SDK level 28 or lower): If you’re already using ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION, examine your code paths and restrict usage to foreground purposes only. (learn more: https://developer.android.com/training/location/background) In your console declaration, select “No” to the question “Does your app access location in the background in APKs or app bundles targeting Android 9 or older?

几周前我遇到了这个问题,真痛苦!在我的例子中,我有一个依赖项需要在我不注意的情况下进行后台定位。其次,我在 Google Play 上的权限声明错误,因此我的构建一直被拒绝。

1。找到邪恶的依赖

为此,我使用了 Android Studio 中的 Merged Manifest inspector。这向您展示了在考虑所有项目依赖性之后您的清单的样子。找到 ACCESS_BACKGROUND_LOCATION 并双击它,这会将您带到请求它的实际清单。滚动到此文件的顶部,package=some.package.name 应该可以帮助您识别它是什么。在我的例子中,权限是由我不再使用的旧依赖项请求的,所以我只是卸载了它。

注意:如果您经常在不同的分支上工作,请确保安装了正确的依赖项并在检查合并的清单之前进行干净的构建:

cd android && yarn && ./gradlew clean && yarn android

2。检查 Google 播放声明(可选)

转到 Google Play 管理中心。通过查看 App Bundle 详细信息中的“必需权限”,您可以确保后台位置权限已从您的 App Bundle 中删除。然后,如果您之前填写了后台位置权限声明,请务必检查它并select No (your app may be removed from Google Play if it accesses location in the background)。在那之后你应该是好的,你的应用应该会被及时批准。

✌️

备注*
: 如果不填写,您将无法上传您的构建,因此请先在游戏控制台上填写声明表,并说明您正在获取任何后台位置访问权限。

我在我的版本中也遇到过类似的情况,在当前版本中,我没有使用任何后台位置访问。但在我之前的版本中,在游戏控制台的内部测试中使用后台位置访问。因此,由于该游戏控制台阻止我在声明之前上传任何要发布的版本。 因此,我必须通过这些步骤解决同样的问题。

1)做了一个申报app小视频,并在申报表中提到我们没有使用和后台位置访问,并发布了它。

2)完成这一步后我就可以发布了,所以我首先将我的最新版本上传到内部测试并发布了它。

  1. 在内部测试发布成功后,我将其发布到生产环境。

除了检查 alpha 之外,Play 控制台上的 Beta 测试分支也会确保 none 之前的应用程序存在于这些分支中。

Update 5.21.2021: Welp, we just received a note from google that our apps have been taken down. So the solution below does not work, we just got caught up in the confusion and thought it was working.

好的!我们有一个人解决了这个问题。这是它是如何完成的。

  1. 从 react-native 项目中任何位置的任何文件手动删除 ACCESS_BACKGROUND_LOCATION,包括 node_modules 和生成的包。是的,我知道,这听起来真的很愚蠢,因为它们会在您下次安装时返回,但我们只需要获得批准一次就可以再次运行。

这是一个适用于此的命令:

grep -r "ACCESS_BACKGROUND_LOCATION" . | cut -c1-150

您会找到如下文件:

android/app/src/main/assets/index.android.bundle
node_modules/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.js
node_modules/react-native/Libraries/PermissionsAndroid/NativePermissionsAndroid.js

通过并删除“ACCESS_BACKGROUND_LOCATION”

  1. 然后重新上传 apk,并清除上传文件中的所有非生产轨道,因为它们可能包含“ACCESS_BACKGROUND_LOCATION”。

在此之后,Google 批准了它..

该应用从未使用过后台定位,但在某些时候,有人可能表示它在上传时确实使用了后台定位 - Google 记住了这一点,这就是为什么它需要额外的步骤才能获得批准我你猜?

不是一个非常令人满意的答案!非常 hacky 和不确定.. 但这对我们有用。现在我希望它再也不会发生了。

尝试使用以下命令查找权限 grep -r ACCESS_BACKGROUND_LOCATION android/* grep -r ACCESS_COARSE_LOCATION android/* 等..

之后,如果您已经使用 bundleRelease 生成了应用程序,您会注意到权限显示在构建文件夹中。

只需查找权限所在的位置,然后在下面的同一文件中查看哪个组件使用它。

在我的例子中是 radar.io 库。

由于您检测到它是什么库,可能是由于 react 的一个组件或某些库必须从 gradle 中删除。

我解决这个问题不是像 grep -r "ACCESS_BACKGROUND_LOCATION" . | cut -c1-150 那样从 .js 中删除“ACCESS_BACKGROUND_LOCATION”,而是像 .java 那样从 .java 中删除“ACCESS_BACKGROUND_LOCATION” :

sed -i -e "s/.*ACCESS_BACKGROUND_LOCATION.*/return true;/g" node_modules/expo-location/android/src/main/java/expo/modules/location/LocationModule.java

时间会证明这是否是一个真正的修复,但我想我会与其他苦苦挣扎的开发者分享它。

Google 批准了我们的两个应用程序!他们批准了我们的 1 个应用程序,因为我们刚刚崩溃并告诉他们我们使用后台位置,即使我们没有。不是一个令人满意的答案!

另一个应用程序,我刚刚清除了构建文件夹并重新提交,他们接受了。所以这指向最后一个上传者的缓存作为问题的潜在根源。虽然我有一半希望 Google 在 2 周内关闭该应用程序,但我们拭目以待。

以下是我为不确定缓存是否是问题根源的开发人员清除缓存的所有注释:

清除项目中的缓存

rm android/build
rm ios/build
rm -rf android/.gradle
./gradlew clean

清除电脑内部缓存

rm -rf ~/.gradle/caches

其他 ios 个缓存(当你真的绝望时)

~/Library/Caches/CocoaPods
~/Library/Developer/Xcode/DerivedData/*
~/Library/Developer/Xcode/Archives/*

这当然让人想起那句古老的格言:

如有疑问 – 可能是缓存问题