android react-native在谷歌批准过程中避免“未声明后台位置访问” 1.找到邪恶的依赖2.检查 Google Play 声明可选

问题描述

好的,所以 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 .

我已经检查了责备报告以寻找线索,并在任何带有“背景”一词的情况下向后工作,但无济于事: 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 视频,阅读了官方文档,并检查了每个堆栈溢出帖子 - 但他们只是推荐我已经采取的步骤。

这是一个令人筋疲力尽的过程!我累极了。我最好的猜测是我们的依赖项是问题之一,但我没有很好的线索来确定它可能是哪一个

真的很感激一些新鲜的眼睛..也许有人用下面的这些包之一遇到过这种情况,并且会像,就是这样!删除它!

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

  "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"
  }

希望右眼能看到这一点,或者能指出一些东西..谢谢!

更新,从谷歌获得更多细节:

由于您的应用不需要后台位置,请请求 删除后台使用并达到合规性:

如果您的目标是 Android 10 或更高版本(SDK 级别 29 或更高): 从您的应用 APK 中删除 ACCESS_BACKGROUND_LOCATION 权限或 应用程序包。如果您使用 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION,检查您的代码路径并将使用限制为 仅用于前景。 (了解更多: https://developer.android.com/training/location/background) 你应该 不再看到 App 下控制台中列出的位置声明 内容。如果您的目标是 Android 9 或更早版本(SDK 级别 28 或 更低):如果您已经在使用 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION,检查您的代码路径并将使用限制为 仅用于前景。 (了解更多: https://developer.android.com/training/location/background) 在你的 控制台声明,对问题“您的应用程序是否访问 在面向 Android 9 的 APK 或 app bundle 中的后台位置 或更老?

解决方法

我不是像 .js 那样通过从 grep -r "ACCESS_BACKGROUND_LOCATION" . | cut -c1-150 中删除“ACCESS_BACKGROUND_LOCATION”来解决这个问题,而是通过从 .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/*

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

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

,

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

1.找到邪恶的依赖

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

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

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

2.检查 Google Play 声明(可选)

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

✌️

,

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

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

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

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

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

除了检查 Alpha 之外,Play 控制台上的 Beta 测试分支还可以确保之前的应用程序都不会存在于这些分支中。

,

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

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

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

就我而言,它是radar.io 库。

既然你检测到它是什么库,那可能是因为 react 的某个组件或者某个库需要从 gradle 中删除。

,

2021 年 21 月 21 日更新: 太好了,我们刚刚收到来自 google 的通知,我们的应用程序已被下架。所以下面的解决方案不起作用,我们只是陷入了混乱并认为它有效。

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

  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和不确定..然而这对我们有用。现在我希望它不再发生。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...