@@ -281,19 +281,21 @@ @interface UIApplicationOverrider : NSObject
281281@end
282282@implementation UIApplicationOverrider
283283
284+ static BOOL calledRegisterForRemoteNotifications;
284285static NSInteger didFailRegistarationErrorCode;
285286static BOOL shouldFireDeviceToken;
286287
287288+ (void )load {
288289 injectToProperClass (@selector (overrideRegisterForRemoteNotifications ), @selector (registerForRemoteNotifications ), @[], [UIApplicationOverrider class ], [UIApplication class ]);
289290 injectToProperClass (@selector (override_run ), @selector (_run ), @[], [UIApplicationOverrider class ], [UIApplication class ]);
290291 injectToProperClass (@selector (overrideCurrentUserNotificationSettings ), @selector (currentUserNotificationSettings ), @[], [UIApplicationOverrider class ], [UIApplication class ]);
292+ injectToProperClass (@selector (overrideRegisterForRemoteNotificationTypes: ), @selector (registerForRemoteNotificationTypes: ), @[], [UIApplicationOverrider class ], [UIApplication class ]);
291293}
292294
293295// Keeps UIApplicationMain(...) from looping to continue to the next line.
294296- (void ) override_run {}
295297
296- - (void ) overrideRegisterForRemoteNotifications {
298+ + (void ) helperCallDidRegisterForRemoteNotificationsWithDeviceToken {
297299 id app = [UIApplication sharedApplication ];
298300 id appDelegate = [[UIApplication sharedApplication ] delegate ];
299301
@@ -305,13 +307,25 @@ - (void) overrideRegisterForRemoteNotifications {
305307
306308 if (!shouldFireDeviceToken)
307309 return ;
308-
310+
309311
310312 char bytes[32 ];
311313 memset (bytes, 0 , 32 );
312314
313315 id deviceToken = [NSData dataWithBytes: bytes length: 32 ];
314316 [appDelegate application: app didRegisterForRemoteNotificationsWithDeviceToken: deviceToken];
317+
318+ }
319+
320+ // Called on iOS 8+
321+ - (void ) overrideRegisterForRemoteNotifications {
322+ calledRegisterForRemoteNotifications = true ;
323+ [UIApplicationOverrider helperCallDidRegisterForRemoteNotificationsWithDeviceToken ];
324+ }
325+
326+ // iOS 7
327+ - (void )overrideRegisterForRemoteNotificationTypes : (UIRemoteNotificationType)types {
328+ [UIApplicationOverrider helperCallDidRegisterForRemoteNotificationsWithDeviceToken ];
315329}
316330
317331
@@ -329,9 +343,12 @@ @implementation OneSignalHelperOverrider
329343static NSDictionary * lastHTTPRequset;
330344static int networkRequestCount;
331345
346+ static float mockIOSVersion;
347+
332348+ (void )load {
333349 injectStaticSelector ([OneSignalHelperOverrider class ], @selector (overrideEnqueueRequest:onSuccess:onFailure:isSynchronous: ), [OneSignalHelper class ], @selector (enqueueRequest:onSuccess:onFailure:isSynchronous: ));
334350 injectStaticSelector ([OneSignalHelperOverrider class ], @selector (overrideGetAppName ), [OneSignalHelper class ], @selector (getAppName ));
351+ injectStaticSelector ([OneSignalHelperOverrider class ], @selector (overrideIsIOSVersionGreaterOrEqual: ), [OneSignalHelper class ], @selector (isIOSVersionGreaterOrEqual: ));
335352}
336353
337354+ (NSString *) overrideGetAppName {
@@ -354,6 +371,10 @@ + (void)overrideEnqueueRequest:(NSURLRequest*)request onSuccess:(OSResultSuccess
354371 successBlock (@{@" id" : @" 1234" });
355372}
356373
374+ + (BOOL )overrideIsIOSVersionGreaterOrEqual : (float )version {
375+ return mockIOSVersion >= version;
376+ }
377+
357378@end
358379
359380
@@ -405,6 +426,8 @@ @implementation UnitTests
405426- (void )setUp {
406427 [super setUp ];
407428
429+ mockIOSVersion = 10 ;
430+
408431 timeOffset = 0 ;
409432 networkRequestCount = 0 ;
410433 lastUrl = nil ;
@@ -426,6 +449,7 @@ - (void)setUp {
426449 authorizationStatus = [NSNumber numberWithInteger: UNAuthorizationStatusAuthorized ];
427450
428451 shouldFireDeviceToken = true ;
452+ calledRegisterForRemoteNotifications = false ;
429453 didFailRegistarationErrorCode = 0 ;
430454 nsbundleDictionary = @{@" UIBackgroundModes" : @[@" remote-notification" ]};
431455
@@ -521,13 +545,14 @@ - (UNNotificationResponse*)createBasiciOSNotificationResponseWithPayload:(NSDict
521545}
522546
523547- (UNNotificationResponse *)createBasiciOSNotificationResponse {
524- id userInfo = @{@" custom" : @{
525- @ " i" : @" b2f7f966-d8cc-11e4-bed1-df8f05be55bb"
526- } };
548+ id userInfo = @{@" custom" :
549+ @{ @ " i" : @" b2f7f966-d8cc-11e4-bed1-df8f05be55bb" }
550+ };
527551
528552 return [self createBasiciOSNotificationResponseWithPayload: userInfo];
529553}
530554
555+ // Helper used to simpify tests below.
531556- (void )initOneSignal {
532557 [OneSignal initWithLaunchOptions: nil appId: @" b2f7f966-d8cc-11e4-bed1-df8f05be55ba" ];
533558
@@ -556,6 +581,29 @@ - (void)testBasicInitTest {
556581 XCTAssertEqual (networkRequestCount, 1 );
557582}
558583
584+ - (void )testRegisterationOniOS7 {
585+ mockIOSVersion = 7 ;
586+
587+ [self initOneSignal ];
588+ [self runBackgroundThreads ];
589+
590+ XCTAssertEqualObjects (lastHTTPRequset[@" app_id" ], @" b2f7f966-d8cc-11e4-bed1-df8f05be55ba" );
591+ XCTAssertEqualObjects (lastHTTPRequset[@" identifier" ], @" 0000000000000000000000000000000000000000000000000000000000000000" );
592+ XCTAssertEqualObjects (lastHTTPRequset[@" notification_types" ], @7 );
593+ XCTAssertEqualObjects (lastHTTPRequset[@" device_model" ], @" x86_64" );
594+ XCTAssertEqualObjects (lastHTTPRequset[@" device_type" ], @0 );
595+ XCTAssertEqualObjects (lastHTTPRequset[@" language" ], @" en-US" );
596+
597+ // 2nd init call should not fire another on_session call.
598+ lastHTTPRequset = nil ;
599+ [OneSignal initWithLaunchOptions: nil appId: @" b2f7f966-d8cc-11e4-bed1-df8f05be55ba" ];
600+ XCTAssertNil (lastHTTPRequset);
601+
602+ XCTAssertEqual (networkRequestCount, 1 );
603+ // Make sure calledRegisterForRemoteNotifications didn't fire as this isn't available on iOS 7
604+ XCTAssertFalse (calledRegisterForRemoteNotifications);
605+ }
606+
559607// Seen a few rare crash reports where [NSLocale preferredLanguages] resturns an empty array
560608- (void )testInitWithEmptyPreferredLanguages {
561609 preferredLanguagesArray = @[];
0 commit comments