pushwoosh-react-native-plugin 6.1.29 → 6.1.30

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.
@@ -58,6 +58,7 @@ body:
58
58
  label: Your Pushwoosh React Native Plugin version
59
59
  description: Your React Native Plugin version which was integrated to the app. You may find it on the [releases page](https://github.com/Pushwoosh/pushwoosh-react-native-plugin/releases)
60
60
  options:
61
+ - 6.1.30
61
62
  - 6.1.28
62
63
  - 6.1.26
63
64
  - 6.1.25
package/index.d.ts CHANGED
@@ -45,10 +45,14 @@ declare module 'pushwoosh-react-native-plugin' {
45
45
  getShowPushnotificationAlert(callback: (willShow: boolean) => void): void;
46
46
  getPushToken(success?: (token: string) => void): void;
47
47
  getHwid(success: (hwid: string) => void): void;
48
+ getUserId(success: (userId: string) => void): void;
48
49
  setUserId(userId: string, success?: ()=> void, fail?: (error: Error) => void): void;
49
50
  postEvent(event: string, attributes?: Record<string, string>): void;
50
51
  enableHuaweiPushNotifications(): void;
51
52
 
53
+ //email methods
54
+ setUserEmails(userId: string, emails: (string | string[]), success?: () => void, fail?: (error: Error) => void): void;
55
+ setEmails(emails: (string | string[]), success?: () => void, fail?: (error: Error) => void): void;
52
56
  //badge methods
53
57
  setApplicationIconBadgeNumber(badgeNumber: number): void;
54
58
  getApplicationIconBadgeNumber(callback: (badge: number) => void): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pushwoosh-react-native-plugin",
3
- "version": "6.1.29",
3
+ "version": "6.1.30",
4
4
  "description": "This plugin allows you to send and receive push notifications. Powered by Pushwoosh (www.pushwoosh.com).",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = "pushwoosh-react-native-plugin"
3
- s.version = "6.1.29"
3
+ s.version = "6.1.30"
4
4
  s.summary = "React Native Pushwoosh Push Notifications module"
5
5
  s.requires_arc = true
6
6
  s.author = 'Pushwoosh'
@@ -24,6 +24,8 @@ import com.pushwoosh.RegisterForPushNotificationsResultData;
24
24
  import com.pushwoosh.badge.PushwooshBadge;
25
25
  import com.pushwoosh.exception.GetTagsException;
26
26
  import com.pushwoosh.exception.PushwooshException;
27
+ import com.pushwoosh.exception.SetEmailException;
28
+ import com.pushwoosh.exception.SetUserException;
27
29
  import com.pushwoosh.exception.SetUserIdException;
28
30
  import com.pushwoosh.exception.RegisterForPushNotificationsException;
29
31
  import com.pushwoosh.exception.UnregisterForPushNotificationException;
@@ -18,7 +18,7 @@
18
18
 
19
19
  #endif
20
20
 
21
- #define PUSHWOOSH_VERSION @"6.5.7"
21
+ #define PUSHWOOSH_VERSION @"6.5.8"
22
22
 
23
23
 
24
24
  @class Pushwoosh, PWMessage, PWNotificationCenterDelegateProxy;
@@ -26,6 +26,6 @@
26
26
  #import "PWInbox.h"
27
27
  #endif
28
28
 
29
- @interface PushwooshPlugin: RCTEventEmitter<RCTBridgeModule, PushNotificationDelegate, UIApplicationDelegate>
29
+ @interface PushwooshPlugin: RCTEventEmitter<RCTBridgeModule, PushNotificationDelegate>
30
30
 
31
31
  @end
@@ -15,6 +15,8 @@
15
15
  #import <UserNotifications/UserNotifications.h>
16
16
  #import <Pushwoosh/PushNotificationManager.h>
17
17
 
18
+ #import <objc/runtime.h>
19
+
18
20
  static id objectOrNull(id object) {
19
21
  if (object) {
20
22
  return object;
@@ -32,6 +34,28 @@ static NSString * const kPushOpenEvent = @"PWPushOpen";
32
34
  static NSString * const kPushOpenJSEvent = @"pushOpened";
33
35
  static NSString * const kPushReceivedJSEvent = @"pushReceived";
34
36
 
37
+ @interface PushwooshPlugin (InnerPushwooshPlugin)
38
+
39
+ - (void) application:(UIApplication *)application pwplugin_didRegisterWithDeviceToken:(NSData *)deviceToken;
40
+ - (void) application:(UIApplication *)application pwplugin_didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
41
+ - (void) application:(UIApplication *)application pwplugin_didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
42
+
43
+ @end
44
+
45
+ void pushwoosh_swizzle(Class class, SEL fromChange, SEL toChange, IMP impl, const char * signature) {
46
+ Method method = nil;
47
+ method = class_getInstanceMethod(class, fromChange);
48
+
49
+ if (method) {
50
+ //method exists add a new method and swap with original
51
+ class_addMethod(class, toChange, impl, signature);
52
+ method_exchangeImplementations(class_getInstanceMethod(class, fromChange), class_getInstanceMethod(class, toChange));
53
+ } else {
54
+ //just add as orignal method
55
+ class_addMethod(class, fromChange, impl, signature);
56
+ }
57
+ }
58
+
35
59
  @implementation PushwooshPlugin
36
60
 
37
61
  API_AVAILABLE(ios(10))
@@ -71,15 +95,23 @@ RCT_EXPORT_METHOD(init:(NSDictionary*)config success:(RCTResponseSenderBlock)suc
71
95
  [PushNotificationManager initializeWithAppCode:appCode appName:nil];
72
96
  [[PushNotificationManager pushManager] sendAppOpen];
73
97
  [PushNotificationManager pushManager].delegate = self;
74
- [[UIApplication sharedApplication] setDelegate:self];
98
+
99
+ [PushwooshPlugin swizzleNotificationSettingsHandler];
75
100
 
76
101
  // We set Pushwoosh UNUserNotificationCenter delegate unless CUSTOM is specified in the config
77
102
  if(![notificationHandling isEqualToString:@"CUSTOM"]) {
78
103
  if (@available(iOS 10, *)) {
104
+ BOOL shouldReplaceDelegate = YES;
79
105
 
80
106
  UNUserNotificationCenter *notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
107
+
108
+ #if !TARGET_OS_OSX
109
+ if ([notificationCenter.delegate conformsToProtocol:@protocol(PushNotificationDelegate)]) {
110
+ shouldReplaceDelegate = NO;
111
+ }
112
+ #endif
81
113
 
82
- if (notificationCenter.delegate != nil) {
114
+ if (notificationCenter.delegate != nil && shouldReplaceDelegate) {
83
115
  _originalNotificationCenterDelegate = notificationCenter.delegate;
84
116
  _originalNotificationCenterDelegateResponds.openSettingsForNotification =
85
117
  (unsigned int)[_originalNotificationCenterDelegate
@@ -94,8 +126,10 @@ RCT_EXPORT_METHOD(init:(NSDictionary*)config success:(RCTResponseSenderBlock)suc
94
126
  didReceiveNotificationResponse:withCompletionHandler:)];
95
127
  }
96
128
 
97
- __strong PushwooshPlugin<UNUserNotificationCenterDelegate> *strongSelf = (PushwooshPlugin<UNUserNotificationCenterDelegate> *)self;
98
- notificationCenter.delegate = (id<UNUserNotificationCenterDelegate>)strongSelf;
129
+ if (shouldReplaceDelegate) {
130
+ __strong PushwooshPlugin<UNUserNotificationCenterDelegate> *strongSelf = (PushwooshPlugin<UNUserNotificationCenterDelegate> *)self;
131
+ notificationCenter.delegate = (id<UNUserNotificationCenterDelegate>)strongSelf;
132
+ }
99
133
  }
100
134
  }
101
135
 
@@ -179,27 +213,35 @@ RCT_EXPORT_METHOD(getPushToken:(RCTResponseSenderBlock)callback) {
179
213
  }
180
214
 
181
215
  RCT_EXPORT_METHOD(setEmails:(NSArray *)emails success:(RCTResponseSenderBlock)successCallback error:(RCTResponseSenderBlock)errorCallback) {
216
+ __block NSError* gError = nil;
182
217
  [[Pushwoosh sharedInstance] setEmails:emails completion:^(NSError * _Nullable error) {
183
- if (!error && successCallback) {
184
- successCallback(@[]);
185
- }
186
-
187
- if (error && errorCallback) {
188
- errorCallback(@[ objectOrNull([error localizedDescription]) ]);
218
+ if (error) {
219
+ gError = error;
189
220
  }
190
221
  }];
222
+ if (!gError && successCallback) {
223
+ successCallback(@[]);
224
+ }
225
+
226
+ if (gError && errorCallback) {
227
+ errorCallback(@[ objectOrNull([gError localizedDescription]) ]);
228
+ }
191
229
  }
192
230
 
193
231
  RCT_EXPORT_METHOD(setUserEmails:(NSString*)userId emails:(NSArray *)emails success:(RCTResponseSenderBlock)successCallback error:(RCTResponseSenderBlock)errorCallback) {
232
+ __block NSError* gError = nil;
194
233
  [[Pushwoosh sharedInstance] setUser:userId emails:emails completion:^(NSError * _Nullable error) {
195
- if (!error && successCallback) {
196
- successCallback(@[]);
197
- }
198
-
199
- if (error && errorCallback) {
200
- errorCallback(@[ objectOrNull([error localizedDescription]) ]);
234
+ if (error) {
235
+ gError = error;
201
236
  }
202
237
  }];
238
+ if (!gError && successCallback) {
239
+ successCallback(@[]);
240
+ }
241
+
242
+ if (gError && errorCallback) {
243
+ errorCallback(@[ objectOrNull([gError localizedDescription]) ]);
244
+ }
203
245
  }
204
246
 
205
247
  RCT_EXPORT_METHOD(setTags:(NSDictionary*)tags success:(RCTResponseSenderBlock)successCallback error:(RCTResponseSenderBlock)errorCallback) {
@@ -362,19 +404,55 @@ RCT_EXPORT_METHOD(performAction:(NSString*)code) {
362
404
  [PWInbox performActionForMessageWithCode:code];
363
405
  }
364
406
 
365
- #pragma mark - UIApplicationDelegate Methods
366
407
  #pragma mark -
408
+ #pragma mark - Swizzling
367
409
 
368
- - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
369
- [[Pushwoosh sharedInstance] handlePushRegistration:deviceToken];
410
+ + (void)swizzleNotificationSettingsHandler {
411
+ if ([UIApplication sharedApplication].delegate == nil) {
412
+ return;
413
+ }
414
+
415
+ if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
416
+ return;
417
+ }
418
+
419
+ static Class appDelegateClass = nil;
420
+
421
+ //do not swizzle the same class twice
422
+ id delegate = [UIApplication sharedApplication].delegate;
423
+ if(appDelegateClass == [delegate class]) {
424
+ return;
425
+ }
426
+
427
+ appDelegateClass = [delegate class];
428
+
429
+ pushwoosh_swizzle([delegate class], @selector(application:didRegisterForRemoteNotificationsWithDeviceToken:), @selector(application:pwplugin_didRegisterWithDeviceToken:), (IMP)pwplugin_didRegisterWithDeviceToken, "v@:::");
430
+ pushwoosh_swizzle([delegate class], @selector(application:didFailToRegisterForRemoteNotificationsWithError:), @selector(application:pwplugin_didFailToRegisterForRemoteNotificationsWithError:), (IMP)pwplugin_didFailToRegisterForRemoteNotificationsWithError, "v@:::");
431
+ pushwoosh_swizzle([delegate class], @selector(application:didReceiveRemoteNotification:fetchCompletionHandler:), @selector(application:pwplugin_didReceiveRemoteNotification:fetchCompletionHandler:), (IMP)pwplugin_didReceiveRemoteNotification, "v@::::");
370
432
  }
371
433
 
372
- - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
373
- [[Pushwoosh sharedInstance] handlePushRegistrationFailure:error];
434
+ void pwplugin_didReceiveRemoteNotification(id self, SEL _cmd, UIApplication * application, NSDictionary * userInfo, void (^completionHandler)(UIBackgroundFetchResult)) {
435
+ if ([self respondsToSelector:@selector(application:pwplugin_didReceiveRemoteNotification:fetchCompletionHandler:)]) {
436
+ [self application:application pwplugin_didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
437
+ }
438
+
439
+ [[Pushwoosh sharedInstance] handlePushReceived:userInfo];
374
440
  }
375
441
 
376
- - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
377
- [[Pushwoosh sharedInstance] handlePushReceived:userInfo];
442
+ void pwplugin_didRegisterWithDeviceToken(id self, SEL _cmd, id application, NSData *deviceToken) {
443
+ if ([self respondsToSelector:@selector(application: pwplugin_didRegisterWithDeviceToken:)]) {
444
+ [self application:application pwplugin_didRegisterWithDeviceToken:deviceToken];
445
+ }
446
+
447
+ [[Pushwoosh sharedInstance] handlePushRegistration:deviceToken];
448
+ }
449
+
450
+ void pwplugin_didFailToRegisterForRemoteNotificationsWithError(id self, SEL _cmd, UIApplication *application, NSError *error) {
451
+ if ([self respondsToSelector:@selector(application:pwplugin_didFailToRegisterForRemoteNotificationsWithError:)]) {
452
+ [self application:application pwplugin_didFailToRegisterForRemoteNotificationsWithError:error];
453
+ }
454
+
455
+ [[Pushwoosh sharedInstance] handlePushRegistrationFailure:error];
378
456
  }
379
457
 
380
458
  #pragma mark - UNUserNotificationCenter Delegate Methods
@@ -387,20 +465,6 @@ RCT_EXPORT_METHOD(performAction:(NSString*)code) {
387
465
  API_AVAILABLE(ios(10.0)) {
388
466
 
389
467
  if ([self isRemoteNotification:notification] && [PWMessage isPushwooshMessage:notification.request.content.userInfo]) {
390
- UNMutableNotificationContent *content = notification.request.content.mutableCopy;
391
-
392
- NSMutableDictionary *userInfo = content.userInfo.mutableCopy;
393
- userInfo[@"pw_push"] = @(YES);
394
-
395
- content.userInfo = userInfo;
396
-
397
- //newsstand push
398
- if (![self isContentAvailablePush:userInfo]) {
399
- [[PWEventDispatcher sharedDispatcher] dispatchEvent:kPushReceivedEvent withArgs:@[ objectOrNull(userInfo) ]];
400
-
401
- [self sendJSEvent:kPushReceivedJSEvent withArgs:userInfo];
402
- }
403
-
404
468
  completionHandler(UNNotificationPresentationOptionNone);
405
469
  } else if ([PushNotificationManager pushManager].showPushnotificationAlert || [notification.request.content.userInfo objectForKey:@"pw_push"] == nil) {
406
470
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound);
@@ -438,20 +502,10 @@ API_AVAILABLE(ios(10.0)) {
438
502
  if (![response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier] && [[PushNotificationManager pushManager].delegate respondsToSelector:@selector(onActionIdentifierReceived:withNotification:)]) {
439
503
  [[PushNotificationManager pushManager].delegate onActionIdentifierReceived:response.actionIdentifier withNotification:[self pushPayloadFromContent:response.notification.request.content]];
440
504
  }
441
-
442
- [[PWEventDispatcher sharedDispatcher] dispatchEvent:kPushOpenEvent withArgs:@[ objectOrNull(response.notification.request.content.userInfo) ]];
443
-
444
- [self sendJSEvent:kPushOpenJSEvent withArgs:response.notification.request.content.userInfo];
445
505
  }
446
506
  };
447
507
 
448
508
  if ([self isRemoteNotification:response.notification] && [PWMessage isPushwooshMessage:response.notification.request.content.userInfo]) {
449
- if (![self isContentAvailablePush:response.notification.request.content.userInfo]) {
450
- [[PWEventDispatcher sharedDispatcher] dispatchEvent:kPushOpenEvent withArgs:@[ objectOrNull(response.notification.request.content.userInfo) ]];
451
-
452
- [self sendJSEvent:kPushOpenJSEvent withArgs:response.notification.request.content.userInfo];
453
- }
454
-
455
509
  handlePushAcceptanceBlock();
456
510
  } else if ([response.notification.request.content.userInfo objectForKey:@"pw_push"]) {
457
511
  handlePushAcceptanceBlock();
@@ -768,6 +822,18 @@ RCT_EXPORT_METHOD(enableHuaweiPushNotifications) {
768
822
  [[PWEventDispatcher sharedDispatcher] dispatchEvent:kRegistrationErrorEvent withArgs:@[ objectOrNull([error localizedDescription]) ]];
769
823
  }
770
824
 
825
+ - (void)onPushReceived:(PushNotificationManager *)pushManager withNotification:(NSDictionary *)pushNotification onStart:(BOOL)onStart {
826
+ [[PWEventDispatcher sharedDispatcher] dispatchEvent:kPushReceivedEvent withArgs:@[ objectOrNull(pushNotification) ]];
827
+
828
+ [self sendJSEvent:kPushReceivedJSEvent withArgs:pushNotification];
829
+ }
830
+
831
+ - (void)onPushAccepted:(PushNotificationManager *)manager withNotification:(NSDictionary *)pushNotification onStart:(BOOL)onStart {
832
+ [[PWEventDispatcher sharedDispatcher] dispatchEvent:kPushOpenEvent withArgs:@[ objectOrNull(pushNotification) ]];
833
+
834
+ [self sendJSEvent:kPushOpenJSEvent withArgs:pushNotification];
835
+ }
836
+
771
837
  #pragma mark - RCTEventEmitter
772
838
 
773
839
  - (void)sendJSEvent:(NSString*)event withArgs:(NSDictionary*)args {
Binary file