React Native iOS: проверка утечек памяти для уведомлений, как проверять уведомления при запуске приложения? - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу иметь возможность проверять, есть ли у пользователя разрешения на уведомления или нет, каждый раз, когда пользователь открывает приложение из какого-либо состояния (если приложение никогда не открывалось ранее или оно находилось в фоновом режиме и т. Д.)теперь проверяет разрешения через PushNotificationIOS.checkPermissions в функции рендеринга.Однако с этим методом он продолжает вызываться и вызывает утечку памяти.Другой метод, который я пробовал, был всякий раз, когда пользователь хочет получить уведомление (нажатием на значок), вызывается метод onPress для проверки разрешений, но при этом пользователь дважды нажимает на значок, чтобы обновить состояние разрешения.

import {
    PushNotificationIOS,
    AsyncStorage,
    ..
  } from "react-native";


export default class Bell extends React.Component {
  constructor(props) {
    super(props);  
    this.state = {
      isNotifActive: null,
      isBellActive: false,
      alertBody:"",
      fireDate: null,
      LaunchStatus: "",
      ID:'',
      timeSelected: ""
    };
    this.accessKeyNotif = `${this.props.fireDate}-isNotifActive`;

  }

  componentDidMount = () =>{
    this.setState({
        set props to state....
    });
    AsyncStorage.getItem(this.accessKeyNotif).then(value => this.setState({ isNotifActive: JSON.parse(value) }));

  }

  render() {
    PushNotificationIOS.checkPermissions((permissions) => {
      if (permissions.alert) {
        AsyncStorage.setItem(this.accessKeyNotif, JSON.stringify(true)).then(() => {
          this.setState({ isNotifActive: true});

        });
      }
      else{
        AsyncStorage.setItem(this.accessKeyNotif, JSON.stringify(false)).then(() => {
          this.setState({ isNotifActive: false});

        });
      }
    }); 

     return (
      <Ionicons
        name={this.state.isBellActive? "md-notifications":"md-notifications-off"}
        color={"white"}
        size={30}
        style={styles.NotifIcon}
        onPress={() => {
            if(this.state.isNotifActive){
             Make a notification
            }
            else if(!this.state.isNotifActive){
               Cancel Notifications
              }
            }}
        />

    );
  }  
}

Компонент Bell вызывается несколько раз (20 раз) другим классом для отображения звонка.

1 Ответ

0 голосов
/ 06 февраля 2019

Вы не должны выполнять эту проверку в методе render, поскольку каждый setState будет вызывать повторный рендеринг, что означает многократные ненужные повторные рендеринг.Было бы лучше справиться с этим, используя AppState слушатель.Следующий код будет вызывать _handleAppStateChange всякий раз, когда приложение выходит на передний план, переходит в фоновый режим.

Вы можете импортировать его из реактивного типа, например

import { AppState } from 'react-native'

Затем в свой компонент

state = {
  appState: AppState.currentState,  // set the currentState as the appState
};


componentDidMount () {
  // Set the listener
  AppState.addEventListener('change', this._handleAppStateChange);
}

componentWillUnmount () {
  // remove the listener
  AppState.removeEventListener('change', this._handleAppStateChange);
}

_handleAppStateChange = (nextAppState) => {
  if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
    // app has come to the foreground
    // perform checks etc here
  }
  // update the appState
  this.setState({ appState: nextAppState });
}

Подробнее об этом можно прочитать здесь https://facebook.github.io/react-native/docs/appstate

...