react-native-push-signal 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -18
- package/README.ru.md +24 -18
- package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignal.kt +9 -15
- package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalCenter.kt +33 -104
- package/ios/PushSignal.swift +2 -11
- package/ios/PushSignalCenter.swift +0 -35
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/pushSignal.js +1 -7
- package/lib/module/pushSignal.js.map +1 -1
- package/lib/module/pushSignal.native.js +1 -7
- package/lib/module/pushSignal.native.js.map +1 -1
- package/lib/typescript/src/PushSignal.nitro.d.ts +7 -9
- package/lib/typescript/src/PushSignal.nitro.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/pushSignal.d.ts +2 -4
- package/lib/typescript/src/pushSignal.d.ts.map +1 -1
- package/lib/typescript/src/pushSignal.native.d.ts +2 -4
- package/lib/typescript/src/pushSignal.native.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JAndroidFirebaseConfig.hpp +16 -16
- package/nitrogen/generated/android/c++/JHybridPushSignalSpec.cpp +7 -31
- package/nitrogen/generated/android/c++/JHybridPushSignalSpec.hpp +1 -3
- package/nitrogen/generated/android/c++/JPushPlatform.hpp +3 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/AndroidFirebaseConfig.kt +14 -14
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/HybridPushSignalSpec.kt +1 -9
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushPlatform.kt +1 -1
- package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Bridge.cpp +5 -5
- package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Bridge.hpp +49 -52
- package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Umbrella.hpp +0 -3
- package/nitrogen/generated/ios/c++/HybridPushSignalSpecSwift.hpp +2 -19
- package/nitrogen/generated/ios/swift/AndroidFirebaseConfig.swift +17 -17
- package/nitrogen/generated/ios/swift/{Func_void_PermissionStatus.swift → Func_void.swift} +11 -11
- package/nitrogen/generated/ios/swift/HybridPushSignalSpec.swift +1 -3
- package/nitrogen/generated/ios/swift/HybridPushSignalSpec_cxx.swift +8 -38
- package/nitrogen/generated/ios/swift/PushPlatform.swift +4 -4
- package/nitrogen/generated/shared/c++/AndroidFirebaseConfig.hpp +17 -17
- package/nitrogen/generated/shared/c++/HybridPushSignalSpec.cpp +0 -2
- package/nitrogen/generated/shared/c++/HybridPushSignalSpec.hpp +2 -7
- package/nitrogen/generated/shared/c++/PushPlatform.hpp +4 -4
- package/package.json +2 -2
- package/src/PushSignal.nitro.ts +7 -9
- package/src/index.tsx +0 -3
- package/src/pushSignal.native.tsx +2 -11
- package/src/pushSignal.tsx +3 -10
- package/nitrogen/generated/android/c++/JPermissionStatus.hpp +0 -61
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PermissionStatus.kt +0 -24
- package/nitrogen/generated/ios/swift/PermissionStatus.swift +0 -44
- package/nitrogen/generated/shared/c++/PermissionStatus.hpp +0 -80
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
English | [Русский](README.ru.md)
|
|
4
4
|
|
|
5
|
-
Get
|
|
5
|
+
Get device credentials for your server and listen for incoming notifications or taps. The library does not send pushes — your backend talks to APNs and FCM. Request notification permission yourself with [`react-native-permissions`](https://github.com/zoontek/react-native-permissions).
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -15,24 +15,30 @@ npm install react-native-push-signal react-native-nitro-modules
|
|
|
15
15
|
## Usage
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
|
+
import {
|
|
19
|
+
checkNotifications,
|
|
20
|
+
requestNotifications,
|
|
21
|
+
RESULTS,
|
|
22
|
+
} from 'react-native-permissions';
|
|
18
23
|
import {
|
|
19
24
|
getCredentials,
|
|
20
|
-
getPermissionStatus,
|
|
21
25
|
initialize,
|
|
22
26
|
onMessage,
|
|
23
27
|
onNotificationPress,
|
|
24
|
-
requestPermission,
|
|
25
28
|
} from 'react-native-push-signal';
|
|
26
29
|
|
|
27
|
-
initialize({
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
await initialize({
|
|
31
|
+
project_id: 'my-project',
|
|
32
|
+
mobilesdk_app_id: '1:123456789:android:abcd',
|
|
33
|
+
current_key: 'AIza...',
|
|
34
|
+
project_number: '123456789',
|
|
32
35
|
});
|
|
33
36
|
|
|
34
|
-
const status = await
|
|
35
|
-
|
|
37
|
+
const { status } = await checkNotifications();
|
|
38
|
+
if (status !== RESULTS.GRANTED) {
|
|
39
|
+
await requestNotifications(['alert', 'badge', 'sound']);
|
|
40
|
+
}
|
|
41
|
+
|
|
36
42
|
const credentials = await getCredentials();
|
|
37
43
|
// POST credentials to your server: { platform, token, environment? }
|
|
38
44
|
|
|
@@ -75,15 +81,15 @@ Remote Android pushes go through FCM. You can either pass the client Firebase fi
|
|
|
75
81
|
Call `initialize` with values from `google-services.json` (not a service account):
|
|
76
82
|
|
|
77
83
|
```ts
|
|
78
|
-
initialize({
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
await initialize({
|
|
85
|
+
project_id: '...',
|
|
86
|
+
mobilesdk_app_id: '...',
|
|
87
|
+
current_key: '...',
|
|
88
|
+
project_number: '...',
|
|
83
89
|
});
|
|
84
90
|
```
|
|
85
91
|
|
|
86
|
-
All four fields are required for Firebase to start. If any is missing, `initialize`
|
|
92
|
+
All four fields are required for Firebase to start. If any is missing, `initialize` resolves and does nothing. iOS ignores the config and still resolves the promise.
|
|
87
93
|
|
|
88
94
|
Keep the Firebase service account on your server. Do not put it in the app.
|
|
89
95
|
|
|
@@ -100,7 +106,7 @@ apply plugin: "com.google.gms.google-services"
|
|
|
100
106
|
|
|
101
107
|
3. Add the plugin classpath in `android/build.gradle` / `settings.gradle` as in the [Firebase Android setup](https://firebase.google.com/docs/android/setup).
|
|
102
108
|
|
|
103
|
-
Without `initialize(...)` or that file, `getCredentials()` throws.
|
|
109
|
+
Without `initialize(...)` or that file, `getCredentials()` throws.
|
|
104
110
|
|
|
105
111
|
If the host app already declares its own `FirebaseMessagingService`, only one service can handle `com.google.firebase.MESSAGING_EVENT`. Prefer this library’s service or forward events into it.
|
|
106
112
|
|
|
@@ -112,7 +118,7 @@ If the host app already declares its own `FirebaseMessagingService`, only one se
|
|
|
112
118
|
|
|
113
119
|
## Web
|
|
114
120
|
|
|
115
|
-
|
|
121
|
+
`initialize()` resolves. `getCredentials()` throws. Listeners are no-ops.
|
|
116
122
|
|
|
117
123
|
## Contributing
|
|
118
124
|
|
package/README.ru.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) | Русский
|
|
4
4
|
|
|
5
|
-
Библиотека
|
|
5
|
+
Библиотека отдаёт токен устройства для вашего сервера и сообщает о входящем уведомлении или нажатии на него. Сами пуши она не отправляет — в APNs и FCM ходит бэкенд. Разрешение на уведомления запрашивайте сами через [`react-native-permissions`](https://github.com/zoontek/react-native-permissions).
|
|
6
6
|
|
|
7
7
|
## Установка
|
|
8
8
|
|
|
@@ -15,24 +15,30 @@ npm install react-native-push-signal react-native-nitro-modules
|
|
|
15
15
|
## Использование
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
|
+
import {
|
|
19
|
+
checkNotifications,
|
|
20
|
+
requestNotifications,
|
|
21
|
+
RESULTS,
|
|
22
|
+
} from 'react-native-permissions';
|
|
18
23
|
import {
|
|
19
24
|
getCredentials,
|
|
20
|
-
getPermissionStatus,
|
|
21
25
|
initialize,
|
|
22
26
|
onMessage,
|
|
23
27
|
onNotificationPress,
|
|
24
|
-
requestPermission,
|
|
25
28
|
} from 'react-native-push-signal';
|
|
26
29
|
|
|
27
|
-
initialize({
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
await initialize({
|
|
31
|
+
project_id: 'my-project',
|
|
32
|
+
mobilesdk_app_id: '1:123456789:android:abcd',
|
|
33
|
+
current_key: 'AIza...',
|
|
34
|
+
project_number: '123456789',
|
|
32
35
|
});
|
|
33
36
|
|
|
34
|
-
const status = await
|
|
35
|
-
|
|
37
|
+
const { status } = await checkNotifications();
|
|
38
|
+
if (status !== RESULTS.GRANTED) {
|
|
39
|
+
await requestNotifications(['alert', 'badge', 'sound']);
|
|
40
|
+
}
|
|
41
|
+
|
|
36
42
|
const credentials = await getCredentials();
|
|
37
43
|
// POST credentials на сервер: { platform, token, environment? }
|
|
38
44
|
|
|
@@ -75,15 +81,15 @@ const stopPress = onNotificationPress((message) => {
|
|
|
75
81
|
Вызовите `initialize` со значениями из `google-services.json` (не из service account):
|
|
76
82
|
|
|
77
83
|
```ts
|
|
78
|
-
initialize({
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
await initialize({
|
|
85
|
+
project_id: '...',
|
|
86
|
+
mobilesdk_app_id: '...',
|
|
87
|
+
current_key: '...',
|
|
88
|
+
project_number: '...',
|
|
83
89
|
});
|
|
84
90
|
```
|
|
85
91
|
|
|
86
|
-
Нужны все четыре поля. Если чего-то нет, `initialize`
|
|
92
|
+
Нужны все четыре поля. Если чего-то нет, `initialize` резолвится и ничего не делает. На iOS конфиг игнорируется, промис всё равно резолвится.
|
|
87
93
|
|
|
88
94
|
Service account Firebase оставляйте на сервере. В приложение его класть нельзя.
|
|
89
95
|
|
|
@@ -100,7 +106,7 @@ apply plugin: "com.google.gms.google-services"
|
|
|
100
106
|
|
|
101
107
|
3. Добавьте classpath плагина в `android/build.gradle` / `settings.gradle` по [инструкции Firebase для Android](https://firebase.google.com/docs/android/setup).
|
|
102
108
|
|
|
103
|
-
Без `initialize(...)` или этого файла `getCredentials()` бросит ошибку.
|
|
109
|
+
Без `initialize(...)` или этого файла `getCredentials()` бросит ошибку.
|
|
104
110
|
|
|
105
111
|
Если в хост-приложении уже есть свой `FirebaseMessagingService`, обработать `com.google.firebase.MESSAGING_EVENT` может только один сервис. Оставьте сервис этой библиотеки или пробрасывайте события в него.
|
|
106
112
|
|
|
@@ -112,7 +118,7 @@ apply plugin: "com.google.gms.google-services"
|
|
|
112
118
|
|
|
113
119
|
## Web
|
|
114
120
|
|
|
115
|
-
|
|
121
|
+
`initialize()` резолвится. `getCredentials()` бросает ошибку. Слушатели ничего не делают.
|
|
116
122
|
|
|
117
123
|
## Contributing
|
|
118
124
|
|
|
@@ -5,20 +5,14 @@ import com.margelo.nitro.core.Promise
|
|
|
5
5
|
|
|
6
6
|
@DoNotStrip
|
|
7
7
|
class PushSignal : HybridPushSignalSpec() {
|
|
8
|
-
override fun initialize(config: AndroidFirebaseConfig) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
override fun requestPermission(): Promise<PermissionStatus> {
|
|
19
|
-
val promise = Promise<PermissionStatus>()
|
|
20
|
-
PushSignalCenter.requestPermission { status ->
|
|
21
|
-
promise.resolve(status)
|
|
8
|
+
override fun initialize(config: AndroidFirebaseConfig): Promise<Unit> {
|
|
9
|
+
val promise = Promise<Unit>()
|
|
10
|
+
PushSignalCenter.initialize(config) { error ->
|
|
11
|
+
if (error == null) {
|
|
12
|
+
promise.resolve(Unit)
|
|
13
|
+
} else {
|
|
14
|
+
promise.reject(error)
|
|
15
|
+
}
|
|
22
16
|
}
|
|
23
17
|
return promise
|
|
24
18
|
}
|
|
@@ -27,7 +21,7 @@ class PushSignal : HybridPushSignalSpec() {
|
|
|
27
21
|
return Promise.async {
|
|
28
22
|
val token = PushSignalCenter.fetchToken()
|
|
29
23
|
PushCredentials(
|
|
30
|
-
PushPlatform.
|
|
24
|
+
PushPlatform.ANDROID_OS,
|
|
31
25
|
token,
|
|
32
26
|
null
|
|
33
27
|
)
|
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
package com.margelo.nitro.pushsignal
|
|
2
2
|
|
|
3
|
-
import android.Manifest
|
|
4
3
|
import android.app.Activity
|
|
5
4
|
import android.app.Application
|
|
6
5
|
import android.content.Context
|
|
7
6
|
import android.content.Intent
|
|
8
|
-
import android.content.pm.PackageManager
|
|
9
|
-
import android.os.Build
|
|
10
7
|
import android.os.Bundle
|
|
11
8
|
import androidx.activity.ComponentActivity
|
|
12
|
-
import androidx.activity.result.ActivityResultLauncher
|
|
13
|
-
import androidx.activity.result.contract.ActivityResultContracts
|
|
14
|
-
import androidx.core.app.NotificationManagerCompat
|
|
15
|
-
import androidx.core.content.ContextCompat
|
|
16
9
|
import com.google.firebase.FirebaseApp
|
|
17
10
|
import com.google.firebase.FirebaseOptions
|
|
18
11
|
import com.google.firebase.messaging.FirebaseMessaging
|
|
@@ -23,21 +16,17 @@ import java.util.WeakHashMap
|
|
|
23
16
|
import java.util.concurrent.CopyOnWriteArrayList
|
|
24
17
|
|
|
25
18
|
internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
|
|
26
|
-
private const val PREFS_NAME = "pushsignal"
|
|
27
|
-
private const val PREF_ASKED_PERMISSION = "asked_notifications"
|
|
28
19
|
private const val EXTRA_HANDLED = "pushsignal.handled"
|
|
29
|
-
private const val PERMISSION_LAUNCHER_KEY = "com.margelo.nitro.pushsignal.permission"
|
|
30
20
|
|
|
31
21
|
private val lock = Any()
|
|
32
22
|
@Volatile private var application: Application? = null
|
|
33
23
|
@Volatile private var currentActivity: Activity? = null
|
|
34
|
-
@Volatile private var permissionLauncher: ActivityResultLauncher<String>? = null
|
|
35
24
|
@Volatile private var onMessage: ((PushMessage) -> Unit)? = null
|
|
36
25
|
@Volatile private var onNotificationPress: ((PushMessage) -> Unit)? = null
|
|
37
26
|
@Volatile private var pendingPress: PushMessage? = null
|
|
38
|
-
private val permissionWaiters = CopyOnWriteArrayList<(PermissionStatus) -> Unit>()
|
|
39
27
|
private val registeredActivities = Collections.newSetFromMap(WeakHashMap<Activity, Boolean>())
|
|
40
28
|
@Volatile private var pendingFirebaseConfig: AndroidFirebaseConfig? = null
|
|
29
|
+
private val initializeWaiters = CopyOnWriteArrayList<(Exception?) -> Unit>()
|
|
41
30
|
|
|
42
31
|
fun attach(context: Context) {
|
|
43
32
|
val app = context.applicationContext as? Application ?: return
|
|
@@ -54,22 +43,24 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
|
|
|
54
43
|
}
|
|
55
44
|
pendingFirebaseConfig?.let { config ->
|
|
56
45
|
pendingFirebaseConfig = null
|
|
57
|
-
applyFirebaseConfig(app, config)
|
|
46
|
+
finishInitialize(applyFirebaseConfig(app, config))
|
|
58
47
|
}
|
|
59
48
|
}
|
|
60
49
|
|
|
61
|
-
fun initialize(config: AndroidFirebaseConfig) {
|
|
50
|
+
fun initialize(config: AndroidFirebaseConfig, onDone: (Exception?) -> Unit) {
|
|
62
51
|
if (!config.hasRequiredFields()) {
|
|
52
|
+
onDone(null)
|
|
63
53
|
return
|
|
64
54
|
}
|
|
65
55
|
|
|
66
56
|
val context = application
|
|
67
57
|
if (context == null) {
|
|
68
58
|
pendingFirebaseConfig = config
|
|
59
|
+
initializeWaiters.add(onDone)
|
|
69
60
|
return
|
|
70
61
|
}
|
|
71
62
|
|
|
72
|
-
applyFirebaseConfig(context, config)
|
|
63
|
+
onDone(applyFirebaseConfig(context, config))
|
|
73
64
|
}
|
|
74
65
|
|
|
75
66
|
fun setOnMessage(callback: (PushMessage) -> Unit) {
|
|
@@ -88,60 +79,6 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
|
|
|
88
79
|
}
|
|
89
80
|
}
|
|
90
81
|
|
|
91
|
-
fun getPermissionStatus(): PermissionStatus {
|
|
92
|
-
val context = application ?: return PermissionStatus.NOTDETERMINED
|
|
93
|
-
val notificationsEnabled = NotificationManagerCompat.from(context).areNotificationsEnabled()
|
|
94
|
-
|
|
95
|
-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
|
96
|
-
return if (notificationsEnabled) {
|
|
97
|
-
PermissionStatus.AUTHORIZED
|
|
98
|
-
} else {
|
|
99
|
-
PermissionStatus.DENIED
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
val granted =
|
|
104
|
-
ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) ==
|
|
105
|
-
PackageManager.PERMISSION_GRANTED
|
|
106
|
-
if (granted && notificationsEnabled) {
|
|
107
|
-
return PermissionStatus.AUTHORIZED
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
val asked =
|
|
111
|
-
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
|
112
|
-
.getBoolean(PREF_ASKED_PERMISSION, false)
|
|
113
|
-
return if (!asked && !granted) {
|
|
114
|
-
PermissionStatus.NOTDETERMINED
|
|
115
|
-
} else {
|
|
116
|
-
PermissionStatus.DENIED
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
fun requestPermission(onResult: (PermissionStatus) -> Unit) {
|
|
121
|
-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
|
122
|
-
onResult(getPermissionStatus())
|
|
123
|
-
return
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
val activity = currentActivity
|
|
127
|
-
val launcher = permissionLauncher
|
|
128
|
-
if (activity == null || launcher == null) {
|
|
129
|
-
onResult(getPermissionStatus())
|
|
130
|
-
return
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) ==
|
|
135
|
-
PackageManager.PERMISSION_GRANTED
|
|
136
|
-
) {
|
|
137
|
-
onResult(getPermissionStatus())
|
|
138
|
-
return
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
permissionWaiters.add(onResult)
|
|
142
|
-
launcher.launch(Manifest.permission.POST_NOTIFICATIONS)
|
|
143
|
-
}
|
|
144
|
-
|
|
145
82
|
fun fetchToken(): String {
|
|
146
83
|
val context = application
|
|
147
84
|
?: throw IllegalStateException("PushSignal is not initialized")
|
|
@@ -153,7 +90,7 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
|
|
|
153
90
|
FirebaseApp.getInstance()
|
|
154
91
|
} catch (error: IllegalStateException) {
|
|
155
92
|
throw IllegalStateException(
|
|
156
|
-
"Firebase is not configured. Call initialize({
|
|
93
|
+
"Firebase is not configured. Call initialize({ project_id, mobilesdk_app_id, current_key, project_number }) or add google-services.json.",
|
|
157
94
|
error
|
|
158
95
|
)
|
|
159
96
|
}
|
|
@@ -163,7 +100,7 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
|
|
|
163
100
|
Tasks.await(task)
|
|
164
101
|
} catch (error: Exception) {
|
|
165
102
|
throw IllegalStateException(
|
|
166
|
-
"Failed to get an FCM token. Call initialize({
|
|
103
|
+
"Failed to get an FCM token. Call initialize({ project_id, mobilesdk_app_id, current_key, project_number }) or add google-services.json.",
|
|
167
104
|
error
|
|
168
105
|
)
|
|
169
106
|
}
|
|
@@ -209,7 +146,6 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
|
|
|
209
146
|
override fun onActivityDestroyed(activity: Activity) {
|
|
210
147
|
if (currentActivity === activity) {
|
|
211
148
|
currentActivity = null
|
|
212
|
-
permissionLauncher = null
|
|
213
149
|
}
|
|
214
150
|
}
|
|
215
151
|
|
|
@@ -219,24 +155,6 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
|
|
|
219
155
|
}
|
|
220
156
|
|
|
221
157
|
val componentActivity = activity as? ComponentActivity ?: return
|
|
222
|
-
|
|
223
|
-
permissionLauncher =
|
|
224
|
-
componentActivity.activityResultRegistry.register(
|
|
225
|
-
PERMISSION_LAUNCHER_KEY,
|
|
226
|
-
componentActivity,
|
|
227
|
-
ActivityResultContracts.RequestPermission()
|
|
228
|
-
) {
|
|
229
|
-
activity
|
|
230
|
-
.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
|
231
|
-
.edit()
|
|
232
|
-
.putBoolean(PREF_ASKED_PERMISSION, true)
|
|
233
|
-
.apply()
|
|
234
|
-
val status = getPermissionStatus()
|
|
235
|
-
val waiters = permissionWaiters.toList()
|
|
236
|
-
permissionWaiters.clear()
|
|
237
|
-
waiters.forEach { it(status) }
|
|
238
|
-
}
|
|
239
|
-
|
|
240
158
|
componentActivity.addOnNewIntentListener { intent ->
|
|
241
159
|
handleIntent(intent)
|
|
242
160
|
}
|
|
@@ -251,25 +169,36 @@ internal object PushSignalCenter : Application.ActivityLifecycleCallbacks {
|
|
|
251
169
|
emitPress(intent.toPushMessage())
|
|
252
170
|
}
|
|
253
171
|
|
|
254
|
-
private fun applyFirebaseConfig(context: Context, config: AndroidFirebaseConfig) {
|
|
255
|
-
if (
|
|
256
|
-
return
|
|
172
|
+
private fun applyFirebaseConfig(context: Context, config: AndroidFirebaseConfig): Exception? {
|
|
173
|
+
if (FirebaseApp.getApps(context).isNotEmpty()) {
|
|
174
|
+
return null
|
|
257
175
|
}
|
|
258
176
|
|
|
259
|
-
|
|
177
|
+
if (!config.hasRequiredFields()) {
|
|
178
|
+
return null
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return try {
|
|
260
182
|
val options =
|
|
261
183
|
FirebaseOptions.Builder()
|
|
262
|
-
.setProjectId(config.
|
|
263
|
-
.setApplicationId(config.
|
|
264
|
-
.setApiKey(config.
|
|
265
|
-
.setGcmSenderId(config.
|
|
184
|
+
.setProjectId(config.project_id!!.trim())
|
|
185
|
+
.setApplicationId(config.mobilesdk_app_id!!.trim())
|
|
186
|
+
.setApiKey(config.current_key!!.trim())
|
|
187
|
+
.setGcmSenderId(config.project_number!!.trim())
|
|
266
188
|
.build()
|
|
267
189
|
FirebaseApp.initializeApp(context, options)
|
|
268
|
-
|
|
269
|
-
|
|
190
|
+
null
|
|
191
|
+
} catch (error: Exception) {
|
|
192
|
+
error
|
|
270
193
|
}
|
|
271
194
|
}
|
|
272
195
|
|
|
196
|
+
private fun finishInitialize(error: Exception?) {
|
|
197
|
+
val waiters = initializeWaiters.toList()
|
|
198
|
+
initializeWaiters.clear()
|
|
199
|
+
waiters.forEach { it(error) }
|
|
200
|
+
}
|
|
201
|
+
|
|
273
202
|
private fun emitPress(message: PushMessage) {
|
|
274
203
|
val listener = onNotificationPress
|
|
275
204
|
if (listener != null) {
|
|
@@ -335,10 +264,10 @@ private fun Intent.toPushMessage(): PushMessage {
|
|
|
335
264
|
}
|
|
336
265
|
|
|
337
266
|
private fun AndroidFirebaseConfig.hasRequiredFields(): Boolean {
|
|
338
|
-
return !
|
|
339
|
-
!
|
|
340
|
-
!
|
|
341
|
-
!
|
|
267
|
+
return !project_id.isNullOrBlank() &&
|
|
268
|
+
!mobilesdk_app_id.isNullOrBlank() &&
|
|
269
|
+
!current_key.isNullOrBlank() &&
|
|
270
|
+
!project_number.isNullOrBlank()
|
|
342
271
|
}
|
|
343
272
|
|
|
344
273
|
private const val EXTRA_HANDLED_KEY = "pushsignal.handled"
|
package/ios/PushSignal.swift
CHANGED
|
@@ -6,19 +6,10 @@ class PushSignal: HybridPushSignalSpec {
|
|
|
6
6
|
PushSignalCenter.shared.install()
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
func initialize(config: AndroidFirebaseConfig) throws {
|
|
9
|
+
func initialize(config: AndroidFirebaseConfig) throws -> Promise<Void> {
|
|
10
10
|
_ = config
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
func getPermissionStatus() throws -> Promise<PermissionStatus> {
|
|
14
|
-
return Promise.async {
|
|
15
|
-
await PushSignalCenter.shared.permissionStatus()
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
func requestPermission() throws -> Promise<PermissionStatus> {
|
|
20
11
|
return Promise.async {
|
|
21
|
-
|
|
12
|
+
()
|
|
22
13
|
}
|
|
23
14
|
}
|
|
24
15
|
|
|
@@ -46,28 +46,6 @@ final class PushSignalCenter: NSObject, UNUserNotificationCenterDelegate {
|
|
|
46
46
|
captureLaunchNotificationIfNeeded()
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
func permissionStatus() async -> PermissionStatus {
|
|
50
|
-
await withCheckedContinuation { continuation in
|
|
51
|
-
UNUserNotificationCenter.current().getNotificationSettings { settings in
|
|
52
|
-
continuation.resume(returning: Self.map(settings.authorizationStatus))
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
func requestPermission() async -> PermissionStatus {
|
|
58
|
-
do {
|
|
59
|
-
let granted = try await UNUserNotificationCenter.current()
|
|
60
|
-
.requestAuthorization(options: [.alert, .badge, .sound])
|
|
61
|
-
if granted {
|
|
62
|
-
return await permissionStatus()
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return await permissionStatus()
|
|
66
|
-
} catch {
|
|
67
|
-
return .denied
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
49
|
func fetchCredentials() async throws -> PushCredentials {
|
|
72
50
|
await MainActor.run {
|
|
73
51
|
self.installOnMain()
|
|
@@ -267,19 +245,6 @@ final class PushSignalCenter: NSObject, UNUserNotificationCenterDelegate {
|
|
|
267
245
|
}
|
|
268
246
|
}
|
|
269
247
|
|
|
270
|
-
private static func map(_ status: UNAuthorizationStatus) -> PermissionStatus {
|
|
271
|
-
switch status {
|
|
272
|
-
case .authorized, .provisional, .ephemeral:
|
|
273
|
-
return .authorized
|
|
274
|
-
case .denied:
|
|
275
|
-
return .denied
|
|
276
|
-
case .notDetermined:
|
|
277
|
-
return .notdetermined
|
|
278
|
-
@unknown default:
|
|
279
|
-
return .denied
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
248
|
private static func message(from notification: UNNotification) -> PushMessage {
|
|
284
249
|
let content = notification.request.content
|
|
285
250
|
return message(
|
package/lib/module/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
export { getCredentials,
|
|
3
|
+
export { getCredentials, initialize, onMessage, onNotificationPress } from './pushSignal';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getCredentials","
|
|
1
|
+
{"version":3,"names":["getCredentials","initialize","onMessage","onNotificationPress"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAOA,SACEA,cAAc,EACdC,UAAU,EACVC,SAAS,EACTC,mBAAmB,QACd,cAAc","ignoreList":[]}
|
package/lib/module/pushSignal.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
export function initialize(_config = {}) {}
|
|
4
|
-
export async function getPermissionStatus() {
|
|
5
|
-
return 'denied';
|
|
6
|
-
}
|
|
7
|
-
export async function requestPermission() {
|
|
8
|
-
return 'denied';
|
|
9
|
-
}
|
|
3
|
+
export async function initialize(_config = {}) {}
|
|
10
4
|
export async function getCredentials() {
|
|
11
5
|
throw new Error('Push credentials are not supported on web');
|
|
12
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["initialize","_config","
|
|
1
|
+
{"version":3,"names":["initialize","_config","getCredentials","Error","onMessage","_listener","onNotificationPress"],"sourceRoot":"../../src","sources":["pushSignal.tsx"],"mappings":";;AAMA,OAAO,eAAeA,UAAUA,CAC9BC,OAA8B,GAAG,CAAC,CAAC,EACpB,CAAC;AAElB,OAAO,eAAeC,cAAcA,CAAA,EAA6B;EAC/D,MAAM,IAAIC,KAAK,CAAC,2CAA2C,CAAC;AAC9D;AAEA,OAAO,SAASC,SAASA,CACvBC,SAAyC,EAC7B;EACZ,OAAO,MAAM,CAAC,CAAC;AACjB;AAEA,OAAO,SAASC,mBAAmBA,CACjCD,SAAyC,EAC7B;EACZ,OAAO,MAAM,CAAC,CAAC;AACjB","ignoreList":[]}
|
|
@@ -18,13 +18,7 @@ function bindNativeCallbacks() {
|
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
20
|
export function initialize(config = {}) {
|
|
21
|
-
PushSignalHybridObject.initialize(config);
|
|
22
|
-
}
|
|
23
|
-
export function getPermissionStatus() {
|
|
24
|
-
return PushSignalHybridObject.getPermissionStatus();
|
|
25
|
-
}
|
|
26
|
-
export function requestPermission() {
|
|
27
|
-
return PushSignalHybridObject.requestPermission();
|
|
21
|
+
return PushSignalHybridObject.initialize(config);
|
|
28
22
|
}
|
|
29
23
|
export function getCredentials() {
|
|
30
24
|
return PushSignalHybridObject.getCredentials();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NitroModules","PushSignalHybridObject","createHybridObject","messageListeners","Set","pressListeners","nativeCallbacksBound","bindNativeCallbacks","setOnMessage","message","forEach","listener","setOnNotificationPress","initialize","config","
|
|
1
|
+
{"version":3,"names":["NitroModules","PushSignalHybridObject","createHybridObject","messageListeners","Set","pressListeners","nativeCallbacksBound","bindNativeCallbacks","setOnMessage","message","forEach","listener","setOnNotificationPress","initialize","config","getCredentials","onMessage","add","delete","onNotificationPress"],"sourceRoot":"../../src","sources":["pushSignal.native.tsx"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAQzD,MAAMC,sBAAsB,GAC1BD,YAAY,CAACE,kBAAkB,CAAa,YAAY,CAAC;AAE3D,MAAMC,gBAAgB,GAAG,IAAIC,GAAG,CAAiC,CAAC;AAClE,MAAMC,cAAc,GAAG,IAAID,GAAG,CAAiC,CAAC;AAChE,IAAIE,oBAAoB,GAAG,KAAK;AAEhC,SAASC,mBAAmBA,CAAA,EAAG;EAC7B,IAAID,oBAAoB,EAAE;IACxB;EACF;EAEAA,oBAAoB,GAAG,IAAI;EAE3BL,sBAAsB,CAACO,YAAY,CAAEC,OAAO,IAAK;IAC/CN,gBAAgB,CAACO,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACF,OAAO,CAAC,CAAC;EAC3D,CAAC,CAAC;EAEFR,sBAAsB,CAACW,sBAAsB,CAAEH,OAAO,IAAK;IACzDJ,cAAc,CAACK,OAAO,CAAEC,QAAQ,IAAKA,QAAQ,CAACF,OAAO,CAAC,CAAC;EACzD,CAAC,CAAC;AACJ;AAEA,OAAO,SAASI,UAAUA,CAACC,MAA6B,GAAG,CAAC,CAAC,EAAiB;EAC5E,OAAOb,sBAAsB,CAACY,UAAU,CAACC,MAAM,CAAC;AAClD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAA6B;EACzD,OAAOd,sBAAsB,CAACc,cAAc,CAAC,CAAC;AAChD;AAEA,OAAO,SAASC,SAASA,CACvBL,QAAwC,EAC5B;EACZJ,mBAAmB,CAAC,CAAC;EACrBJ,gBAAgB,CAACc,GAAG,CAACN,QAAQ,CAAC;EAC9B,OAAO,MAAM;IACXR,gBAAgB,CAACe,MAAM,CAACP,QAAQ,CAAC;EACnC,CAAC;AACH;AAEA,OAAO,SAASQ,mBAAmBA,CACjCR,QAAwC,EAC5B;EACZJ,mBAAmB,CAAC,CAAC;EACrBF,cAAc,CAACY,GAAG,CAACN,QAAQ,CAAC;EAC5B,OAAO,MAAM;IACXN,cAAc,CAACa,MAAM,CAACP,QAAQ,CAAC;EACjC,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
-
|
|
3
|
-
export type PushPlatform = 'ios' | '
|
|
2
|
+
/** JS/C++ name cannot be `android`: NDK defines `-DANDROID` and breaks the generated enum. */
|
|
3
|
+
export type PushPlatform = 'ios' | 'android_os';
|
|
4
4
|
export type PushEnvironment = 'sandbox' | 'production';
|
|
5
5
|
export interface PushCredentials {
|
|
6
6
|
platform: PushPlatform;
|
|
@@ -14,18 +14,16 @@ export interface PushMessage {
|
|
|
14
14
|
data: Record<string, string>;
|
|
15
15
|
}
|
|
16
16
|
export interface AndroidFirebaseConfig {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
project_id?: string;
|
|
18
|
+
mobilesdk_app_id?: string;
|
|
19
|
+
current_key?: string;
|
|
20
|
+
project_number?: string;
|
|
21
21
|
}
|
|
22
22
|
export interface PushSignal extends HybridObject<{
|
|
23
23
|
ios: 'swift';
|
|
24
24
|
android: 'kotlin';
|
|
25
25
|
}> {
|
|
26
|
-
initialize(config: AndroidFirebaseConfig): void
|
|
27
|
-
getPermissionStatus(): Promise<PermissionStatus>;
|
|
28
|
-
requestPermission(): Promise<PermissionStatus>;
|
|
26
|
+
initialize(config: AndroidFirebaseConfig): Promise<void>;
|
|
29
27
|
getCredentials(): Promise<PushCredentials>;
|
|
30
28
|
setOnMessage(callback: (message: PushMessage) => void): void;
|
|
31
29
|
setOnNotificationPress(callback: (message: PushMessage) => void): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PushSignal.nitro.d.ts","sourceRoot":"","sources":["../../../src/PushSignal.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,
|
|
1
|
+
{"version":3,"file":"PushSignal.nitro.d.ts","sourceRoot":"","sources":["../../../src/PushSignal.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,8FAA8F;AAC9F,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,YAAY,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY,CAAC;IAC/C,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;IACA,UAAU,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,sBAAsB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;CACxE"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { AndroidFirebaseConfig,
|
|
2
|
-
export { getCredentials,
|
|
1
|
+
export type { AndroidFirebaseConfig, PushCredentials, PushEnvironment, PushMessage, PushPlatform, } from './PushSignal.nitro.js';
|
|
2
|
+
export { getCredentials, initialize, onMessage, onNotificationPress, } from './pushSignal';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,uBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,UAAU,EACV,SAAS,EACT,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import type { AndroidFirebaseConfig,
|
|
2
|
-
export declare function initialize(_config?: AndroidFirebaseConfig): void
|
|
3
|
-
export declare function getPermissionStatus(): Promise<PermissionStatus>;
|
|
4
|
-
export declare function requestPermission(): Promise<PermissionStatus>;
|
|
1
|
+
import type { AndroidFirebaseConfig, PushCredentials, PushMessage } from './PushSignal.nitro.js';
|
|
2
|
+
export declare function initialize(_config?: AndroidFirebaseConfig): Promise<void>;
|
|
5
3
|
export declare function getCredentials(): Promise<PushCredentials>;
|
|
6
4
|
export declare function onMessage(_listener: (message: PushMessage) => void): () => void;
|
|
7
5
|
export declare function onNotificationPress(_listener: (message: PushMessage) => void): () => void;
|