mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
edfdafc7a1
Summary: **Resolve/Reject Promise** * Add onFulfill and onReject to the `PushNotificationIOS.requestPermissions()` Promise **Replace Apple-deprecated notification method** * Old: In iOS 10, `UIApplication.registerUserNotificationSettings` was deprecated. Calling this would then call the AppDelegate's lifecycle function `didRegisterUserNotificationSettings`, and then in the AppDelegate, we'd call `RCTPushNotificationManager.didRegisterUserNotificationSettings` to return the user settings. [registerusernotificationsettings Doc](https://developer.apple.com/documentation/uikit/uiapplication/1622932-registerusernotificationsettings?language=objc) * New: Replace deprecated function with Apple's recommended `UNUserNotificationCenter.currentNotificationCenter getNotificationSettingsWithCompletionHandler`, which no longer needs the AppDelegate lifecycle method because it directly returns the user's settings in a completion hander. [requestauthorizationwithoptions Doc](https://developer.apple.com/documentation/usernotifications/unusernotificationcenter/1649527-requestauthorizationwithoptions?language=objc) **Add Tests** * Add tests on `PushNotificationIOSExample.js` to test that the onFulfill and onReject are called * On `PushNotificationIOSExample.js`, instead of asking permission upon page load, ask for permission when the user taps the button "Request Notifications (Should Display Alert)". * Before, asking for permission multiple times before would result in the RN error "cannot call requestPermissions twice before the first has returned", now you can ask for permission as many times as you want because I've removed the now unused `RCTPromiseResolveBlock`. **Future** If this works on device (we have to land this to test push on device), we can delete `RTCPushNotificationManager.didRegisterUserNotificationSettings` which is being called from several apps. Changelog: [iOS] [Added] Resolve and reject promise for PushNotificationIOS.requestPermissions Reviewed By: PeteTheHeat Differential Revision: D19700061 fbshipit-source-id: 02ba815787efc9047f33ffcdfafe962b134afe6d
268 lines
5.9 KiB
JavaScript
268 lines
5.9 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
* @flow
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const React = require('react');
|
|
const {
|
|
Alert,
|
|
DeviceEventEmitter,
|
|
PushNotificationIOS,
|
|
StyleSheet,
|
|
Text,
|
|
TouchableHighlight,
|
|
View,
|
|
} = require('react-native');
|
|
|
|
class Button extends React.Component<$FlowFixMeProps> {
|
|
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<{...}> {
|
|
UNSAFE_componentWillMount() {
|
|
PushNotificationIOS.addEventListener('register', this._onRegistered);
|
|
PushNotificationIOS.addEventListener(
|
|
'registrationError',
|
|
this._onRegistrationError,
|
|
);
|
|
PushNotificationIOS.addEventListener(
|
|
'notification',
|
|
this._onRemoteNotification,
|
|
);
|
|
PushNotificationIOS.addEventListener(
|
|
'localNotification',
|
|
this._onLocalNotification,
|
|
);
|
|
}
|
|
|
|
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() {
|
|
DeviceEventEmitter.emit('remoteNotificationReceived', {
|
|
remote: true,
|
|
aps: {
|
|
alert: 'Sample notification',
|
|
badge: '+1',
|
|
sound: 'default',
|
|
category: 'REACT_NATIVE',
|
|
'content-available': 1,
|
|
},
|
|
});
|
|
}
|
|
|
|
_sendLocalNotification() {
|
|
DeviceEventEmitter.emit('localNotificationReceived', {
|
|
aps: {
|
|
alert: 'Sample local notification',
|
|
badge: '+1',
|
|
sound: 'default',
|
|
category: 'REACT_NATIVE',
|
|
},
|
|
});
|
|
}
|
|
|
|
_onRegistered(deviceToken) {
|
|
Alert.alert('Registered For Remote Push', `Device Token: ${deviceToken}`, [
|
|
{
|
|
text: 'Dismiss',
|
|
onPress: null,
|
|
},
|
|
]);
|
|
}
|
|
|
|
_onRegistrationError(error) {
|
|
Alert.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()}.`;
|
|
|
|
Alert.alert('Push Notification Received', result, [
|
|
{
|
|
text: 'Dismiss',
|
|
onPress: null,
|
|
},
|
|
]);
|
|
}
|
|
|
|
_onLocalNotification(notification) {
|
|
Alert.alert(
|
|
'Local Notification Received',
|
|
'Alert message: ' + notification.getMessage(),
|
|
[
|
|
{
|
|
text: 'Dismiss',
|
|
onPress: null,
|
|
},
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class NotificationPermissionExample extends React.Component<
|
|
$FlowFixMeProps,
|
|
any,
|
|
> {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {permissions: null};
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<View>
|
|
<Button
|
|
onPress={this._requestPermissions}
|
|
label="Request Notifications (Should Display Alert)"
|
|
/>
|
|
<Button onPress={this._checkPermissions} label="Check permissions" />
|
|
<Text style={{textAlign: 'center'}}>
|
|
{JSON.stringify(this.state.permissions)}
|
|
</Text>
|
|
</View>
|
|
);
|
|
}
|
|
|
|
_requestPermissions = () => {
|
|
PushNotificationIOS.requestPermissions().then(
|
|
onFulfill => {
|
|
this._showAlert(
|
|
'Successfully requested permissions -- ' +
|
|
'Alert: ' +
|
|
onFulfill.alert.toString() +
|
|
', Badge: ' +
|
|
onFulfill.badge.toString() +
|
|
', Sound: ' +
|
|
onFulfill.sound.toString(),
|
|
);
|
|
this._checkPermissions();
|
|
},
|
|
(onReject?) => {
|
|
this._showAlert('Error requesting permissions');
|
|
this._checkPermissions();
|
|
},
|
|
);
|
|
};
|
|
|
|
_checkPermissions = () => {
|
|
PushNotificationIOS.checkPermissions(permissions => {
|
|
this.setState({permissions});
|
|
});
|
|
};
|
|
|
|
_showAlert(text) {
|
|
Alert.alert('Notification Permission', text, [
|
|
{
|
|
text: 'Dismiss',
|
|
onPress: null,
|
|
},
|
|
]);
|
|
}
|
|
}
|
|
|
|
const 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: 'Notifications Permissions',
|
|
render(): React.Element<any> {
|
|
return <NotificationPermissionExample />;
|
|
},
|
|
},
|
|
{
|
|
title: 'Push Notifications',
|
|
render(): React.Element<any> {
|
|
return <NotificationExample />;
|
|
},
|
|
},
|
|
{
|
|
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>
|
|
);
|
|
},
|
|
},
|
|
];
|