【问题标题】:android react-native避免在Google批准过程中“未声明后台位置访问”
【发布时间】:2021-05-27 10:33:27
【问题描述】:

好的,所以 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) 你应该 不再看到应用程序下控制台中列出的位置声明 内容。如果您的目标是 Android 9 或更低版本(SDK 级别 28 或 较低):如果您已经在使用 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION,检查您的代码路径并将使用限制为 仅用于前台目的。 (了解更多: https://developer.android.com/training/location/background) 在你的 控制台声明,对问题“您的应用程序是否可以访问”选择“否” 定位于 Android 9 的 APK 或 app bundle 中的后台位置 还是更老?

【问题讨论】:

  • 这个问题你解决了吗?我有同样的情况。我找不到请求位置的功能,甚至删除所有广告 SDK 也无济于事。
  • 暂无解决方案,希望有人能帮助我们。更奇怪的是,这是一个白标应用程序,我们有同一个应用程序的多个版本——另一个版本刚刚被批准,没有问题。这个几乎是一样的。
  • 这里描述了同样的情况stackoverflow.com/questions/65976756/…
  • 是的,我遇到了那个.. 不幸的是,我们的问题已经持续了一段时间,并且没有任何修复的迹象..
  • 您解决问题了吗?我还是没有。

标签: android react-native react-native-android android-manifest android-permissions


【解决方案1】:

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

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/*

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

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

【讨论】:

  • 7 个月后,这个问题还没有出现,所以我会说这个问题确实是某种缓存问题。
【解决方案2】:

更新 5.21.2021: 哎呀,我们刚刚收到来自 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 记住了这一点,这就是为什么我猜它需要额外的步骤来获得批准?

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

【讨论】:

  • 如果我删除后台服务会起作用??
  • 如何删除以前被拒绝的版本?
  • 好吧,不——如果你不使用后台位置,这是一个解决方案,但谷歌坚持你是。当您上传新版本时,之前被拒绝的版本将被替换。
  • 只是注意到这个解决方案确实有效。无视!
【解决方案3】:

我不是通过像grep -r "ACCESS_BACKGROUND_LOCATION" . | cut -c1-150 那样从.js 中删除“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

【讨论】:

  • 干得好!这可能适用于那些使用 expo-location 的人。虽然我们没有在我们的项目中使用那个包,并且 ACCESS_BACKGROUND_LOCATION 出现在我们的 node_modules 文件夹中的任何 java 文件中。但不错的收获!
【解决方案4】:

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

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

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

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

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

【讨论】:

    【解决方案5】:

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

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

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

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

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

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

    【讨论】:

    • 刚看到这个 - 如果合并的清单检查器解决方案不起作用,我会试一试,谢谢!
    【解决方案6】:

    几周前我遇到了这个问题,真是痛苦!在我的情况下,我有一个依赖项需要后台位置而我没有注意到。其次,我在 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)。在那之后你应该会很好,你的应用应该会被及时批准。

    ✌️

    【讨论】:

    • 没有帮助我,合并清单不包含背景(和其他)位置权限,在应用程序包详细信息中我也没有看到此权限,但应用程序被拒绝。
    • @Anton 您还检查了 Play 商店中的权限声明?我的应用被拒绝了几次,因为我将其选中为“是”(也就是我的应用确实需要后台位置)。因此,即使捆绑包不再包含权限,谷歌机器人也不会允许它。
    • 是的,我勾选了“否”并多次尝试更新此页面。
    • 谢谢你,我试试看!
    • Google 刚刚下架了我们的应用,所以我尝试了您的解决方案。合并清单检查器真的很酷!不幸的是,因为我们在合并的清单中没有提及后台位置权限,所以我们无法使用它来解决问题!但无论如何,谢谢,这绝对是一种更清洁的调查方式..
    猜你喜欢
    • 2021-05-04
    • 2021-06-23
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多