React Native PushNotificationIOS
ã¢ãžã¥ãŒã«ã«ã¯getInitialNotification()
ã¡ãœããããããã¢ããªãéãããã«ã¿ãããããéç¥ããã§ããã§ããŸãïŒååšããå ŽåïŒã ãã®ã©ã€ãã©ãªã«åæ§ã®æ©èœã¯ãããŸããïŒ
ã¢ããªãéããŠãããšãã«ããã€ã¹ã«ãã¹ãéç¥ãéä¿¡ãããšãã³ã³ãœãŒã«ãéãããšãã«ã³ã³ãœãŒã«ã«Device info:
ãã°ã衚瀺ãããŸããããéç¥ãåä¿¡ããããã®ä»ã®ã€ãã³ããã°ã¯è¡šç€ºãããŸããã§ããã
ç·šé3ïŒ
äœããã®çç±ã§ãæåã®éç¥ã®onOpened
ã€ãã³ãã衚瀺ã§ããªããªããŸããããã³ãŒãã«äœãå€æŽã¯ãããŸããã
ç·šé2ïŒ
ãªã¹ããŒã移åããããšã§ã onOpened
ã€ãã³ãã®ãã°ã確èªã§ããŸããããããã·ããªã¹ããŒã§ãããšããããšã¯ãã¢ããªãéç¥ã§éããããã©ãããèµ·åæã«ã¢ã¯ãã£ãã«ç¢ºèªã§ããªãããšãæå³ããŸãããã®ã€ãã³ããçºçãããã©ããã確èªããããã«ãä»»æã®æéåŸ
ã€å¿
èŠããããŸããïŒ ã¢ããªãããã·ã¥éç¥ã§éããããã©ãããç©æ¥µçã«ç¢ºèªããæ¹æ³ã¯ãããŸãããïŒ
ç·šéïŒ
OneSignal.configure()
ãšonNotificationOpened
ã䜿çšããŠåç
§ããŠããèšäºãèŠã€ããŸãããããœãŒã¹ã³ãŒããèŠããšã OneSignal.configure()
ããã©ã¡ãŒã¿ãŒãåãå
¥ããŠããªãããã§ãã
ç§ãåãåé¡ãæ±ããŠããŸãããä»ã®å€ãã®äººããã®åé¡ãæ±ããŠããããã§ãã ç§ãèŠã€ããããã€ãã®é¢é£ãã/éè€ããåé¡ã«ã¯ã https ïŒ//github.com/geektimecoil/react-native-onesignal/issues/206ãhttpsïŒ//github.com/geektimecoil/react-native-onesignal/issues/195 ã https://github.com/geektimecoil/react-native-onesignal/issues/191ãhttps://github.com/geektimecoil/react-native-onesignal/issues/336ãhttps://github.com/geektimecoil/ _ _ react-native-onesignal / issues / 334 ã httpsïŒ //github.com/geektimecoil/react-native-onesignal/issues/264ãhttpsïŒ//github.com/geektimecoil/react-native-onesignal/issues/279ã
ãããã®åé¡ã¯ãã¹ãŠãããã·ã¥éç¥ãã¿ããããŠã¢ããªãéãããã®æç¹ã§ã¢ããªãå®è¡ãããŠããªããšãã«opened
ã€ãã³ããªã¹ããŒãåŒã³åºãããªããšãããã®åé¡ã«é¢é£ããŠããããã§ãã ç§ããããã®åé¡ã§èªãã ããšãšç§ãè¡ã£ããã¹ãããããã®åé¡ã®åå ã¯ã€ãã³ããªã¹ããŒã®ç»é²ãäœããã®åœ¢ã§é
ããŠããããšã§ããããã§ãïŒã€ãŸãã OneSignal.addEventListener('opened', this.onOpened);
ã¯ã¢ããªèªäœãèªã¿èŸŒãŸããŸãïŒã ããã¯ãReactã³ã³ããŒãã³ãå
ïŒããšãã°ã constructor
ãŸãã¯componentWillMount
ãŸãã¯componentDidMount
é¢æ°å
ïŒã«ãã®ã³ãŒããããããæ§æ/åæ°ŽåãããŸã§åŒã³åºãããªãããšãåå ã§ããå¯èœæ§ããããŸããããŠããã®é
延ã®ããã«ãã€ãã³ãèªäœïŒéç¥ãéãããããšïŒã¯ãã€ãã³ããªã¹ããŒãç»é²ãããåã«react-native-onesignalã«ãã£ãŠçºçããŸãããã®æç¹ã§ãã€ãã³ããèŠéããŠããŸããŸããããããèµ·ãã£ãããšãç¥ãæ¹æ³ã¯ãããŸããã è£è¶³ãšããŠããã®åãåé¡ã¯ä»ã®ã€ãã³ããªã¹ããŒãããšãã°ids
ã€ãã³ããªã¹ããŒã«åœ±é¿ããŸãã
ãã®ã³ãŒããã§ããã ãæ©ãçºçããããã«ç§»åãããšãã€ãã³ããçºçããåã«ã€ãã³ããªã¹ããŒãç»é²ãããã€ãã³ããã³ãã©ãŒé¢æ°ãåŒã³åºãããããã«èŠããŸãã ããšãã°ãã€ãã³ããªã¹ããŒç»é²ã³ãŒããindex.ios.js
ãã¡ã€ã«ã«ç§»åãããã index.ios.js
ãã¡ã€ã«ãåã«ã€ã³ããŒãããŠããå Žåã¯App.js
ãã¡ã€ã«ã®å
é ã«ç§»åããå¿
èŠããããŸãã App
ã³ã³ããŒãã³ããšãããç»é²ããŸãïŒ AppRegistry.registerComponent
ãä»ããŠïŒã
ãããèšå®ãããšãéç¥ãéãããã€ãã³ããšãã®åŠçæ¹æ³ããã£ããã£ã§ããããã«ãªããŸããããã¯ãã¢ããªã®èšå®æ¹æ³ïŒäœ¿çšããŠãããã©ãããªã©ïŒã«ãã£ãŠç°ãªããŸãã ReduxããŸãã¯redux-persistãªã©ã䜿çšããŠãããã©ããïŒã
ç§ã®çŸåšã®è§£æ±ºçã¯ã App.js
ãã¡ã€ã«èªäœã®ãããã¬ãã«ã§å®çŸ©ãããå€æ°ã«éç¥ãä¿åãïŒ App
ã³ã³ããŒãã³ãã宣èšããåã«ïŒãåæåãå®äºãããReduxã¹ãã¢ïŒredux-persistã«ããã¹ãã¢ã®åæ°Žåã®åŸ
æ©ãå«ãïŒããã€ããŒããšããŠã®éç¥ã䜿çšããŠã¢ã¯ã·ã§ã³ããã£ã¹ããããïŒéç¥ãéãããå ŽåïŒããããã¬ãã«ã®ã€ãã³ããªã¹ããŒãåé€ããŠæ°ããã€ãã³ããè¿œå ããŸãApp
ã³ã³ããŒãã³ãèªäœã®ãªã¹ããŒïŒãããã®ã€ãã³ããªã¹ããŒã¯ãã¢ã¯ã·ã§ã³ãã€ããŒããšããŠéç¥ãããã€ã¹IDãªã©ã䜿çšããŠã¢ã¯ã·ã§ã³ãReduxã¹ãã¢ã«ãã£ã¹ãããããã ãã§ãïŒã
ãã®ãœãªã¥ãŒã·ã§ã³ã¯æããã«éåžžã«ããããŒã§ããããããããããæ³å®ã©ããã«æ©èœããªããšããžã±ãŒã¹ãããã€ããããŸãã ããããreact-native-onesignalã«é©åãªãœãªã¥ãŒã·ã§ã³ãå®è£ ããããŸã§ãããã¯é©åãªåé¿çã®ããã§ãã
çºçããå¿
èŠãããã®ã¯ãreact-native-onesignalãæŽæ°ããŠãã€ãã³ããã³ãã©ãŒãèšå®ãããŸã§åŸ
æ©ããŠãããã€ãã³ããçºçãããããšã ãšæããŸãã èãããã解決çã®1ã€ã¯ãã€ãã³ãïŒ opened
ã€ãã³ããªã©ïŒãçºçãããšãã€ãã³ãããã¥ãŒã«å
¥ããããreact-native-onesignalã察å¿ããã€ãã³ããªã¹ããŒãçŸåšç»é²ãããŠãããã©ããã確èªããããšã§ãã ååšããªãå Žåã¯ãã€ãã³ãããã¥ãŒã«æ®ããŸãã 次ã«ãã€ãã³ããªã¹ããŒãç»é²ããããšããã«ããã®ã€ãã³ããªã¹ããŒã«ãã£ãŠåä¿¡ãããã€ãã³ããçºçãããã¥ãŒããåé€ãããŸãã ããããã°ããã€ã§ãã¢ããªã«ã€ãã³ããªã¹ããŒãè¿œå ã§ããŸãïŒããšãã°ãReduxã¹ãã¢ãæ§æãããŠåæ°Žåãããã®ãåŸ
ã£ãåŸãã¢ããªèªäœãèªã¿èŸŒãŸããŠãã1ã2ç§åŸã«ãªãå¯èœæ§ããããŸãïŒãã€ãã³ããªã¹ããŒãç»é²ããããšãã€ãã³ããã³ãã©ãŒé¢æ°ãåŒã³åºãããçºçããã€ãã³ãïŒéç¥ãéãããã€ãã³ããªã©ïŒãåä¿¡ããŸãã
å°ãªããšããŠãŒã¶ãŒãããã·ã¥éç¥ãã¿ããããããã«ã¢ããªãéãããããšãå
·äœçã«æ€åºããããã®å¥ã®å¯èœãªè§£æ±ºçã¯ãææ¡ããããã«PushNotificationIOS
getInitialNotification()
ãšåæ§ã®ããšãè¡ãããšã§ãããã®é¢æ°ããã€ã§ãåŒã³åºããšããŠãŒã¶ãŒãã¢ããªãéãããã«ã¿ãããããšããããã·ã¥éç¥ãè¿ãããŸãïŒãããçºçããªãã£ãå Žåã¯null
ïŒã ãããããããreact-native-onesignalã§å®è£
ããããšããŠããä»ã®ã€ãã³ããªã¹ããŒïŒ ids
ã€ãã³ããªã¹ããŒãªã©ïŒã«åœ±é¿ãäžãããã®åé¡ã解決ããããã«äœãããŸããã
ãããã£ãŠã察å¿ããã€ãã³ããªã¹ããŒãç»é²ãããåã«ã€ãã³ããçºçããã¢ããªãã€ãã³ããèŠéããŠããŸããšãããã®ã³ã¢ã®åé¡ã«å¯ŸåŠãããœãªã¥ãŒã·ã§ã³ãæ¬åœã«å¿ èŠã ãšæããŸãã
ããã«ã¡ã¯@jordanmkoncz ãã¢ã¯ã·ã§ã³ããã£ã¹ããããããã¡ã€ã«ã®ã³ãŒããå ±æã§ããŸããïŒ ç§ã¯ããªããšåãreact-nativeã»ããã¢ãããæã£ãŠããŸãïŒredux-persistãªã©ïŒ
@ccoeder確ãã«ããããç§ã®çŸåšã®App.js
ãã¡ã€ã«ã§ãã
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import OneSignal from 'react-native-onesignal';
import isNil from 'lodash/isNil';
import configureStore from '../redux/configureStore';
import {
pushNotificationIdsReceived,
pushNotificationOpened,
pushNotificationReceived,
pushNotificationRegistered,
} from '../redux/actionCreators';
import AppNavigator from './AppNavigator';
import Blank from './Blank';
let openedPushNotificationResult = null;
let receivedPushNotification = null;
let receivedNotificationUserInfo = null;
let receivedIds = null;
const onOpened = openResult => {
openedPushNotificationResult = openResult;
};
const onReceived = notification => {
receivedPushNotification = notification;
};
const onRegistered = notificationUserInfo => {
receivedNotificationUserInfo = notificationUserInfo;
};
const onIds = ids => {
receivedIds = ids;
};
OneSignal.addEventListener('opened', onOpened);
OneSignal.addEventListener('received', onReceived);
OneSignal.addEventListener('registered', onRegistered);
OneSignal.addEventListener('ids', onIds);
class App extends Component {
constructor() {
super();
this.state = {
isStoreInitialised: false,
};
this.store = null;
this.onOpened = this.onOpened.bind(this);
this.onReceived = this.onReceived.bind(this);
this.onRegistered = this.onRegistered.bind(this);
this.onIds = this.onIds.bind(this);
}
componentDidMount() {
this.store = configureStore(store => {
if (!isNil(openedPushNotificationResult)) {
store.dispatch(pushNotificationOpened(openedPushNotificationResult));
}
if (!isNil(receivedPushNotification)) {
store.dispatch(pushNotificationReceived(receivedPushNotification));
}
if (!isNil(receivedNotificationUserInfo)) {
store.dispatch(pushNotificationRegistered(receivedNotificationUserInfo));
}
if (!isNil(receivedIds)) {
store.dispatch(pushNotificationIdsReceived(receivedIds));
}
OneSignal.addEventListener('opened', this.onOpened);
OneSignal.addEventListener('received', this.onReceived);
OneSignal.addEventListener('registered', this.onRegistered);
OneSignal.addEventListener('ids', this.onIds);
OneSignal.removeEventListener('opened', onOpened);
OneSignal.removeEventListener('received', onReceived);
OneSignal.removeEventListener('registered', onRegistered);
OneSignal.removeEventListener('ids', onIds);
this.setState({ isStoreInitialised: true });
});
}
componentWillUnmount() {
OneSignal.removeEventListener('opened', this.onOpened);
OneSignal.removeEventListener('received', this.onReceived);
OneSignal.removeEventListener('registered', this.onRegistered);
OneSignal.removeEventListener('ids', this.onIds);
OneSignal.removeEventListener('opened', onOpened);
OneSignal.removeEventListener('received', onReceived);
OneSignal.removeEventListener('registered', onRegistered);
OneSignal.removeEventListener('ids', onIds);
}
onOpened(openResult) {
this.store.dispatch(pushNotificationOpened(openResult));
}
onReceived(notification) {
this.store.dispatch(pushNotificationReceived(notification));
}
onRegistered(notificationUserInfo) {
this.store.dispatch(pushNotificationRegistered(notificationUserInfo));
}
onIds(ids) {
this.store.dispatch(pushNotificationIdsReceived(ids));
}
render() {
if (!this.state.isStoreInitialised) {
return <Blank />;
}
return (
<Provider store={this.store}>
<AppNavigator />
</Provider>
);
}
}
export default App;
æ³šïŒ configureStore
ã¯ãReduxã¹ãã¢ãäœæãïŒã€ãŸãã createStore()
ãåŒã³åºãïŒã次ã«redux-persistãèšå®ããïŒã€ãŸãã persistStore()
ãåŒã³åºãïŒé¢æ°ã§ãã configureStore
ã¯ãã©ã¡ãŒã¿ãŒãšããŠã³ãŒã«ããã¯é¢æ°ãåãã persistStore
é¢æ°ã®onComplete
ã³ãŒã«ããã¯ã§ã$ configureStore
ã«æž¡ãããã³ãŒã«ããã¯é¢æ°ãåŒã³åºããŠã¹ãã¢ãæž¡ããŸããã®ã³ãŒã«ããã¯ãžã®ãã©ã¡ãŒã¿ãšããŠã®ãªããžã§ã¯ãã æåŸã«ã configureStore
ã¯ã¹ãã¢ãªããžã§ã¯ããè¿ããŸãã
ã€ãŸããåºæ¬çã«ã¯ãã¹ãã¢ãã»ããã¢ãããããŠåæ°ŽåããããŸã§åŸ ã£ãŠãããæåã®ã€ãã³ããªã¹ããŒãåä¿¡ããã€ãã³ãã«åºã¥ããŠã¢ã¯ã·ã§ã³ããã£ã¹ãããããæ°ããã€ãã³ããªã¹ããŒãè¿œå ããŠãæåã®ã€ãã³ããªã¹ããŒãåé€ããŸãã
@jordanmkonczã³ãŒããå ±æããŠããã ãããããšãããããŸãã æåã¯ããªããšåããšã©ãŒã ãšæã£ãŠããŸããããç§ã®åé¡ã¯ãµã€ã¬ã³ãéç¥ã«é¢é£ããŠããããšã«æ°ã¥ããŸããã ã¢ããªã±ãŒã·ã§ã³ãéããŠããéã«éç¥ãå±ããå Žåã¯ã察åŠããå¿ èŠããããŸãã ããªãã®ã³ãŒãã¯ç§ã«ã¯å¹ããªããšæããŸãã
@ccoederã®å¿é ã¯ãããŸããã ãããã¢ããªãéããŠããéã«éç¥ã«å¯ŸããŠå®éã«ã¢ã¯ã·ã§ã³ãå®è¡ãããšããåé¡ã¯å¥ã®åé¡ã§ãã ãã®åé¡ã¯ãç¹ã«ãã¢ããªã®èµ·åæã«ïŒä»¥åã¯ãŸã£ããå®è¡ãããŠããªãã£ããšãã«ïŒããŠãŒã¶ãŒãã¢ããªãéãããã®éç¥ãã¿ããããããšãã¢ããªã§æ€åºããããšã«é¢é£ããŠããŸãã
react-native-fcmãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸããããgetInitialNotificationãšããã¡ãœããããããŸã
@jordanmkonczæçš¿ããããšãããããŸãã
ç§ãåæ§ã®åé¡ãæ±ããŠããŸãããã¢ããªãããã·ã¥éç¥ãåä¿¡ãããšãç»é¢ã¯ç®çã®ç»é¢ã«ç§»åããŸãã
ãã ããéç¥ãéããšãããã²ãŒã·ã§ã³ããã·ã¥æ©èœã§ã¯æ©èœããŸããã
äŸïŒ
componentWillMountïŒïŒ{
OneSignal.addEventListenerïŒ 'received'ãthis._onReceivedïŒ;
OneSignal.addEventListenerïŒ 'opened'ãthis._onOpenedïŒ;
}
componentWillUnmountïŒïŒ{
OneSignal.removeEventListenerïŒ 'received'ãthis .__ onReceivedïŒ;
OneSignal.removeEventListenerïŒ 'opened'ãthis._onOpenedïŒ;
}
_onReceviedïŒnotificationïŒ{
console.logïŒ 'åä¿¡ããéç¥ïŒ'ãéç¥ïŒ; //ããŸãæ©èœããŠãã
this.props.navigator.pushïŒ{pushSreenãpassPropsïŒ{params}}ïŒ; //ããŸãæ©èœããŠãã
}
_onOpenedïŒopenResultïŒ{
console.logïŒ 'éç¥æ¬æïŒ'ãopenResult.notification.payload.bodyïŒ; //ããŸãæ©èœããŠãã
this.props.navigator.pushïŒ{pushSreenãpassPropsïŒ{params}}ïŒ; //æ©èœããªã
}
ããªãã¯ãã®ããšã«ã€ããŠã©ãæããŸããïŒããªããç§ãå©ããããšãã§ãããªãã°ãããã«è¿ä¿¡ããŠãã ãããããããšã
ããŒã.. PushNotificationHelper
ã³ã³ããŒãã³ããRedux Provider
ã®åãšããŠæã£ãŠããŸããããã¯ã store
ãåæ°ŽåãããåŸã«ã®ã¿ã¬ã³ããªã³ã°ãããŸãã
componentWillMount() {
AppState.addEventListener("change", this.handleAppStateChange);
OneSignal.configure({
onNotificationOpened: this.handleOpenNotification
});
OneSignal.addEventListener("received", this.onReceived);
OneSignal.addEventListener("opened", this.onOpened);
OneSignal.addEventListener("registered", this.onRegistered);
OneSignal.addEventListener("ids", this.onIds);
if (!IOS) {
OneSignal.inFocusDisplaying(0);
}
}
componentWillUnmount() {
AppState.removeEventListener("change", this.handleAppStateChange);
OneSignal.removeEventListener("received", this.onReceived);
OneSignal.removeEventListener("opened", this.onOpened);
OneSignal.removeEventListener("registered", this.onRegistered);
OneSignal.removeEventListener("ids", this.onIds);
}
handleOpenNotification = (message, data, isActive) => {
console.log("Notification", message, data, isActive);
if (isActive) {
// touchable banner displaying info from push notification
} else {
// act on data received from push notification
}
};
onReceived = notification => {
console.log("Notification received: ", notification);
};
onOpened = openResult => {
console.log("Message: ", openResult.notification.payload.body);
console.log("Data: ", openResult.notification.payload.additionalData);
console.log("isActive: ", openResult.notification.isAppInFocus);
console.log("openResult: ", openResult);
};
ã¢ããªãéããŠããŠãïŒ background
AppStateã§ã¯ãªããå®å
šã«éããŠããïŒãããã·ã¥éç¥ãã¿ãããããšã onOpened
ã¡ãœãããopenResult
ã§åŒã³åºãããŸãããªããžã§ã¯ããšé¢é£ããŒã¿ããããŠç§ã¯é©åã«dispatch
reduxã¢ã¯ã·ã§ã³ãèªç±ã«è¡ãããšãã§ããŸãã
@wkoutreèå³æ·±ãã§ãããçŸåšäœ¿çšããŠããreact-native
ã react-native-onesignal
ãªã©ã®ããŒãžã§ã³ãæçš¿ããŠããã ããŸããïŒ iOSãšAndroidã®äž¡æ¹ã§ããããã¹ãããŸãããïŒ ããã·ã¥éç¥ãã¿ããããŠã¢ããªãéããšããåºç¯ãªãã¹ããè¡ããŸãããããã·ã¥éç¥ãã¿ãããããæç¹ã§ã¢ããªã¯å®å
šã«éããããŠããã onOpened
ã¡ãœããã100ïŒ
åŒã³åºãããŠããããšãããããŸãããïŒ
PushNotificationHelper
ã®èªã¿èŸŒã¿ã人çºçã«ããã«é
ãããå Žåãããšãã°5ç§ã®ãããªé
延ã§setTimeoutãèšå®ããå Žåãããã100ïŒ
ã®æéã§æ©èœãããã©ããã確èªããããã«ãããã€ãã®ãã¹ããè¡ãããšãã§ããŸããïŒ PushNotificationHelper
ãããŠã³ãã§ããããã«ç¶æ
ãå€æŽãããã®ã€ãã³ããªã¹ããŒãOneSignalã«ç»é²ããŸããïŒ
@jordanmkoncz
"react-native": "0.50.4"
"react-native-onesignal": "^3.0.7"
ã¯ããiOSãšAndroidã®äž¡æ¹ã§ãã¹ãããŸããã äž¡æ¹ã§ã100ïŒ ã®æéïŒ
onOpened
ã¯ããã·ã¥éç¥ããã®ããŒã¿ã§åŒã³åºããã openResult.notification.isAppInFocus === false
setTimeout
ãå®è¡ããŠãè¿ä¿¡ããŸãã
ç·šé1ïŒç§ã¯ãŸã£ããäœãå€æŽããŸããã§ããããAndroidã§ã¯100ïŒ å€±æããŸãã
EDIT2ïŒ setTimeout
ã®é
延ãå®è¡ãããšãããã·ã¥éç¥ãã¿ããããããšã«ããã¢ããªã®èªã¿èŸŒã¿æã«onOpened
ãèµ·åããªããªããŸããã ãã ãããã¹ãŠãApp.js
ã®ã©ã€ããµã€ã¯ã«ã¡ãœããã«ç§»åããŸãããã«ãŒãã³ã³ããŒãã³ãã¯index.ios.js
ãšindex.android.js
ã«ç»é²ãããŠããã onOpened
ã¯100ïŒ
ãšåŒã°ããŸãã iOSã®å ŽåãAndroidã®å Žåã¯çŽ50ïŒ
ã§ãã
Androidã«äžè²«æ§ããªãçç±ã¯ããããŸããããæããã«åé¡ã§ãã Androidã§ã¯ãã¢ããªãå®å
šã«éããããŠéç¥ãå±ããšããããã¬ãŒãã¯ãªã¢ãããã¯ã©ã¹èªäœãäœæãããŸã§App.js
ã®ãã¹ãŠãèªã¿èŸŒãŸããŸãã
const IOSX = HEIGHT === 812 && PLATFORM === "ios";
const wrapperStyle = [Styles.flex1];
if (IOSX) wrapperStyle.push(Styles.backgroundDarkGray);
let SPLASH_TIME;
console.log(`Change to TRUE below to reset store state`);
const PURGE = DEV ? false : false;
if (DEV) SPLASH_TIME = 4000;
else SPLASH_TIME = 4000;
// const composeEnhancers = composeWithDevTools({
// realtime: true,
// port: 8000
// });
const composeEnhancers =
typeof window === "object" &&
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
DEV
? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
// Specify extensionâs options like name, actionsBlacklist, actionsCreators, serialize...
})
: compose;
const middlewares = [ReduxThunk];
// debugging tooling
// if (DEV) {
// // add logger
// middlewares.push(logger)
// // middlewares = [...middlewares, logger];
// middlewares = [...middlewares];
// replace these transient reducers when they've been created
export const store = createStore(
Reducers,
{},
composeEnhancers(
applyAppStateListener(),
applyMiddleware(...middlewares),
autoRehydrate()
)
);
// if (module.hot) {
// // Enable hot module replacement for reducers
// module.hot.accept(() => {
// const nextRootReducer = require("./reducers/index").default;
// store.replaceReducer(nextRootReducer);
// });
// }
console.log(`right before APP`);
// Debugger logs everything before this line.
export default class App extends Component {
...
}
@jordanmkonczãã®ã©ã€ãã©ãªãè©Šããããšããããã©ããèå³ããããŸãïŒ https ïŒ//github.com/wix/react-native-notifications
äºè§£ããŸãããiOSãšAndroidã®äž¡æ¹ã§100ïŒ åäœããåé¿çããããŸãã
App.js
ã«ãããŸãããã¢ããªã³ã³ããŒãã³ãã宣èšããåã«ã次ã®ããã«ãªã£ãŠããŸãã
const handleOnOpened = openResult => {
store.dispatch(setInitialNotification(openResult));
};
OneSignal.configure({});
OneSignal.addEventListener("opened", handleOnOpened);
...ããã§ã setInitialNotification
ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ãã
次ã«ãïŒçŸåšããŠã³ããããŠããïŒã¢ããªã®æ°Žåè£çµŠãçµäºãããã次ã®ããã«åŒã³åºããŸãã
this.setState({ rehydrated: true }, () => {
OneSignal.removeEventListener("opened", handleOnOpened);
});
ç§ã®ã¢ããªïŒredux Provider
ã§ã©ãããããŠããïŒã¯render
ã¡ãœããã§è¿ããã次ã®ããã«ãªããŸã...
<Provider store={store}>
<IphoneXAwareView style={wrapperStyle}>
<StatusBar hidden={false} barStyle="light-content" />
<MyAlert />
<Loading />
<ConnectedAppWithNavigationState />
<PushNotificationHelper />
</IphoneXAwareView>
</Provider>
ããããã PushNotificationHelper
ã³ã³ããŒãã³ãã¯ããã¹ãŠã®ããã·ã¥éç¥ã®ãªãã¹ã³ãšåŠçãåŠçããŸãã
@bhoopæ°ãæçµã¡ãŸããã®ã§ããŸã ä¿®æ£ãæ¢ããŠãããã©ããã¯ããããŸããã...ãããããªãããããè©ŠããŠã¿ãŠãã ããã
@wkoutreãã®reduxã®åé¿çãå«ãReadmeãã¡ã€ã«ã®æŽæ°ãå«ãPRãèšå®ã§ããŸããïŒ
@avishayilãã¡ããã§ããä»æ©ãŸã§ã«å°çããŸã
avishayilPRãäœæãããŸããã
ç§ã¯ãã®ããã«èãããåé¡ã«çŽé¢ããŠããŸãã ã¢ããªãéããšãã¢ããªãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããå Žåã§ãããã¹ãŠã®ã³ãŒã«ããã¯ãæ£åžžã«å®è¡ãããŸãã ããããããã·ã¥ãåä¿¡ãããšãã¢ããªã¢ã€ã³ã³ã+1å¢å ããã·ã¹ãã ã¯éç¥ã³ã³ãã³ããå«ããããŒã衚瀺ããŸããããããŒãç¡èŠããŠïŒéç¥ãããŒã§ã¯ãªãïŒã¢ã€ã³ã³ã§ã¢ããªãéããšãã³ãŒã«ããã¯ã¯ç¡èŠãããŸã= [how to察å¿ãã ïŒ
@brunoandradebrããã¯äºæ³ãããåäœã§ãã ã¢ããªã¢ã€ã³ã³ããã¢ããªãéããšãåä¿¡ããå¯èœæ§ã®ããéç¥ãèæ ®ãããŸããã ã¢ããªãéãã ãã§ãã
ãŠãŒã¶ãŒãéç¥ãåä¿¡ãããã©ããã«åºã¥ããŠã¢ããªã®èµ·åæã®åäœãå€æŽããå Žåã¯ãèµ·åæã«èªåã§ç¢ºèªããå¿ èŠããããŸãã
ããã¯çå®ã§ã¯ãªãã ã¢ããªãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠãããšãã«ã¢ã€ã³ã³ã§ã¢ããªãéããšãå¿ èŠã«å¿ããŠããã·ã¥éç¥ãåŠçãããŸãã ã¡ã¢ãªããåé€ïŒã¹ã¯ã€ãïŒããŠããã¢ã€ã³ã³ã§éããšãäœãèµ·ãããŸããã 調æ»äžã§ãããXCodeãã¢ããªãåæ¢ããoonesignallibãªã³ã¯ãéããŠãããšæããŸãã
@brunoandradebrç§ã¯ããªããæ±ããŠããåé¡ãšãããªããåç
§ããŠããã³ãŒã«ããã¯ã誀解ããŠãããããããŸããã
ã¢ããªãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããå Žåã received
ã€ãã³ããåŠçã§ããŸãã ãã ããã¢ããªã匷å¶çµäºããããšãã€ãã³ãããªãã¹ã³ã§ããªããªããŸãã éç¥ãã¢ããªãšå¯Ÿè©±ã§ããå¯äžã®æ¹æ³ïŒå°ãªããšãiOSã®å ŽåïŒã¯ãäœããã®æ¹æ³ã§éç¥ãšå¯Ÿè©±ããããšã§ãã
ã¢ããªã匷å¶çµäºããŠéç¥ãåãåã£ããšãã«ãã¢ã€ã³ã³ã§ã¢ããªãéããšãã¢ããªã¯ã³ãŒã«ããã¯ã€ãã³ããåŠçã§ããŸããããã¢ããªãããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠããå Žåãã¢ã€ã³ã³ã§éããšãæåŸ ã©ããã«ã³ãŒã«ããã¯ãçºçããŸãã ãšã£ã ïŒ
@brunoandradebrç§ã¯ãããç解ãããšæããŸãããããŠç§ãééã£ãŠããªããã°ãããã¯ç§ã®åã®ã³ã¡ã³ãã§èª¬æããæ¯ãèãã§ãã ãããã«ãããããã¯è©±é¡ããå€ããŠãããšæããŸããããã«åé¡ããããšæãããå Žåã¯ãã¬ãã§å¥ã®åé¡ãéãå¿ èŠããããŸãã
@jordanmkonczããªãã¯ReactNativeOneSignalã®åé¡ãæ¬åœã«ããç解ããŠããããã§ãã ç§ã䜿çšããŠããããŒãžã§ã³ã¯ãreact-native-onesignalïŒ^ 3.2.8ããã³react-nativeïŒ0.56.0ã§ãã ããã¯ã°ã©ãŠã³ããšãã©ã¢ã°ã©ãŠã³ãã§éç¥ã®åŠçãå®è£ ã§ããŸããããã¢ããªãéããŠéç¥ãã¿ãããããšåé¡ãçºçããŸãã ã¢ããªã¯ãéããŠåèµ·åããªãéãæ¶ããªã空çœã®çœãç»é¢ã®ã¿ã衚瀺ããŸãã OneSignalã®Webãµã€ãã«ããã¥ã¡ã³ããèŠã€ãããªãããããã®ç¶æ³ã«å¯ŸåŠããæ¹æ³ãããããŸããã ãã®ã©ã€ãã©ãªã®åŠç¿ãšå®è£ ã«æéãè²»ãããã®ã§ã€ã©ã€ã©ããŸãããããã®éåžžã«éèŠãªãŠãŒã¹ã±ãŒã¹ãåŠçã§ãããã©ããã¯ããããŸããã index.jsã«ã€ãã³ããªã¹ããŒãå®è£ ããäžèšã®å¯èœãªåé¿çãèªã¿ãŸããããreactããã²ãŒã·ã§ã³ã䜿çšããŠããããã¹ããããã¹ã¿ãã¯ç»é¢ã«ç§»åããã«ã¯ãApp.jsã§å®£èšãããŠããã¡ã€ã³ããã²ãŒã¿ãŒããåç §ãååŸããå¿ èŠããããŸãã ãã®åé¡ã«å¯ŸåŠããã©ã®ããã«è§£æ±ºãããã«ã€ããŠã¢ããã€ã¹ãããã ããã°å¹žãã§ãã åãã£ãŠæè¬ããŸãã
æãåèã«ãªãã³ã¡ã³ã
ç§ãåãåé¡ãæ±ããŠããŸãããä»ã®å€ãã®äººããã®åé¡ãæ±ããŠããããã§ãã ç§ãèŠã€ããããã€ãã®é¢é£ãã/éè€ããåé¡ã«ã¯ã https ïŒ//github.com/geektimecoil/react-native-onesignal/issues/206ãhttpsïŒ//github.com/geektimecoil/react-native-onesignal/issues/195 ã https://github.com/geektimecoil/react-native-onesignal/issues/191ãhttps://github.com/geektimecoil/react-native-onesignal/issues/336ãhttps://github.com/geektimecoil/ _ _ react-native-onesignal / issues / 334 ã httpsïŒ //github.com/geektimecoil/react-native-onesignal/issues/264ãhttpsïŒ//github.com/geektimecoil/react-native-onesignal/issues/279ã
ãããã®åé¡ã¯ãã¹ãŠãããã·ã¥éç¥ãã¿ããããŠã¢ããªãéãããã®æç¹ã§ã¢ããªãå®è¡ãããŠããªããšãã«
opened
ã€ãã³ããªã¹ããŒãåŒã³åºãããªããšãããã®åé¡ã«é¢é£ããŠããããã§ãã ç§ããããã®åé¡ã§èªãã ããšãšç§ãè¡ã£ããã¹ãããããã®åé¡ã®åå ã¯ã€ãã³ããªã¹ããŒã®ç»é²ãäœããã®åœ¢ã§é ããŠããããšã§ããããã§ãïŒã€ãŸããOneSignal.addEventListener('opened', this.onOpened);
ã¯ã¢ããªèªäœãèªã¿èŸŒãŸããŸãïŒã ããã¯ãReactã³ã³ããŒãã³ãå ïŒããšãã°ãconstructor
ãŸãã¯componentWillMount
ãŸãã¯componentDidMount
é¢æ°å ïŒã«ãã®ã³ãŒããããããæ§æ/åæ°ŽåãããŸã§åŒã³åºãããªãããšãåå ã§ããå¯èœæ§ããããŸããããŠããã®é 延ã®ããã«ãã€ãã³ãèªäœïŒéç¥ãéãããããšïŒã¯ãã€ãã³ããªã¹ããŒãç»é²ãããåã«react-native-onesignalã«ãã£ãŠçºçããŸãããã®æç¹ã§ãã€ãã³ããèŠéããŠããŸããŸããããããèµ·ãã£ãããšãç¥ãæ¹æ³ã¯ãããŸããã è£è¶³ãšããŠããã®åãåé¡ã¯ä»ã®ã€ãã³ããªã¹ããŒãããšãã°ids
ã€ãã³ããªã¹ããŒã«åœ±é¿ããŸãããã®ã³ãŒããã§ããã ãæ©ãçºçããããã«ç§»åãããšãã€ãã³ããçºçããåã«ã€ãã³ããªã¹ããŒãç»é²ãããã€ãã³ããã³ãã©ãŒé¢æ°ãåŒã³åºãããããã«èŠããŸãã ããšãã°ãã€ãã³ããªã¹ããŒç»é²ã³ãŒãã
index.ios.js
ãã¡ã€ã«ã«ç§»åããããindex.ios.js
ãã¡ã€ã«ãåã«ã€ã³ããŒãããŠããå Žåã¯App.js
ãã¡ã€ã«ã®å é ã«ç§»åããå¿ èŠããããŸããApp
ã³ã³ããŒãã³ããšãããç»é²ããŸãïŒAppRegistry.registerComponent
ãä»ããŠïŒããããèšå®ãããšãéç¥ãéãããã€ãã³ããšãã®åŠçæ¹æ³ããã£ããã£ã§ããããã«ãªããŸããããã¯ãã¢ããªã®èšå®æ¹æ³ïŒäœ¿çšããŠãããã©ãããªã©ïŒã«ãã£ãŠç°ãªããŸãã ReduxããŸãã¯redux-persistãªã©ã䜿çšããŠãããã©ããïŒã
ç§ã®çŸåšã®è§£æ±ºçã¯ã
App.js
ãã¡ã€ã«èªäœã®ãããã¬ãã«ã§å®çŸ©ãããå€æ°ã«éç¥ãä¿åãïŒApp
ã³ã³ããŒãã³ãã宣èšããåã«ïŒãåæåãå®äºãããReduxã¹ãã¢ïŒredux-persistã«ããã¹ãã¢ã®åæ°Žåã®åŸ æ©ãå«ãïŒããã€ããŒããšããŠã®éç¥ã䜿çšããŠã¢ã¯ã·ã§ã³ããã£ã¹ããããïŒéç¥ãéãããå ŽåïŒããããã¬ãã«ã®ã€ãã³ããªã¹ããŒãåé€ããŠæ°ããã€ãã³ããè¿œå ããŸãApp
ã³ã³ããŒãã³ãèªäœã®ãªã¹ããŒïŒãããã®ã€ãã³ããªã¹ããŒã¯ãã¢ã¯ã·ã§ã³ãã€ããŒããšããŠéç¥ãããã€ã¹IDãªã©ã䜿çšããŠã¢ã¯ã·ã§ã³ãReduxã¹ãã¢ã«ãã£ã¹ãããããã ãã§ãïŒããã®ãœãªã¥ãŒã·ã§ã³ã¯æããã«éåžžã«ããããŒã§ããããããããããæ³å®ã©ããã«æ©èœããªããšããžã±ãŒã¹ãããã€ããããŸãã ããããreact-native-onesignalã«é©åãªãœãªã¥ãŒã·ã§ã³ãå®è£ ããããŸã§ãããã¯é©åãªåé¿çã®ããã§ãã
çºçããå¿ èŠãããã®ã¯ãreact-native-onesignalãæŽæ°ããŠãã€ãã³ããã³ãã©ãŒãèšå®ãããŸã§åŸ æ©ããŠãããã€ãã³ããçºçãããããšã ãšæããŸãã èãããã解決çã®1ã€ã¯ãã€ãã³ãïŒ
opened
ã€ãã³ããªã©ïŒãçºçãããšãã€ãã³ãããã¥ãŒã«å ¥ããããreact-native-onesignalã察å¿ããã€ãã³ããªã¹ããŒãçŸåšç»é²ãããŠãããã©ããã確èªããããšã§ãã ååšããªãå Žåã¯ãã€ãã³ãããã¥ãŒã«æ®ããŸãã 次ã«ãã€ãã³ããªã¹ããŒãç»é²ããããšããã«ããã®ã€ãã³ããªã¹ããŒã«ãã£ãŠåä¿¡ãããã€ãã³ããçºçãããã¥ãŒããåé€ãããŸãã ããããã°ããã€ã§ãã¢ããªã«ã€ãã³ããªã¹ããŒãè¿œå ã§ããŸãïŒããšãã°ãReduxã¹ãã¢ãæ§æãããŠåæ°Žåãããã®ãåŸ ã£ãåŸãã¢ããªèªäœãèªã¿èŸŒãŸããŠãã1ã2ç§åŸã«ãªãå¯èœæ§ããããŸãïŒãã€ãã³ããªã¹ããŒãç»é²ããããšãã€ãã³ããã³ãã©ãŒé¢æ°ãåŒã³åºãããçºçããã€ãã³ãïŒéç¥ãéãããã€ãã³ããªã©ïŒãåä¿¡ããŸããå°ãªããšããŠãŒã¶ãŒãããã·ã¥éç¥ãã¿ããããããã«ã¢ããªãéãããããšãå ·äœçã«æ€åºããããã®å¥ã®å¯èœãªè§£æ±ºçã¯ãææ¡ããããã«
PushNotificationIOS
getInitialNotification()
ãšåæ§ã®ããšãè¡ãããšã§ãããã®é¢æ°ããã€ã§ãåŒã³åºããšããŠãŒã¶ãŒãã¢ããªãéãããã«ã¿ãããããšããããã·ã¥éç¥ãè¿ãããŸãïŒãããçºçããªãã£ãå Žåã¯null
ïŒã ãããããããreact-native-onesignalã§å®è£ ããããšããŠããä»ã®ã€ãã³ããªã¹ããŒïŒids
ã€ãã³ããªã¹ããŒãªã©ïŒã«åœ±é¿ãäžãããã®åé¡ã解決ããããã«äœãããŸããããããã£ãŠã察å¿ããã€ãã³ããªã¹ããŒãç»é²ãããåã«ã€ãã³ããçºçããã¢ããªãã€ãã³ããèŠéããŠããŸããšãããã®ã³ã¢ã®åé¡ã«å¯ŸåŠãããœãªã¥ãŒã·ã§ã³ãæ¬åœã«å¿ èŠã ãšæããŸãã