react-native-push-signal 0.1.0
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/LICENSE +20 -0
- package/PushSignal.podspec +31 -0
- package/README.md +125 -0
- package/README.ru.md +125 -0
- package/android/CMakeLists.txt +24 -0
- package/android/build.gradle +115 -0
- package/android/src/main/AndroidManifest.xml +18 -0
- package/android/src/main/cpp/cpp-adapter.cpp +11 -0
- package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignal.kt +44 -0
- package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalCenter.kt +353 -0
- package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalInitProvider.kt +34 -0
- package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalMessagingService.kt +15 -0
- package/android/src/main/java/com/margelo/nitro/pushsignal/PushSignalPackage.kt +22 -0
- package/ios/PushSignal.swift +38 -0
- package/ios/PushSignalCenter.swift +430 -0
- package/ios/PushSignalLaunchStore.h +21 -0
- package/ios/PushSignalLaunchStore.m +26 -0
- package/lib/module/PushSignal.nitro.js +4 -0
- package/lib/module/PushSignal.nitro.js.map +1 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/pushSignal.js +19 -0
- package/lib/module/pushSignal.js.map +1 -0
- package/lib/module/pushSignal.native.js +46 -0
- package/lib/module/pushSignal.native.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/PushSignal.nitro.d.ts +33 -0
- package/lib/typescript/src/PushSignal.nitro.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/pushSignal.d.ts +8 -0
- package/lib/typescript/src/pushSignal.d.ts.map +1 -0
- package/lib/typescript/src/pushSignal.native.d.ts +8 -0
- package/lib/typescript/src/pushSignal.native.d.ts.map +1 -0
- package/nitro.json +23 -0
- package/nitrogen/generated/android/c++/JAndroidFirebaseConfig.hpp +70 -0
- package/nitrogen/generated/android/c++/JFunc_void_PushMessage.hpp +80 -0
- package/nitrogen/generated/android/c++/JHybridPushSignalSpec.cpp +138 -0
- package/nitrogen/generated/android/c++/JHybridPushSignalSpec.hpp +68 -0
- package/nitrogen/generated/android/c++/JPermissionStatus.hpp +61 -0
- package/nitrogen/generated/android/c++/JPushCredentials.hpp +70 -0
- package/nitrogen/generated/android/c++/JPushEnvironment.hpp +58 -0
- package/nitrogen/generated/android/c++/JPushMessage.hpp +84 -0
- package/nitrogen/generated/android/c++/JPushPlatform.hpp +58 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/AndroidFirebaseConfig.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/Func_void_PushMessage.kt +78 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/HybridPushSignalSpec.kt +87 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PermissionStatus.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushCredentials.kt +61 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushEnvironment.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushMessage.kt +66 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/PushPlatform.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/pushsignal/pushsignalOnLoad.kt +35 -0
- package/nitrogen/generated/android/pushsignal+autolinking.cmake +81 -0
- package/nitrogen/generated/android/pushsignal+autolinking.gradle +27 -0
- package/nitrogen/generated/android/pushsignalOnLoad.cpp +56 -0
- package/nitrogen/generated/android/pushsignalOnLoad.hpp +34 -0
- package/nitrogen/generated/ios/PushSignal+autolinking.rb +62 -0
- package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Bridge.cpp +65 -0
- package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Bridge.hpp +257 -0
- package/nitrogen/generated/ios/PushSignal-Swift-Cxx-Umbrella.hpp +66 -0
- package/nitrogen/generated/ios/PushSignalAutolinking.mm +33 -0
- package/nitrogen/generated/ios/PushSignalAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridPushSignalSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridPushSignalSpecSwift.hpp +137 -0
- package/nitrogen/generated/ios/swift/AndroidFirebaseConfig.swift +96 -0
- package/nitrogen/generated/ios/swift/Func_void_PermissionStatus.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PushCredentials.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_PushMessage.swift +46 -0
- package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
- package/nitrogen/generated/ios/swift/HybridPushSignalSpec.swift +60 -0
- package/nitrogen/generated/ios/swift/HybridPushSignalSpec_cxx.swift +226 -0
- package/nitrogen/generated/ios/swift/PermissionStatus.swift +44 -0
- package/nitrogen/generated/ios/swift/PushCredentials.swift +45 -0
- package/nitrogen/generated/ios/swift/PushEnvironment.swift +40 -0
- package/nitrogen/generated/ios/swift/PushMessage.swift +97 -0
- package/nitrogen/generated/ios/swift/PushPlatform.swift +40 -0
- package/nitrogen/generated/shared/c++/AndroidFirebaseConfig.hpp +96 -0
- package/nitrogen/generated/shared/c++/HybridPushSignalSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridPushSignalSpec.hpp +79 -0
- package/nitrogen/generated/shared/c++/PermissionStatus.hpp +80 -0
- package/nitrogen/generated/shared/c++/PushCredentials.hpp +97 -0
- package/nitrogen/generated/shared/c++/PushEnvironment.hpp +76 -0
- package/nitrogen/generated/shared/c++/PushMessage.hpp +97 -0
- package/nitrogen/generated/shared/c++/PushPlatform.hpp +76 -0
- package/package.json +187 -0
- package/src/PushSignal.nitro.ts +37 -0
- package/src/index.tsx +16 -0
- package/src/pushSignal.native.tsx +67 -0
- package/src/pushSignal.tsx +32 -0
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import ObjectiveC
|
|
3
|
+
import UIKit
|
|
4
|
+
import UserNotifications
|
|
5
|
+
|
|
6
|
+
@objc(PushSignalCenter)
|
|
7
|
+
final class PushSignalCenter: NSObject, UNUserNotificationCenterDelegate {
|
|
8
|
+
@objc static let shared = PushSignalCenter()
|
|
9
|
+
|
|
10
|
+
@objc static func bootstrap(launchOptions: [AnyHashable: Any]?) {
|
|
11
|
+
shared.pendingLaunchOptions = launchOptions
|
|
12
|
+
shared.install()
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
private let lock = NSLock()
|
|
16
|
+
private var didInstall = false
|
|
17
|
+
private var deviceToken: String?
|
|
18
|
+
private var registrationError: Error?
|
|
19
|
+
private var tokenWaiters: [(Result<String, Error>) -> Void] = []
|
|
20
|
+
private var pendingPress: PushMessage?
|
|
21
|
+
private var pendingLaunchOptions: [AnyHashable: Any]?
|
|
22
|
+
private var didCaptureLaunchNotification = false
|
|
23
|
+
|
|
24
|
+
var onMessage: ((PushMessage) -> Void)?
|
|
25
|
+
var onNotificationPress: ((PushMessage) -> Void)? {
|
|
26
|
+
didSet {
|
|
27
|
+
flushPendingPress()
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func install() {
|
|
32
|
+
DispatchQueue.main.async {
|
|
33
|
+
self.installOnMain()
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private func installOnMain() {
|
|
38
|
+
guard !didInstall else {
|
|
39
|
+
captureLaunchNotificationIfNeeded()
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
didInstall = true
|
|
44
|
+
UNUserNotificationCenter.current().delegate = self
|
|
45
|
+
swizzleAppDelegate()
|
|
46
|
+
captureLaunchNotificationIfNeeded()
|
|
47
|
+
}
|
|
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
|
+
func fetchCredentials() async throws -> PushCredentials {
|
|
72
|
+
await MainActor.run {
|
|
73
|
+
self.installOnMain()
|
|
74
|
+
UIApplication.shared.registerForRemoteNotifications()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let token = try await waitForToken()
|
|
78
|
+
return PushCredentials(
|
|
79
|
+
platform: .ios,
|
|
80
|
+
token: token,
|
|
81
|
+
environment: currentEnvironment()
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
func handleDeviceToken(_ deviceToken: Data) {
|
|
86
|
+
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
|
|
87
|
+
finishRegistration(result: .success(token))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
func handleRegistrationError(_ error: Error) {
|
|
91
|
+
finishRegistration(result: .failure(error))
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
func userNotificationCenter(
|
|
95
|
+
_ center: UNUserNotificationCenter,
|
|
96
|
+
willPresent notification: UNNotification,
|
|
97
|
+
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
|
|
98
|
+
) {
|
|
99
|
+
emitMessage(Self.message(from: notification))
|
|
100
|
+
completionHandler([])
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
func userNotificationCenter(
|
|
104
|
+
_ center: UNUserNotificationCenter,
|
|
105
|
+
didReceive response: UNNotificationResponse,
|
|
106
|
+
withCompletionHandler completionHandler: @escaping () -> Void
|
|
107
|
+
) {
|
|
108
|
+
emitPress(Self.message(from: response.notification))
|
|
109
|
+
completionHandler()
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private func waitForToken() async throws -> String {
|
|
113
|
+
if let deviceToken {
|
|
114
|
+
return deviceToken
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if let registrationError {
|
|
118
|
+
throw registrationError
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return try await withCheckedThrowingContinuation { continuation in
|
|
122
|
+
var didResume = false
|
|
123
|
+
let finish: (Result<String, Error>) -> Void = { result in
|
|
124
|
+
guard !didResume else {
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
didResume = true
|
|
128
|
+
continuation.resume(with: result)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
lock.lock()
|
|
132
|
+
if let deviceToken {
|
|
133
|
+
lock.unlock()
|
|
134
|
+
finish(.success(deviceToken))
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
if let registrationError {
|
|
138
|
+
lock.unlock()
|
|
139
|
+
finish(.failure(registrationError))
|
|
140
|
+
return
|
|
141
|
+
}
|
|
142
|
+
tokenWaiters.append(finish)
|
|
143
|
+
lock.unlock()
|
|
144
|
+
|
|
145
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
|
|
146
|
+
let timeout = NSError(
|
|
147
|
+
domain: "PushSignal",
|
|
148
|
+
code: 1,
|
|
149
|
+
userInfo: [
|
|
150
|
+
NSLocalizedDescriptionKey:
|
|
151
|
+
"APNs registration timed out. Use a physical iOS device and enable the Push Notifications capability.",
|
|
152
|
+
]
|
|
153
|
+
)
|
|
154
|
+
PushSignalCenter.shared.finishRegistration(result: .failure(timeout))
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private func finishRegistration(result: Result<String, Error>) {
|
|
160
|
+
lock.lock()
|
|
161
|
+
switch result {
|
|
162
|
+
case let .success(token):
|
|
163
|
+
deviceToken = token
|
|
164
|
+
registrationError = nil
|
|
165
|
+
case let .failure(error):
|
|
166
|
+
if deviceToken == nil {
|
|
167
|
+
registrationError = error
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
let waiters = tokenWaiters
|
|
171
|
+
tokenWaiters.removeAll()
|
|
172
|
+
lock.unlock()
|
|
173
|
+
|
|
174
|
+
waiters.forEach { $0(result) }
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private func emitMessage(_ message: PushMessage) {
|
|
178
|
+
DispatchQueue.main.async {
|
|
179
|
+
self.onMessage?(message)
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
private func emitPress(_ message: PushMessage) {
|
|
184
|
+
DispatchQueue.main.async {
|
|
185
|
+
if let onNotificationPress = self.onNotificationPress {
|
|
186
|
+
onNotificationPress(message)
|
|
187
|
+
} else {
|
|
188
|
+
self.pendingPress = message
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private func flushPendingPress() {
|
|
194
|
+
DispatchQueue.main.async {
|
|
195
|
+
guard let pendingPress = self.pendingPress, let onNotificationPress = self.onNotificationPress else {
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
self.pendingPress = nil
|
|
200
|
+
onNotificationPress(pendingPress)
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private func captureLaunchNotificationIfNeeded() {
|
|
205
|
+
guard !didCaptureLaunchNotification else {
|
|
206
|
+
return
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if pendingLaunchOptions == nil {
|
|
210
|
+
pendingLaunchOptions = PushSignalCopyLaunchOptions() as? [AnyHashable: Any]
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
let launchOptions = pendingLaunchOptions
|
|
214
|
+
guard let launchOptions else {
|
|
215
|
+
return
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
didCaptureLaunchNotification = true
|
|
219
|
+
|
|
220
|
+
let key = UIApplication.LaunchOptionsKey.remoteNotification
|
|
221
|
+
let payload = launchOptions[key] as? [AnyHashable: Any]
|
|
222
|
+
?? launchOptions[key.rawValue] as? [AnyHashable: Any]
|
|
223
|
+
guard let payload else {
|
|
224
|
+
return
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
emitPress(Self.message(from: payload, fallbackId: "launch"))
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
private func currentEnvironment() -> PushEnvironment {
|
|
231
|
+
if let environment = Self.apsEnvironment() {
|
|
232
|
+
return environment
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
#if DEBUG
|
|
236
|
+
return .sandbox
|
|
237
|
+
#else
|
|
238
|
+
return .production
|
|
239
|
+
#endif
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private static func apsEnvironment() -> PushEnvironment? {
|
|
243
|
+
guard let url = Bundle.main.url(forResource: "embedded", withExtension: "mobileprovision"),
|
|
244
|
+
let data = try? Data(contentsOf: url),
|
|
245
|
+
let contents = String(data: data, encoding: .ascii),
|
|
246
|
+
let regex = try? NSRegularExpression(
|
|
247
|
+
pattern: "<key>aps-environment</key>\\s*<string>(\\w+)</string>"
|
|
248
|
+
)
|
|
249
|
+
else {
|
|
250
|
+
return nil
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
let range = NSRange(contents.startIndex..<contents.endIndex, in: contents)
|
|
254
|
+
guard let match = regex.firstMatch(in: contents, range: range),
|
|
255
|
+
let valueRange = Range(match.range(at: 1), in: contents)
|
|
256
|
+
else {
|
|
257
|
+
return nil
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
switch contents[valueRange] {
|
|
261
|
+
case "development":
|
|
262
|
+
return .sandbox
|
|
263
|
+
case "production":
|
|
264
|
+
return .production
|
|
265
|
+
default:
|
|
266
|
+
return nil
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
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
|
+
private static func message(from notification: UNNotification) -> PushMessage {
|
|
284
|
+
let content = notification.request.content
|
|
285
|
+
return message(
|
|
286
|
+
from: content.userInfo,
|
|
287
|
+
fallbackId: notification.request.identifier,
|
|
288
|
+
title: content.title.isEmpty ? nil : content.title,
|
|
289
|
+
body: content.body.isEmpty ? nil : content.body
|
|
290
|
+
)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
private static func message(
|
|
294
|
+
from userInfo: [AnyHashable: Any],
|
|
295
|
+
fallbackId: String? = nil,
|
|
296
|
+
title: String? = nil,
|
|
297
|
+
body: String? = nil
|
|
298
|
+
) -> PushMessage {
|
|
299
|
+
let aps = userInfo["aps"] as? [AnyHashable: Any]
|
|
300
|
+
let alert = aps?["alert"]
|
|
301
|
+
var resolvedTitle = title
|
|
302
|
+
var resolvedBody = body
|
|
303
|
+
|
|
304
|
+
if let alertText = alert as? String {
|
|
305
|
+
resolvedBody = resolvedBody ?? alertText
|
|
306
|
+
} else if let alertDict = alert as? [AnyHashable: Any] {
|
|
307
|
+
resolvedTitle = resolvedTitle ?? stringify(alertDict["title"])
|
|
308
|
+
resolvedBody = resolvedBody ?? stringify(alertDict["body"])
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
var data: [String: String] = [:]
|
|
312
|
+
for (key, value) in userInfo {
|
|
313
|
+
let stringKey = String(describing: key)
|
|
314
|
+
if stringKey == "aps" {
|
|
315
|
+
continue
|
|
316
|
+
}
|
|
317
|
+
if let stringValue = stringify(value) {
|
|
318
|
+
data[stringKey] = stringValue
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return PushMessage(
|
|
323
|
+
id: stringify(userInfo["gcm.message_id"]) ?? fallbackId,
|
|
324
|
+
title: resolvedTitle,
|
|
325
|
+
body: resolvedBody,
|
|
326
|
+
data: data
|
|
327
|
+
)
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
private static func stringify(_ value: Any?) -> String? {
|
|
331
|
+
guard let value else {
|
|
332
|
+
return nil
|
|
333
|
+
}
|
|
334
|
+
if let value = value as? String {
|
|
335
|
+
return value
|
|
336
|
+
}
|
|
337
|
+
if let value = value as? NSNumber {
|
|
338
|
+
return value.stringValue
|
|
339
|
+
}
|
|
340
|
+
if JSONSerialization.isValidJSONObject(value),
|
|
341
|
+
let data = try? JSONSerialization.data(withJSONObject: value),
|
|
342
|
+
let json = String(data: data, encoding: .utf8)
|
|
343
|
+
{
|
|
344
|
+
return json
|
|
345
|
+
}
|
|
346
|
+
return String(describing: value)
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
private func swizzleAppDelegate() {
|
|
350
|
+
guard let appDelegate = UIApplication.shared.delegate else {
|
|
351
|
+
return
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
let target: AnyClass = type(of: appDelegate)
|
|
355
|
+
let source: AnyClass = PushSignalAppDelegateHook.self
|
|
356
|
+
|
|
357
|
+
swizzle(
|
|
358
|
+
target: target,
|
|
359
|
+
original: #selector(UIApplicationDelegate.application(_:didRegisterForRemoteNotificationsWithDeviceToken:)),
|
|
360
|
+
replacement: #selector(PushSignalAppDelegateHook.pushSignal_application(_:didRegisterForRemoteNotificationsWithDeviceToken:)),
|
|
361
|
+
source: source
|
|
362
|
+
)
|
|
363
|
+
swizzle(
|
|
364
|
+
target: target,
|
|
365
|
+
original: #selector(UIApplicationDelegate.application(_:didFailToRegisterForRemoteNotificationsWithError:)),
|
|
366
|
+
replacement: #selector(PushSignalAppDelegateHook.pushSignal_application(_:didFailToRegisterForRemoteNotificationsWithError:)),
|
|
367
|
+
source: source
|
|
368
|
+
)
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
private func swizzle(target: AnyClass, original: Selector, replacement: Selector, source: AnyClass) {
|
|
372
|
+
guard let replacementMethod = class_getInstanceMethod(source, replacement) else {
|
|
373
|
+
return
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
let replacementImp = method_getImplementation(replacementMethod)
|
|
377
|
+
let types = method_getTypeEncoding(replacementMethod)
|
|
378
|
+
|
|
379
|
+
if class_addMethod(target, original, replacementImp, types) {
|
|
380
|
+
return
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
guard class_addMethod(target, replacement, replacementImp, types),
|
|
384
|
+
let originalMethod = class_getInstanceMethod(target, original),
|
|
385
|
+
let addedReplacement = class_getInstanceMethod(target, replacement)
|
|
386
|
+
else {
|
|
387
|
+
return
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
method_exchangeImplementations(originalMethod, addedReplacement)
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
private final class PushSignalAppDelegateHook: NSObject {
|
|
395
|
+
@objc func pushSignal_application(
|
|
396
|
+
_ application: UIApplication,
|
|
397
|
+
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
|
|
398
|
+
) {
|
|
399
|
+
PushSignalCenter.shared.handleDeviceToken(deviceToken)
|
|
400
|
+
let selector = #selector(
|
|
401
|
+
PushSignalAppDelegateHook.pushSignal_application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
|
|
402
|
+
)
|
|
403
|
+
guard responds(to: selector),
|
|
404
|
+
let method = class_getInstanceMethod(type(of: self), selector)
|
|
405
|
+
else {
|
|
406
|
+
return
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
typealias Fn = @convention(c) (Any, Selector, UIApplication, Data) -> Void
|
|
410
|
+
unsafeBitCast(method_getImplementation(method), to: Fn.self)(self, selector, application, deviceToken)
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
@objc func pushSignal_application(
|
|
414
|
+
_ application: UIApplication,
|
|
415
|
+
didFailToRegisterForRemoteNotificationsWithError error: Error
|
|
416
|
+
) {
|
|
417
|
+
PushSignalCenter.shared.handleRegistrationError(error)
|
|
418
|
+
let selector = #selector(
|
|
419
|
+
PushSignalAppDelegateHook.pushSignal_application(_:didFailToRegisterForRemoteNotificationsWithError:)
|
|
420
|
+
)
|
|
421
|
+
guard responds(to: selector),
|
|
422
|
+
let method = class_getInstanceMethod(type(of: self), selector)
|
|
423
|
+
else {
|
|
424
|
+
return
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
typealias Fn = @convention(c) (Any, Selector, UIApplication, NSError) -> Void
|
|
428
|
+
unsafeBitCast(method_getImplementation(method), to: Fn.self)(self, selector, application, error as NSError)
|
|
429
|
+
}
|
|
430
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
|
|
3
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
4
|
+
|
|
5
|
+
#ifdef __cplusplus
|
|
6
|
+
extern "C" {
|
|
7
|
+
#endif
|
|
8
|
+
|
|
9
|
+
NSDictionary * _Nullable PushSignalCopyLaunchOptions(void);
|
|
10
|
+
|
|
11
|
+
#ifdef __cplusplus
|
|
12
|
+
}
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
@interface PushSignalLaunchStore : NSObject
|
|
16
|
+
|
|
17
|
+
+ (nullable NSDictionary *)launchOptions;
|
|
18
|
+
|
|
19
|
+
@end
|
|
20
|
+
|
|
21
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#import "PushSignalLaunchStore.h"
|
|
2
|
+
#import <UIKit/UIKit.h>
|
|
3
|
+
|
|
4
|
+
static NSDictionary *sLaunchOptions;
|
|
5
|
+
|
|
6
|
+
NSDictionary *PushSignalCopyLaunchOptions(void) {
|
|
7
|
+
return sLaunchOptions;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@implementation PushSignalLaunchStore
|
|
11
|
+
|
|
12
|
+
+ (void)load {
|
|
13
|
+
[[NSNotificationCenter defaultCenter]
|
|
14
|
+
addObserverForName:UIApplicationDidFinishLaunchingNotification
|
|
15
|
+
object:nil
|
|
16
|
+
queue:nil
|
|
17
|
+
usingBlock:^(NSNotification *notification) {
|
|
18
|
+
sLaunchOptions = [notification.userInfo copy];
|
|
19
|
+
}];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
+ (NSDictionary *)launchOptions {
|
|
23
|
+
return sLaunchOptions;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["PushSignal.nitro.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getCredentials","getPermissionStatus","initialize","onMessage","onNotificationPress","requestPermission"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAQA,SACEA,cAAc,EACdC,mBAAmB,EACnBC,UAAU,EACVC,SAAS,EACTC,mBAAmB,EACnBC,iBAAiB,QACZ,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export function initialize(_config = {}) {}
|
|
4
|
+
export async function getPermissionStatus() {
|
|
5
|
+
return 'denied';
|
|
6
|
+
}
|
|
7
|
+
export async function requestPermission() {
|
|
8
|
+
return 'denied';
|
|
9
|
+
}
|
|
10
|
+
export async function getCredentials() {
|
|
11
|
+
throw new Error('Push credentials are not supported on web');
|
|
12
|
+
}
|
|
13
|
+
export function onMessage(_listener) {
|
|
14
|
+
return () => {};
|
|
15
|
+
}
|
|
16
|
+
export function onNotificationPress(_listener) {
|
|
17
|
+
return () => {};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=pushSignal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["initialize","_config","getPermissionStatus","requestPermission","getCredentials","Error","onMessage","_listener","onNotificationPress"],"sourceRoot":"../../src","sources":["pushSignal.tsx"],"mappings":";;AAOA,OAAO,SAASA,UAAUA,CAACC,OAA8B,GAAG,CAAC,CAAC,EAAQ,CAAC;AAEvE,OAAO,eAAeC,mBAAmBA,CAAA,EAA8B;EACrE,OAAO,QAAQ;AACjB;AAEA,OAAO,eAAeC,iBAAiBA,CAAA,EAA8B;EACnE,OAAO,QAAQ;AACjB;AAEA,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":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NitroModules } from 'react-native-nitro-modules';
|
|
4
|
+
const PushSignalHybridObject = NitroModules.createHybridObject('PushSignal');
|
|
5
|
+
const messageListeners = new Set();
|
|
6
|
+
const pressListeners = new Set();
|
|
7
|
+
let nativeCallbacksBound = false;
|
|
8
|
+
function bindNativeCallbacks() {
|
|
9
|
+
if (nativeCallbacksBound) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
nativeCallbacksBound = true;
|
|
13
|
+
PushSignalHybridObject.setOnMessage(message => {
|
|
14
|
+
messageListeners.forEach(listener => listener(message));
|
|
15
|
+
});
|
|
16
|
+
PushSignalHybridObject.setOnNotificationPress(message => {
|
|
17
|
+
pressListeners.forEach(listener => listener(message));
|
|
18
|
+
});
|
|
19
|
+
}
|
|
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();
|
|
28
|
+
}
|
|
29
|
+
export function getCredentials() {
|
|
30
|
+
return PushSignalHybridObject.getCredentials();
|
|
31
|
+
}
|
|
32
|
+
export function onMessage(listener) {
|
|
33
|
+
bindNativeCallbacks();
|
|
34
|
+
messageListeners.add(listener);
|
|
35
|
+
return () => {
|
|
36
|
+
messageListeners.delete(listener);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function onNotificationPress(listener) {
|
|
40
|
+
bindNativeCallbacks();
|
|
41
|
+
pressListeners.add(listener);
|
|
42
|
+
return () => {
|
|
43
|
+
pressListeners.delete(listener);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=pushSignal.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NitroModules","PushSignalHybridObject","createHybridObject","messageListeners","Set","pressListeners","nativeCallbacksBound","bindNativeCallbacks","setOnMessage","message","forEach","listener","setOnNotificationPress","initialize","config","getPermissionStatus","requestPermission","getCredentials","onMessage","add","delete","onNotificationPress"],"sourceRoot":"../../src","sources":["pushSignal.native.tsx"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AASzD,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,EAAQ;EACnEb,sBAAsB,CAACY,UAAU,CAACC,MAAM,CAAC;AAC3C;AAEA,OAAO,SAASC,mBAAmBA,CAAA,EAA8B;EAC/D,OAAOd,sBAAsB,CAACc,mBAAmB,CAAC,CAAC;AACrD;AAEA,OAAO,SAASC,iBAAiBA,CAAA,EAA8B;EAC7D,OAAOf,sBAAsB,CAACe,iBAAiB,CAAC,CAAC;AACnD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAA6B;EACzD,OAAOhB,sBAAsB,CAACgB,cAAc,CAAC,CAAC;AAChD;AAEA,OAAO,SAASC,SAASA,CACvBP,QAAwC,EAC5B;EACZJ,mBAAmB,CAAC,CAAC;EACrBJ,gBAAgB,CAACgB,GAAG,CAACR,QAAQ,CAAC;EAC9B,OAAO,MAAM;IACXR,gBAAgB,CAACiB,MAAM,CAACT,QAAQ,CAAC;EACnC,CAAC;AACH;AAEA,OAAO,SAASU,mBAAmBA,CACjCV,QAAwC,EAC5B;EACZJ,mBAAmB,CAAC,CAAC;EACrBF,cAAc,CAACc,GAAG,CAACR,QAAQ,CAAC;EAC5B,OAAO,MAAM;IACXN,cAAc,CAACe,MAAM,CAACT,QAAQ,CAAC;EACjC,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
+
export type PermissionStatus = 'authorized' | 'denied' | 'notDetermined';
|
|
3
|
+
export type PushPlatform = 'ios' | 'android';
|
|
4
|
+
export type PushEnvironment = 'sandbox' | 'production';
|
|
5
|
+
export interface PushCredentials {
|
|
6
|
+
platform: PushPlatform;
|
|
7
|
+
token: string;
|
|
8
|
+
environment?: PushEnvironment;
|
|
9
|
+
}
|
|
10
|
+
export interface PushMessage {
|
|
11
|
+
id?: string;
|
|
12
|
+
title?: string;
|
|
13
|
+
body?: string;
|
|
14
|
+
data: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface AndroidFirebaseConfig {
|
|
17
|
+
projectId?: string;
|
|
18
|
+
applicationId?: string;
|
|
19
|
+
apiKey?: string;
|
|
20
|
+
gcmSenderId?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PushSignal extends HybridObject<{
|
|
23
|
+
ios: 'swift';
|
|
24
|
+
android: 'kotlin';
|
|
25
|
+
}> {
|
|
26
|
+
initialize(config: AndroidFirebaseConfig): void;
|
|
27
|
+
getPermissionStatus(): Promise<PermissionStatus>;
|
|
28
|
+
requestPermission(): Promise<PermissionStatus>;
|
|
29
|
+
getCredentials(): Promise<PushCredentials>;
|
|
30
|
+
setOnMessage(callback: (message: PushMessage) => void): void;
|
|
31
|
+
setOnNotificationPress(callback: (message: PushMessage) => void): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=PushSignal.nitro.d.ts.map
|
|
@@ -0,0 +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,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,QAAQ,GAAG,eAAe,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,CAAC;AAC7C,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,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;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,IAAI,CAAC;IAChD,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjD,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/C,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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { AndroidFirebaseConfig, PermissionStatus, PushCredentials, PushEnvironment, PushMessage, PushPlatform, } from './PushSignal.nitro.js';
|
|
2
|
+
export { getCredentials, getPermissionStatus, initialize, onMessage, onNotificationPress, requestPermission, } from './pushSignal';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,uBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AndroidFirebaseConfig, PermissionStatus, PushCredentials, PushMessage } from './PushSignal.nitro.js';
|
|
2
|
+
export declare function initialize(_config?: AndroidFirebaseConfig): void;
|
|
3
|
+
export declare function getPermissionStatus(): Promise<PermissionStatus>;
|
|
4
|
+
export declare function requestPermission(): Promise<PermissionStatus>;
|
|
5
|
+
export declare function getCredentials(): Promise<PushCredentials>;
|
|
6
|
+
export declare function onMessage(_listener: (message: PushMessage) => void): () => void;
|
|
7
|
+
export declare function onNotificationPress(_listener: (message: PushMessage) => void): () => void;
|
|
8
|
+
//# sourceMappingURL=pushSignal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pushSignal.d.ts","sourceRoot":"","sources":["../../../src/pushSignal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACZ,MAAM,uBAAoB,CAAC;AAE5B,wBAAgB,UAAU,CAAC,OAAO,GAAE,qBAA0B,GAAG,IAAI,CAAG;AAExE,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAErE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAEnE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAE/D;AAED,wBAAgB,SAAS,CACvB,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACxC,MAAM,IAAI,CAEZ;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACxC,MAAM,IAAI,CAEZ"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AndroidFirebaseConfig, PermissionStatus, PushCredentials, PushMessage } from './PushSignal.nitro.js';
|
|
2
|
+
export declare function initialize(config?: AndroidFirebaseConfig): void;
|
|
3
|
+
export declare function getPermissionStatus(): Promise<PermissionStatus>;
|
|
4
|
+
export declare function requestPermission(): Promise<PermissionStatus>;
|
|
5
|
+
export declare function getCredentials(): Promise<PushCredentials>;
|
|
6
|
+
export declare function onMessage(listener: (message: PushMessage) => void): () => void;
|
|
7
|
+
export declare function onNotificationPress(listener: (message: PushMessage) => void): () => void;
|
|
8
|
+
//# sourceMappingURL=pushSignal.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pushSignal.native.d.ts","sourceRoot":"","sources":["../../../src/pushSignal.native.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,WAAW,EAEZ,MAAM,uBAAoB,CAAC;AAyB5B,wBAAgB,UAAU,CAAC,MAAM,GAAE,qBAA0B,GAAG,IAAI,CAEnE;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAE/D;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAE7D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAEzD;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACvC,MAAM,IAAI,CAMZ;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GACvC,MAAM,IAAI,CAMZ"}
|
package/nitro.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cxxNamespace": ["pushsignal"],
|
|
3
|
+
"ios": {
|
|
4
|
+
"iosModuleName": "PushSignal"
|
|
5
|
+
},
|
|
6
|
+
"android": {
|
|
7
|
+
"androidNamespace": ["pushsignal"],
|
|
8
|
+
"androidCxxLibName": "pushsignal"
|
|
9
|
+
},
|
|
10
|
+
"autolinking": {
|
|
11
|
+
"PushSignal": {
|
|
12
|
+
"ios": {
|
|
13
|
+
"language": "swift",
|
|
14
|
+
"implementationClassName": "PushSignal"
|
|
15
|
+
},
|
|
16
|
+
"android": {
|
|
17
|
+
"language": "kotlin",
|
|
18
|
+
"implementationClassName": "PushSignal"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"ignorePaths": ["node_modules"]
|
|
23
|
+
}
|