【问题标题】:Permissions.askAsync not working as expectedPermissions.askAsync 未按预期工作
【发布时间】:2020-05-15 17:10:07
【问题描述】:

我在使用 Permissions.askAsync 时遇到问题。

const status = await Permissions.askAsync(Permissions.NOTIFICATIONS)

当使用 Permissions.askAsync 通知状态为“未确定”时,我希望看到提示对话框告诉用户打开通知以继续。但是,当我使用 Permissions.getAsync 获得通知的状态时,如果它不是“授予”的,我会使用 Permissions.askAsync 但什么都没有发生(不显示通知对话框)

以下环境:

Target: iOS
Expo CLI 3.8.0 environment info:
System:
OS: macOS 10.14.6
Shell: 5.3 - /bin/zsh
Binaries:
Node: 12.13.1 - /usr/local/bin/node
npm: 6.12.1 - /usr/local/bin/npm
Watchman: 4.7.0 - /usr/local/bin/watchman
IDEs:
Android Studio: 3.4 AI-183.6156.11.34.5692245
Xcode: 11.2.1/11B500 - /usr/bin/xcodebuild
npmPackages:
expo: ^35.0.0 => 35.0.1
react: 16.11.0 => 16.11.0
react-native: https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz => 0.59.8
react-navigation: ^3.11.0 => 3.12.1
npmGlobalPackages:
expo-cli: 3.8.0

示例如下:

import * as Permissions from "expo-permissions"

componentDidMount(){
   this.checkPushNotificationState()
}

checkPushNotificationState = async () => {

  const { status: existingStatus } = await Permissions.getAsync(
    Permissions.NOTIFICATIONS
  )

  if (existingStatus !== "granted") {
    const status = await Permissions.askAsync(Permissions.NOTIFICATIONS)
    statusNotifications = status.status
  }
}

【问题讨论】:

  • 您之前是否未授予权限?即在要求时说不?我认为 ios 会记住这一点,除非您转到应用设置并明确启用它,否则不会再次允许该请求。
  • 是的,我一开始没有授予权限,之后想显示该对话框。不可能吗?在这种情况下,唯一的解决方案是用户手动允许来自 iPhone 设置的通知(“通知”并从那里允许它)?
  • 据我所知,这就是问题所在 - 我们的应用程序遇到了同样的问题。但我会得到纠正,也会做一些挖掘我的事情。
  • 是的,所以这里是世博论坛上关于它的对话:forums.expo.io/t/…。不确定它有多相关,因为最后一个答案是在 2018 年 5 月,但我所看到的并没有太多其他内容。
  • 谢谢解答,好像是这样。

标签: react-native push-notification permissions expo


【解决方案1】:

使用应用程序设置链接打开手动权限设置,因为如果用户拒绝权限,ios 不允许我们从提示中授予权限

Linking.openURL('app-settings:')

喜欢这个

import React, { Component } from "react";
import { Text, StyleSheet, View, Linking, Alert } from "react-native";
import * as Permissions from "expo-permissions";

export default class App extends Component {
  componentDidMount() {
    this.checkPushNotificationState();
  }

  checkPushNotificationState = async () => {
    let { status: existingStatus } = await Permissions.getAsync(
      Permissions.NOTIFICATIONS
    );

    if (existingStatus !== "granted") {
      const status = await Permissions.askAsync(Permissions.NOTIFICATIONS);
      existingStatus = status.status;
    }
    if (existingStatus !== "granted") {
      Alert.alert(
        "No Notification Permission",
        "please goto setting and on notification permission manual",
        [
          { text: "cancel", onPress: () => console.log("cancel") },
          { text: "Allow", onPress: () => Linking.openURL("app-settings:") },
        ],
        { cancelable: false }
      );
      return;
    }
  };

注意:您应该对The Right Way to Ask Users for Mobile Permissions 使用双重权限

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2014-10-31
    • 2018-02-12
    • 2014-01-20
    • 2015-01-13
    • 2013-08-01
    • 2019-04-13
    相关资源
    最近更新 更多