mirror of
https://github.com/status-im/react-native.git
synced 2025-01-10 01:25:39 +00:00
60783aa6ba
Summary: <details> Thanks for submitting a PR! Please read these instructions carefully: - [ ] Explain the **motivation** for making this change. - [ ] Provide a **test plan** demonstrating that the code is solid. - [ ] Match the **code formatting** of the rest of the codebase. - [ ] Target the `master` branch, NOT a "stable" branch. Please read the [Contribution Guidelines](https://github.com/facebook/react-native/blob/master/CONTRIBUTING.md) to learn more about contributing to React Native. </details> _What existing problem does the pull request solve? In iOS when sending a silent push notification you need to configure the 'content-available' APS key to the value of 1 (When this key is present, the system wakes up your app in the background and delivers the notification to its app delegate, see [apple docs](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html#//apple_ref/doc/uid/TP40008194-CH17-SW1)). This PR exposes this property to the notification event handler so app code can handle silent push scenario specifically. Currently this property is not available. I've updated the PushNotificationIOSExample in the RNTester. 1. Open RNTester in xcode 2. Enable the push notifications capability 3. run on device 4. Go to PushNotificationIOS 5. click on "send fake notification" 6. verify alert message contains 'content-available' with a value of 1. Closes https://github.com/facebook/react-native/pull/14584 Differential Revision: D5279181 Pulled By: shergin fbshipit-source-id: d2288e147d89ba267f54265d819aa0a9969095e7
220 lines
5.1 KiB
JavaScript
220 lines
5.1 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @flow
|
|
* @providesModule PushNotificationIOSExample
|
|
*/
|
|
'use strict';
|
|
|
|
var React = require('react');
|
|
var ReactNative = require('react-native');
|
|
var {
|
|
AlertIOS,
|
|
PushNotificationIOS,
|
|
StyleSheet,
|
|
Text,
|
|
TouchableHighlight,
|
|
View,
|
|
} = ReactNative;
|
|
|
|
class Button extends React.Component {
|
|
render() {
|
|
return (
|
|
<TouchableHighlight
|
|
underlayColor={'white'}
|
|
style={styles.button}
|
|
onPress={this.props.onPress}>
|
|
<Text style={styles.buttonLabel}>
|
|
{this.props.label}
|
|
</Text>
|
|
</TouchableHighlight>
|
|
);
|
|
}
|
|
}
|
|
|
|
class NotificationExample extends React.Component {
|
|
componentWillMount() {
|
|
PushNotificationIOS.addEventListener('register', this._onRegistered);
|
|
PushNotificationIOS.addEventListener('registrationError', this._onRegistrationError);
|
|
PushNotificationIOS.addEventListener('notification', this._onRemoteNotification);
|
|
PushNotificationIOS.addEventListener('localNotification', this._onLocalNotification);
|
|
|
|
PushNotificationIOS.requestPermissions();
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
PushNotificationIOS.removeEventListener('register', this._onRegistered);
|
|
PushNotificationIOS.removeEventListener('registrationError', this._onRegistrationError);
|
|
PushNotificationIOS.removeEventListener('notification', this._onRemoteNotification);
|
|
PushNotificationIOS.removeEventListener('localNotification', this._onLocalNotification);
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<View>
|
|
<Button
|
|
onPress={this._sendNotification}
|
|
label="Send fake notification"
|
|
/>
|
|
|
|
<Button
|
|
onPress={this._sendLocalNotification}
|
|
label="Send fake local notification"
|
|
/>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
_sendNotification() {
|
|
require('RCTDeviceEventEmitter').emit('remoteNotificationReceived', {
|
|
remote: true,
|
|
aps: {
|
|
alert: 'Sample notification',
|
|
badge: '+1',
|
|
sound: 'default',
|
|
category: 'REACT_NATIVE',
|
|
'content-available': 1,
|
|
},
|
|
});
|
|
}
|
|
|
|
_sendLocalNotification() {
|
|
require('RCTDeviceEventEmitter').emit('localNotificationReceived', {
|
|
aps: {
|
|
alert: 'Sample local notification',
|
|
badge: '+1',
|
|
sound: 'default',
|
|
category: 'REACT_NATIVE'
|
|
},
|
|
});
|
|
}
|
|
|
|
_onRegistered(deviceToken) {
|
|
AlertIOS.alert(
|
|
'Registered For Remote Push',
|
|
`Device Token: ${deviceToken}`,
|
|
[{
|
|
text: 'Dismiss',
|
|
onPress: null,
|
|
}]
|
|
);
|
|
}
|
|
|
|
_onRegistrationError(error) {
|
|
AlertIOS.alert(
|
|
'Failed To Register For Remote Push',
|
|
`Error (${error.code}): ${error.message}`,
|
|
[{
|
|
text: 'Dismiss',
|
|
onPress: null,
|
|
}]
|
|
);
|
|
}
|
|
|
|
_onRemoteNotification(notification) {
|
|
const result = `Message: ${notification.getMessage()};\n
|
|
badge: ${notification.getBadgeCount()};\n
|
|
sound: ${notification.getSound()};\n
|
|
category: ${notification.getCategory()};\n
|
|
content-available: ${notification.getContentAvailable()}.`;
|
|
|
|
AlertIOS.alert(
|
|
'Push Notification Received',
|
|
result,
|
|
[{
|
|
text: 'Dismiss',
|
|
onPress: null,
|
|
}]
|
|
);
|
|
}
|
|
|
|
_onLocalNotification(notification){
|
|
AlertIOS.alert(
|
|
'Local Notification Received',
|
|
'Alert message: ' + notification.getMessage(),
|
|
[{
|
|
text: 'Dismiss',
|
|
onPress: null,
|
|
}]
|
|
);
|
|
}
|
|
}
|
|
|
|
class NotificationPermissionExample extends React.Component {
|
|
state: any;
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {permissions: null};
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<View>
|
|
<Button
|
|
onPress={this._showPermissions.bind(this)}
|
|
label="Show enabled permissions"
|
|
/>
|
|
<Text>
|
|
{JSON.stringify(this.state.permissions)}
|
|
</Text>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
_showPermissions() {
|
|
PushNotificationIOS.checkPermissions((permissions) => {
|
|
this.setState({permissions});
|
|
});
|
|
}
|
|
}
|
|
|
|
var styles = StyleSheet.create({
|
|
button: {
|
|
padding: 10,
|
|
alignItems: 'center',
|
|
justifyContent: 'center',
|
|
},
|
|
buttonLabel: {
|
|
color: 'blue',
|
|
},
|
|
});
|
|
|
|
exports.title = 'PushNotificationIOS';
|
|
exports.description = 'Apple PushNotification and badge value';
|
|
exports.examples = [
|
|
{
|
|
title: 'Badge Number',
|
|
render(): React.Element<any> {
|
|
return (
|
|
<View>
|
|
<Button
|
|
onPress={() => PushNotificationIOS.setApplicationIconBadgeNumber(42)}
|
|
label="Set app's icon badge to 42"
|
|
/>
|
|
<Button
|
|
onPress={() => PushNotificationIOS.setApplicationIconBadgeNumber(0)}
|
|
label="Clear app's icon badge"
|
|
/>
|
|
</View>
|
|
);
|
|
},
|
|
},
|
|
{
|
|
title: 'Push Notifications',
|
|
render(): React.Element<any> {
|
|
return <NotificationExample />;
|
|
}
|
|
},
|
|
{
|
|
title: 'Notifications Permissions',
|
|
render(): React.Element<any> {
|
|
return <NotificationPermissionExample />;
|
|
}
|
|
}];
|