Skip to content

Commit 70e2a39

Browse files
committed
feat(ios): add event-driven wait methods for push subscription ID/token
1 parent 0142300 commit 70e2a39

File tree

1 file changed

+84
-12
lines changed

1 file changed

+84
-12
lines changed

ios/RCTOneSignal/RCTOneSignalEventEmitter.m

Lines changed: 84 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ - (void)stopObserving {
7979
} else if (error.userInfo[@"returned"]) {
8080
return @[error.userInfo[@"returned"]];
8181
}
82-
82+
8383
return @[error.localizedDescription];
8484
}
8585

@@ -112,7 +112,7 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
112112
[OneSignal logout];
113113
}
114114

115-
RCT_EXPORT_METHOD(enterLiveActivity:(NSString *)activityId
115+
RCT_EXPORT_METHOD(enterLiveActivity:(NSString *)activityId
116116
withToken:(NSString *)token
117117
withResponse:(RCTResponseSenderBlock)callback) {
118118
[OneSignal.LiveActivities enter:activityId withToken:token withSuccess:^(NSDictionary *result) {
@@ -131,7 +131,7 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
131131
}];
132132
}
133133

134-
RCT_EXPORT_METHOD(setPushToStartToken:(NSString *)activityType
134+
RCT_EXPORT_METHOD(setPushToStartToken:(NSString *)activityType
135135
withToken:(NSString *)token) {
136136
#if !TARGET_OS_MACCATALYST
137137
NSError* err=nil;
@@ -209,7 +209,7 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
209209
}
210210

211211
// OneSignal.InAppMessages namespace methods
212-
RCT_REMAP_METHOD(getPaused,
212+
RCT_REMAP_METHOD(getPaused,
213213
getPausedResolver:(RCTPromiseResolveBlock)resolve
214214
rejecter:(RCTPromiseRejectBlock)reject) {
215215
resolve(@([OneSignal.InAppMessages paused]));
@@ -269,13 +269,13 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
269269
}
270270

271271
// OneSignal.Notifications namespace methods
272-
RCT_REMAP_METHOD(hasNotificationPermission,
272+
RCT_REMAP_METHOD(hasNotificationPermission,
273273
hasNotificationPermissionResolver:(RCTPromiseResolveBlock)resolve
274274
rejecter:(RCTPromiseRejectBlock)reject) {
275275
resolve(@([OneSignal.Notifications permission]));
276276
}
277277

278-
RCT_REMAP_METHOD(canRequestNotificationPermission,
278+
RCT_REMAP_METHOD(canRequestNotificationPermission,
279279
canRequestNotificationPermissionResolver:(RCTPromiseResolveBlock)resolve
280280
rejecter:(RCTPromiseRejectBlock)reject) {
281281
resolve(@([OneSignal.Notifications canRequestPermission]));
@@ -408,7 +408,7 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
408408
}
409409

410410
RCT_EXPORT_METHOD(removeSms:(NSString *)smsNumber) {
411-
[OneSignal.User removeSms:smsNumber];
411+
[OneSignal.User removeSms:smsNumber];
412412
}
413413

414414
RCT_EXPORT_METHOD(addTag:(NSString *)key value:(id)value) {
@@ -436,7 +436,7 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
436436
getOnesignalIdResolver:(RCTPromiseResolveBlock)resolve
437437
rejecter:(RCTPromiseRejectBlock)reject) {
438438
NSString *onesignalId = OneSignal.User.onesignalId;
439-
439+
440440
if (onesignalId == nil || [onesignalId length] == 0) {
441441
resolve([NSNull null]); // Resolve with null if nil or empty
442442
} else {
@@ -448,7 +448,7 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
448448
getExternalIdResolver:(RCTPromiseResolveBlock)resolve
449449
rejecter:(RCTPromiseRejectBlock)reject) {
450450
NSString *externalId = OneSignal.User.externalId;
451-
451+
452452
if (externalId == nil || [externalId length] == 0) {
453453
resolve([NSNull null]); // Resolve with null if nil or empty
454454
} else {
@@ -474,13 +474,13 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
474474

475475

476476
// OneSignal.User.pushSubscription namespace methods
477-
RCT_REMAP_METHOD(getOptedIn,
477+
RCT_REMAP_METHOD(getOptedIn,
478478
getOptedInResolver:(RCTPromiseResolveBlock)resolve
479479
rejecter:(RCTPromiseRejectBlock)reject) {
480480
resolve(@(OneSignal.User.pushSubscription.optedIn));
481481
}
482482

483-
RCT_REMAP_METHOD(getPushSubscriptionId,
483+
RCT_REMAP_METHOD(getPushSubscriptionId,
484484
getPushSubscriptionIdResolver:(RCTPromiseResolveBlock)resolve
485485
rejecter:(RCTPromiseRejectBlock)reject) {
486486
NSString *pushId = OneSignal.User.pushSubscription.id;
@@ -491,7 +491,7 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
491491
}
492492
}
493493

494-
RCT_REMAP_METHOD(getPushSubscriptionToken,
494+
RCT_REMAP_METHOD(getPushSubscriptionToken,
495495
getPushSubscriptionTokenResolver:(RCTPromiseResolveBlock)resolve
496496
rejecter:(RCTPromiseRejectBlock)reject) {
497497
NSString *token = OneSignal.User.pushSubscription.token;
@@ -502,6 +502,78 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
502502
}
503503
}
504504

505+
RCT_REMAP_METHOD(waitForPushSubscriptionIdAsync,
506+
waitForPushSubscriptionIdWithTimeoutMs:(nonnull NSNumber *)timeoutMs
507+
resolver:(RCTPromiseResolveBlock)resolve
508+
rejecter:(RCTPromiseRejectBlock)reject) {
509+
NSString *currentId = OneSignal.User.pushSubscription.id;
510+
511+
// If ID already exists, resolve immediately
512+
if (currentId && ![currentId isEqualToString:@""]) {
513+
resolve(currentId);
514+
return;
515+
}
516+
517+
__block BOOL isResolved = NO;
518+
__block id<NSObject> observer = nil;
519+
520+
// Create observer
521+
observer = [OneSignal.User.pushSubscription addObserver:^(OSPushSubscriptionChangedState * _Nonnull state) {
522+
NSString *newId = state.current.id;
523+
if (newId && ![newId isEqualToString:@""] && !isResolved) {
524+
isResolved = YES;
525+
[OneSignal.User.pushSubscription removeObserver:observer];
526+
resolve(newId);
527+
}
528+
}];
529+
530+
// Set up timeout
531+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)([timeoutMs integerValue] * NSEC_PER_MSEC)),
532+
dispatch_get_main_queue(), ^{
533+
if (!isResolved) {
534+
isResolved = YES;
535+
[OneSignal.User.pushSubscription removeObserver:observer];
536+
resolve([NSNull null]);
537+
}
538+
});
539+
}
540+
541+
RCT_REMAP_METHOD(waitForPushSubscriptionTokenAsync,
542+
waitForPushSubscriptionTokenWithTimeoutMs:(nonnull NSNumber *)timeoutMs
543+
resolver:(RCTPromiseResolveBlock)resolve
544+
rejecter:(RCTPromiseRejectBlock)reject) {
545+
NSString *currentToken = OneSignal.User.pushSubscription.token;
546+
547+
// If token already exists, resolve immediately
548+
if (currentToken && ![currentToken isEqualToString:@""]) {
549+
resolve(currentToken);
550+
return;
551+
}
552+
553+
__block BOOL isResolved = NO;
554+
__block id<NSObject> observer = nil;
555+
556+
// Create observer
557+
observer = [OneSignal.User.pushSubscription addObserver:^(OSPushSubscriptionChangedState * _Nonnull state) {
558+
NSString *newToken = state.current.token;
559+
if (newToken && ![newToken isEqualToString:@""] && !isResolved) {
560+
isResolved = YES;
561+
[OneSignal.User.pushSubscription removeObserver:observer];
562+
resolve(newToken);
563+
}
564+
}];
565+
566+
// Set up timeout
567+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)([timeoutMs integerValue] * NSEC_PER_MSEC)),
568+
dispatch_get_main_queue(), ^{
569+
if (!isResolved) {
570+
isResolved = YES;
571+
[OneSignal.User.pushSubscription removeObserver:observer];
572+
resolve([NSNull null]);
573+
}
574+
});
575+
}
576+
505577
RCT_EXPORT_METHOD(optIn) {
506578
[OneSignal.User.pushSubscription optIn];
507579
}

0 commit comments

Comments
 (0)