Skip to content

Commit c3ba322

Browse files
author
何家祥
committed
添加android 通知权限检测与跳转
1 parent accce96 commit c3ba322

7 files changed

Lines changed: 238 additions & 11 deletions

File tree

android.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ const RNPushAndroid = {
1818
getBadgeNumber: () => 0,
1919
clearBadge: () => { },
2020
requestNotification: () => { },
21-
openSettingsForNotification: () => { },
21+
checkPermission: async () => {
22+
return RNPush.checkPermission()
23+
},
24+
openSettingsForNotification: async () => { return RNPush.openSettingsForNotification() },
2225
}
2326

2427
export default RNPushAndroid

android/src/main/java/me/youchai/rnpush/RNPushModule.java

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
package me.youchai.rnpush;
22

3+
import android.app.NotificationManager;
4+
import android.content.Intent;
5+
import android.net.Uri;
6+
import android.os.Build;
7+
import android.provider.Settings;
38
import android.util.Log;
49

10+
import androidx.core.app.NotificationManagerCompat;
11+
512
import com.facebook.react.bridge.Arguments;
613
import com.facebook.react.bridge.Promise;
714
import com.facebook.react.bridge.ReactApplicationContext;
@@ -21,9 +28,24 @@ public class RNPushModule extends ReactContextBaseJavaModule {
2128
private PushService pushService = null;
2229
private static ReactApplicationContext __rac;
2330

31+
enum EventType{
32+
REGISTER("register"),
33+
REGISTER_ERROR("registrationError"),
34+
NOTIFICATION("notification"),
35+
OPEN_NOTIFICATION("openNotification"),
36+
NOTIFICATION_AUTHORIZATION("notificationAuthorization");
37+
38+
public String value;
39+
private EventType(String value){
40+
this.value = value;
41+
}
42+
}
43+
2444
public RNPushModule(ReactApplicationContext reactContext) {
2545
super(reactContext);
2646
__rac = reactContext;
47+
48+
2749
}
2850

2951
@Override
@@ -41,25 +63,33 @@ public static void onRegister(String type, String registrationId) {
4163
map.putString("type", type);
4264
map.putString("registrationId", registrationId);
4365

44-
RNPushModule.sendEvent("register", map);
66+
RNPushModule.sendEvent(EventType.REGISTER.value, map);
4567
}
4668

4769
public static void onRegisterError(String message) {
4870
WritableMap map = Arguments.createMap();
4971
map.putString("message", message);
5072

51-
RNPushModule.sendEvent("registrationError", map);
73+
RNPushModule.sendEvent(EventType.REGISTER_ERROR.value, map);
5274
}
5375

5476
public static void onNotification(Notification note) {
5577
Log.d(TAG,"onNotification");
56-
RNPushModule.sendEvent("notification", note.toWritableMap());
78+
RNPushModule.sendEvent(EventType.NOTIFICATION.value, note.toWritableMap());
5779
}
5880

5981
public static void onNotificationClick(Notification note) {
6082
Log.d(TAG,"onNotificationClick");
6183
// PushService.setInitialNotification(note);
62-
RNPushModule.sendEvent("openNotification", note.toWritableMap());
84+
RNPushModule.sendEvent(EventType.OPEN_NOTIFICATION.value, note.toWritableMap());
85+
}
86+
87+
public static void onNotificationAuthorization(ReactApplicationContext reactContext){
88+
Log.d(TAG,"onNotificationAuthorization");
89+
boolean isOn = NotificationManagerCompat.from(reactContext).areNotificationsEnabled();
90+
WritableMap map = Arguments.createMap();
91+
map.putBoolean("state",isOn);
92+
RNPushModule.sendEvent(EventType.NOTIFICATION_AUTHORIZATION.value,map);
6393
}
6494

6595
public static void sendEvent(String key, WritableMap event) {
@@ -81,6 +111,7 @@ public void init(ReadableMap configs, Promise promise) {
81111
try {
82112
this.pushService = PushServiceFactory.create(__rac, config);
83113
this.pushService.init();
114+
RNPushModule.onNotificationAuthorization(__rac);
84115
Logger.i("init Success!");
85116
promise.resolve(null);
86117
} catch (Throwable e) {
@@ -219,4 +250,39 @@ public void removeNotifications(String id, Promise promise) {
219250
promise.reject(e);
220251
}
221252
}
253+
254+
@ReactMethod
255+
public void checkPermission(Promise promise){
256+
boolean state = NotificationManagerCompat.from(__rac).areNotificationsEnabled();
257+
promise.resolve(state);
258+
}
259+
260+
@ReactMethod
261+
public void openSettingsForNotification(Promise promise){
262+
Intent intent = new Intent();
263+
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
264+
String packageName = __rac.getPackageName();
265+
int uid = __rac.getApplicationInfo().uid;
266+
try{
267+
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
268+
intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
269+
intent.putExtra(Settings.EXTRA_APP_PACKAGE,packageName);
270+
intent.putExtra(Settings.EXTRA_CHANNEL_ID,uid);
271+
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
272+
intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
273+
intent.putExtra("app_package",packageName);
274+
intent.putExtra("app_uid",uid);
275+
}
276+
277+
__rac.startActivity(intent);
278+
}catch (Exception e){
279+
Log.e(TAG,"gotoNotificationSetting",e);
280+
281+
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
282+
intent.setData(Uri.fromParts("package",packageName,null));
283+
284+
__rac.startActivity(intent);
285+
}
286+
promise.resolve(true);
287+
}
222288
}

android_p.ts

Whitespace-only changes.

indexd.ts

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import {
2+
NativeModules,
3+
NativeEventEmitter,
4+
EmitterSubscription,
5+
} from 'react-native'
6+
import { RNCNotification, RNCRegisterRes } from './type'
7+
8+
9+
10+
export enum RNPushEvent {
11+
Register = 'register',
12+
RegistrationError = 'registrationError',
13+
Notification = 'notification',
14+
OpenNotification = 'openNotification',
15+
NotificationAuthorization = 'NotificationAuthorization',
16+
}
17+
18+
export enum RNNotificationAuthorization{
19+
NotDetermined = 0,
20+
Denied = 1,
21+
Authorized = 2,
22+
Provisional = 3,
23+
}
24+
25+
const { RNPush } = NativeModules
26+
27+
const notificationEmitter = new NativeEventEmitter(RNPush)
28+
29+
export type ReactNativeNRegisterListener = (data: RNCRegisterRes) => void
30+
export type ReactNativeNotificationListener = (data: RNCNotification) => void
31+
export type ReactnativeNotificationAuthorizationListener = (data: RNNotificationAuthorization) => void
32+
33+
class ReactNativeNotification {
34+
35+
subscriptions:EmitterSubscription[]=[]
36+
37+
public async init() {
38+
return RNPush.init()
39+
}
40+
41+
public async resume() {
42+
return RNPush.resume()
43+
}
44+
45+
public async stop() {
46+
return RNPush.stop()
47+
}
48+
49+
public async getRegistrationId(): Promise<string> {
50+
return RNPush.getRegistrationId()
51+
}
52+
53+
public async requestNotification(): Promise<boolean> {
54+
return RNPush.requestNotification()
55+
}
56+
57+
public async setBadge(badge: number) {
58+
return RNPush.setBadge(badge)
59+
}
60+
61+
public addEventListener(event: RNPushEvent, handler) {
62+
63+
}
64+
65+
public removeEventListener(event: RNPushEvent, handler) {
66+
67+
}
68+
69+
public addRegisterListener(listener: ReactNativeNRegisterListener): EmitterSubscription {
70+
const subscription = notificationEmitter.addListener(RNPushEvent.Register, listener)
71+
this.subscriptions.push(subscription)
72+
return subscription
73+
}
74+
75+
public addNotificationListener(listener: ReactNativeNotificationListener): EmitterSubscription {
76+
const realListener = (data) => {
77+
try {
78+
const extras = this._getExtras(data)
79+
listener({
80+
id:data.id,
81+
title:data.title,
82+
content:data.content,
83+
extras,
84+
})
85+
} catch (e) {
86+
console.error('[ReactNativeNotification] ReactNativeNotificationListener', e)
87+
}
88+
}
89+
const subscription = notificationEmitter.addListener(RNPushEvent.Notification, realListener)
90+
this.subscriptions.push(subscription)
91+
return subscription
92+
}
93+
94+
public addOpenNotificationListener(listener:ReactNativeNotificationListener):EmitterSubscription{
95+
const realListener = (data) => {
96+
try {
97+
const extras = this._getExtras(data)
98+
listener({
99+
id:data.id,
100+
title:data.title,
101+
content:data.content,
102+
extras,
103+
})
104+
} catch (e) {
105+
console.error('[ReactNativeNotification] ReactNativeNotificationListener', e)
106+
}
107+
}
108+
const subscription = notificationEmitter.addListener(RNPushEvent.OpenNotification, realListener)
109+
this.subscriptions.push(subscription)
110+
return subscription
111+
}
112+
113+
public addNotificationAuthorizationListener(listener:ReactnativeNotificationAuthorizationListener):EmitterSubscription{
114+
const subscription = notificationEmitter.addListener(RNPushEvent.NotificationAuthorization,listener)
115+
this.subscriptions.push(subscription)
116+
return subscription
117+
}
118+
119+
public removeAllListeners(){
120+
this.subscriptions.map(it=>it?.remove())
121+
}
122+
123+
124+
_getExtras(data) {
125+
try {
126+
const extras = JSON.parse(data.extras)
127+
return extras
128+
} catch (e) {
129+
console.error('[ReactNativeNotification] _getExtras', e)
130+
}
131+
}
132+
}
133+
134+
const push = new ReactNativeNotification()
135+
136+
export default push

ios.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
NativeModules,
3-
Platform,
43
NativeEventEmitter,
54
} from 'react-native'
65

@@ -31,13 +30,15 @@ const RNPush = {
3130
},
3231
removeNotifications: (id) => {
3332
},
34-
3533
requestNotification: async () => {
36-
return await RNCNotification.requestNotification()
34+
return RNCNotification.requestNotification()
35+
},
36+
checkPromission: async () => {
37+
const state = await RNCNotification.requestNotification()
38+
return state > 1
3739
},
38-
3940
openSettingsForNotification: async () => {
40-
return await RNCNotification.openSettingsForNotification()
41+
return RNCNotification.openSettingsForNotification()
4142
}
4243
}
4344

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@yocdev/react-native-notification",
3-
"version": "1.0.22",
3+
"version": "1.0.23",
44
"author": "npm@youchai.me",
55
"license": "MIT",
66
"description": "react-native notification",

type.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export enum DeviceType {
2+
JPUSH_IOS = "JPUSH_IOS",
3+
JPUSHAndroid = "JPUSH_Android",
4+
XiaoMi = "XiaoMi",
5+
OPPO = "OPPO",
6+
VIVO = "VIVO",
7+
HuaWei = "HuaWei",
8+
MeiZu = "MeiZu",
9+
}
10+
11+
export interface RNCRegisterRes {
12+
type: DeviceType,
13+
registrationId: string,
14+
}
15+
16+
export interface RNCNotification{
17+
id:string,
18+
title:string,
19+
content:string,
20+
extras?:any,
21+
}

0 commit comments

Comments
 (0)