React Native - Play 商店警告“从 5 月 5 日开始,您必须让我们知道为啥您的应用需要广泛的存储访问权限”

Posted

技术标签:

【中文标题】React Native - Play 商店警告“从 5 月 5 日开始,您必须让我们知道为啥您的应用需要广泛的存储访问权限”【英文标题】:React Native - Play Store Warning "Starting May 5th you must let us know why your app requires broad storage access"React Native - Play 商店警告“从 5 月 5 日开始,您必须让我们知道为什么您的应用需要广泛的存储访问权限” 【发布时间】:2021-07-09 21:41:51 【问题描述】:

我有一个 React Native 应用程序在 Play 商店上架了一段时间,最近我收到了来自 Play 商店的重要通知,说明如果我不解决此问题,我的应用程序将从 Play 商店中删除。

谁能告诉我这是什么以及如何解决它?

这是来自 Play 商店的完整消息

我们检测到您的应用在清单文件中包含 requestLegacyExternalStorage 标志 1 或 更多您的 app bundle 或 APK。

在运行 android 11+ 的设备上拥有应用的开发者必须使用 Scoped 存储让用户更好地控制他们的设备存储。 要在 5 月 5 日之后在 Android 11 或更高版本上发布您的应用,您必须 要么:

更新您的应用以使用对隐私更友好的最佳做法,例如 存储访问框架或媒体存储 API 更新您的应用,在清单文件中声明所有文件访问权限 (MANAGE_EXTERNAL_STORAGE),并完成所有文件访问权限 5 月 5 日起在 Play 管理中心中声明 从您的应用中完全删除所有文件访问权限。

对于面向 Android 11 的应用, requestLegacyExternalStorage 标志将被忽略。您必须使用 保留广泛访问权限的所有文件访问权限。

请求访问所有文件访问权限的应用程序没有 允许的使用将从 Google Play 中删除,您将无法使用 发布更新。

我的 package.json


    "@react-native-async-storage/async-storage": "^1.13.4",
    "@react-native-community/masked-view": "^0.1.10",
    "@react-navigation/bottom-tabs": "^5.11.8",
    "@react-navigation/drawer": "^5.12.3",
    "@react-navigation/material-bottom-tabs": "^5.3.14",
    "@react-navigation/native": "^5.9.2",
    "@react-navigation/stack": "^5.14.2",
    "axios": "^0.21.1",
    "fuse.js": "^6.4.6",
    "react": "16.13.1",
    "react-native": "0.63.4",
    "react-native-device-info": "^8.0.1",
    "react-native-gesture-handler": "^1.10.0",
    "react-native-linear-gradient": "^2.5.6",
    "react-native-paper": "^4.7.1",
    "react-native-reanimated": "^1.13.2",
    "react-native-safe-area-context": "^3.1.9",
    "react-native-screens": "^2.17.1",
    "react-native-svg": "^12.1.0",
    "react-native-vector-icons": "^8.0.0"

和 manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.elevel.fromto">

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

    <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
      android:usesCleartextTraffic="true">
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
        android:launchMode="singleTask"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    </application>

</manifest>

App bundle explorer 下的 Play Console 中,我发现我的应用正在使用以下权限:

android.permission.INTERNET com.google.android.c2dm.permission.RECEIVE com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE

【问题讨论】:

也许你使用了一个使用 requestLegacyExternalStorage 的库,因为你的清单看起来不错 我不明白到底是哪个库导致了这个问题。我的猜测是异步存储社区版本,但它的清单看起来不错。我应该把requestLegacyExternalStorage 放在我的清单中 我的 React Native 应用程序从 Play 商店收到了相同的消息。我的清单还包含 android:requestLegacyExternalStorage="true"。 你能修复它吗? 我的假设是,在将目标 SDK 设置为 Android 11 后,此警告不会成为问题。然后,requestLegacyExternalStorage 不会对 Android 11+ 设备产生任何影响,但只会对 Android 10 设备产生影响,即一个allowed use-case by the Android team。将目标 SDK 设置为 Android 11 后,您需要确保您的插件继续按预期工作(这些应该是保存/加载任何类型文件的插件)。 【参考方案1】:

我发现,如果我们的目标是 Android API 29,我们不必担心警告,只需在应用的清单文件中设置 requestLegacyExternalStorage=true

虽然我们必须在 11 月之前升级到 Android API 30。

【讨论】:

你在哪里将 legacy 标志设置为 true? 没错,这没什么好担心的。即使您的目标是 30,requestLegacyExternalStorage=true 也会被忽略...【参考方案2】:

我的理解是,即使针对 Android 11,我们也应该能够使用此选项解决问题:

更新您的应用以在清单文件中声明所有文件访问权限 (MANAGE_EXTERNAL_STORAGE),并从 5 月 5 日起在 Play 管理中心完成所有文件访问权限声明

我认为这是解决 android:requestLegacyExternalStorage="true" 在 Android 11 上将被忽略这一事实的方法。虽然我不确定如何在 Play Console 中声明所有文件访问权限。应该有某种形式,您应该指定您的应用需要此权限的原因。任何人都可以看到这个表格在哪里?

【讨论】:

我真的不需要访问外部存储,有什么方法可以在清单中指定吗?【参考方案3】:

不是修复,但Reddit 上有一个帖子,您可能有兴趣阅读。有报告称有人收到此消息,即使他们没有启用requestLegacyExternalStorage 标志。

【讨论】:

【参考方案4】:

可能是您正在使用一些调用 MANAGE_EXTERNAL_STORAGE 的 RN 依赖项

示例 路径示例 -> /MyProject/node_modules/rn-fetch-blob/android/src/main/AndroidManifest.xml

<!-- Required to read and write the expansion files on shared storage -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

即使我没有使用它,我也安装了这个依赖 RNFetchBlob rn-fetch-blob,因此您可能需要寻找使用 WRITE_EXTERNAL_STORAGE 或 android:requestLegacyExternalStorage="true" 的外部依赖

【讨论】:

我在 react-native/ReactAndroid/androidTest/AndroidManifest.xml 和 react-native/ReactAndroid/androidTest/buck-runner/AndroidManifest.xml 下的 node-modules 文件夹中找到了&lt;!-- needed for screenshot tests --&gt; &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;【参考方案5】:

我从位于以下位置的日志中发现了导致合并的AndroidManifest.xml 包含android:requestLegacyExternalStorage 的原因:

./android/app/build/outputs/logs/manifest-...-report.txt

只需在文件中找到requestLegacyExternalStorage

【讨论】:

在我的 manifest-merger-release-report.txt 我没有找到任何requestLegacyExternalStorage 的实例。同样在 App Bundle explorer 部分下的 Play Console 中,我发现我的应用正在使用以下权限 android.permission.INTERNETcom.google.android.c2dm.permission.RECEIVEcom.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE

以上是关于React Native - Play 商店警告“从 5 月 5 日开始,您必须让我们知道为啥您的应用需要广泛的存储访问权限”的主要内容,如果未能解决你的问题,请参考以下文章

在 Play 商店更新 React Native 应用程序时,仍然显示卸载和打开选项。不显示更新选项

由于 READ_SMS 权限 + React Native,Android 构建在 Play 商店中被拒绝

来自 Google Play 商店的 Android React Native App HostNameVerifier 错误

来自 Google Play for My React Native 应用程序的呼叫/短信许可最终警告电子邮件

React Native App Play Store JavascriptException

ITMS-90809:使用 react-native-html-to-pdf 时已弃用 API 使用警告