From d592a1055b3729a670d9308e5587b6c9bf549ba0 Mon Sep 17 00:00:00 2001 From: emawby Date: Thu, 30 Jul 2020 16:14:19 -0700 Subject: [PATCH] supporting scene based apps --- .../OneSignalDevApp.xcodeproj/project.pbxproj | 6 +- .../OneSignal.xcodeproj/project.pbxproj | 10 ++ iOS_SDK/OneSignalSDK/Source/OneSignal.m | 4 + .../Source/OneSignalLifecycleObserver.h | 14 +++ .../Source/OneSignalLifecycleObserver.m | 102 ++++++++++++++++++ .../Source/UIApplicationDelegate+OneSignal.m | 43 -------- 6 files changed, 134 insertions(+), 45 deletions(-) create mode 100644 iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.h create mode 100644 iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.m diff --git a/iOS_SDK/OneSignalDevApp/OneSignalDevApp.xcodeproj/project.pbxproj b/iOS_SDK/OneSignalDevApp/OneSignalDevApp.xcodeproj/project.pbxproj index b005447f9..4e6e68783 100644 --- a/iOS_SDK/OneSignalDevApp/OneSignalDevApp.xcodeproj/project.pbxproj +++ b/iOS_SDK/OneSignalDevApp/OneSignalDevApp.xcodeproj/project.pbxproj @@ -453,7 +453,7 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = OneSignalDevApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.example; @@ -474,7 +474,7 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = OneSignalDevApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.example; @@ -494,6 +494,7 @@ "$(PROJECT_DIR)", ); INFOPLIST_FILE = OneSignalNotificationServiceExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.example.OneSignalNotificationServiceExtensionA; @@ -515,6 +516,7 @@ ); GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = OneSignalNotificationServiceExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.onesignal.example.OneSignalNotificationServiceExtensionA; diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj index 177c53cac..6f42d8e1a 100644 --- a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj @@ -410,6 +410,9 @@ CAE2E5A9215D80070036FD32 /* OSNotificationPayload.m in Sources */ = {isa = PBXBuildFile; fileRef = 454F94F41FAD2E5A00D74CCF /* OSNotificationPayload.m */; }; CAE2E5AA215D80380036FD32 /* OneSignalNotificationServiceExtensionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 454F94F11FAD218000D74CCF /* OneSignalNotificationServiceExtensionHandler.m */; }; CAEA1C66202BB3C600FBFE9E /* OSEmailSubscription.h in Headers */ = {isa = PBXBuildFile; fileRef = CA810FCF202BA97300A60FED /* OSEmailSubscription.h */; }; + DE16C14424D3724700670EFA /* OneSignalLifecycleObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = DE16C14324D3724700670EFA /* OneSignalLifecycleObserver.m */; }; + DE16C14524D3724700670EFA /* OneSignalLifecycleObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = DE16C14324D3724700670EFA /* OneSignalLifecycleObserver.m */; }; + DE16C14724D3727200670EFA /* OneSignalLifecycleObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = DE16C14624D3727200670EFA /* OneSignalLifecycleObserver.h */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -682,6 +685,8 @@ CACBAAA7218A6280000ACAA5 /* OSJSONHandling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSJSONHandling.h; sourceTree = ""; }; CACBAAA9218A65AE000ACAA5 /* InAppMessagingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InAppMessagingTests.m; sourceTree = ""; }; CACBAAAB218A662B000ACAA5 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + DE16C14324D3724700670EFA /* OneSignalLifecycleObserver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OneSignalLifecycleObserver.m; sourceTree = ""; }; + DE16C14624D3727200670EFA /* OneSignalLifecycleObserver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OneSignalLifecycleObserver.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1016,6 +1021,8 @@ 91C7725D1E7CCE1000D612D0 /* OneSignalInternal.h */, 912411F01E73342200E41FD7 /* OneSignal.h */, 912411F11E73342200E41FD7 /* OneSignal.m */, + DE16C14624D3727200670EFA /* OneSignalLifecycleObserver.h */, + DE16C14324D3724700670EFA /* OneSignalLifecycleObserver.m */, CAB4112720852E48005A70D1 /* DelayedInitializationParameters.h */, CAB4112820852E48005A70D1 /* DelayedInitializationParameters.m */, CA70E3332023D51000019273 /* OneSignalSetEmailParameters.h */, @@ -1256,6 +1263,7 @@ 91F58D7A1E7C7D3F0017D24D /* OneSignalNotificationSettings.h in Headers */, CA4742E4218B8FF30020DC8C /* OSTriggerController.h in Headers */, 7A1232AA235E17B4002B6CE3 /* OSSessionManager.h in Headers */, + DE16C14724D3727200670EFA /* OneSignalLifecycleObserver.h in Headers */, 9D1BD9642379F42700A064F7 /* OSInfluenceDataDefines.h in Headers */, 7A674F192360D813001F9ACD /* OSBaseFocusTimeProcessor.h in Headers */, CA8E19052193C76D009DA223 /* OSInAppMessagingHelpers.h in Headers */, @@ -1512,6 +1520,7 @@ 912412121E73342200E41FD7 /* OneSignalAlertViewDelegate.m in Sources */, CA36A42D208FDEFB003EFA9A /* NSURL+OneSignal.m in Sources */, 912412421E73342200E41FD7 /* UNUserNotificationCenter+OneSignal.m in Sources */, + DE16C14424D3724700670EFA /* OneSignalLifecycleObserver.m in Sources */, 7A880F2B23FB45FB0081F5E8 /* OSInAppMessageOutcome.m in Sources */, 9124123A1E73342200E41FD7 /* OneSignalWebView.m in Sources */, 9D3300F523145AF3000F0A83 /* OneSignalViewHelper.m in Sources */, @@ -1601,6 +1610,7 @@ 0338566B1FBBD2270002F7C1 /* OSNotificationPayload.m in Sources */, 9DDFEEF323189C0E00EAE0BB /* OneSignalViewHelper.m in Sources */, 7A880F2C23FB45FB0081F5E8 /* OSInAppMessageOutcome.m in Sources */, + DE16C14524D3724700670EFA /* OneSignalLifecycleObserver.m in Sources */, 912412431E73342200E41FD7 /* UNUserNotificationCenter+OneSignal.m in Sources */, CA47439F2190FEA80020DC8C /* OSTrigger.m in Sources */, 9124123B1E73342200E41FD7 /* OneSignalWebView.m in Sources */, diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignal.m b/iOS_SDK/OneSignalSDK/Source/OneSignal.m index 214b9a8df..0e355cb3b 100755 --- a/iOS_SDK/OneSignalSDK/Source/OneSignal.m +++ b/iOS_SDK/OneSignalSDK/Source/OneSignal.m @@ -81,6 +81,8 @@ #import "OSInAppMessageAction.h" #import "OSInAppMessage.h" +#import "OneSignalLifecycleObserver.h" + #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wundeclared-selector" @@ -623,6 +625,8 @@ + (id)initWithLaunchOptions:(NSDictionary*)launchOptions if ([OneSignalTrackFirebaseAnalytics libraryExists]) [OneSignalTrackFirebaseAnalytics init]; + [OneSignalLifecycleObserver registerLifecycleObserver]; + return self; } diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.h b/iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.h new file mode 100644 index 000000000..72a4d57b6 --- /dev/null +++ b/iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.h @@ -0,0 +1,14 @@ +// +// OneSignalLifecycleObserver.h +// OneSignal +// +// Created by Elliot Mawby on 7/30/20. +// Copyright © 2020 Hiptic. All rights reserved. +// + +@interface OneSignalLifecycleObserver: NSObject + ++ (OneSignalLifecycleObserver*) sharedInstance; ++ (void)registerLifecycleObserver; ++ (void)removeObserver; +@end diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.m b/iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.m new file mode 100644 index 000000000..44e6cc37e --- /dev/null +++ b/iOS_SDK/OneSignalSDK/Source/OneSignalLifecycleObserver.m @@ -0,0 +1,102 @@ +// +// OneSignalLifecycleObserver.m +// OneSignal +// +// Created by Elliot Mawby on 7/30/20. +// Copyright © 2020 Hiptic. All rights reserved. +// + +#import +#import "OneSignalLifecycleObserver.h" +#import "OneSignal.h" +#import "OneSignalCommonDefines.h" +#import "OneSignalTracker.h" +#import "OneSignalLocation.h" +#import "OSMessagingController.h" + +@implementation OneSignalLifecycleObserver + +static OneSignalLifecycleObserver* _instance = nil; + ++(OneSignalLifecycleObserver*) sharedInstance { + @synchronized( _instance ) { + if( !_instance ) { + _instance = [[OneSignalLifecycleObserver alloc] init]; + } + } + + return _instance; +} + ++ (void)registerLifecycleObserver { + // Replace swizzled lifecycle selectors with notification center observers for scene based Apps + [[NSNotificationCenter defaultCenter] addObserver:[OneSignalLifecycleObserver sharedInstance] selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:[OneSignalLifecycleObserver sharedInstance] selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:[OneSignalLifecycleObserver sharedInstance] selector:@selector(applicationDidEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; + + + if (@available(iOS 13.0, *)) { + [[NSNotificationCenter defaultCenter] addObserver:[OneSignalLifecycleObserver sharedInstance] selector:@selector(sceneDidEnterBackground) name:UISceneDidEnterBackgroundNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:[OneSignalLifecycleObserver sharedInstance] selector:@selector(sceneDidBecomeActive) name:UISceneDidActivateNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:[OneSignalLifecycleObserver sharedInstance] selector:@selector(sceneWillResignActive) name:UISceneWillDeactivateNotification object:nil]; + } +} + ++ (void)removeObserver { + [[NSNotificationCenter defaultCenter] removeObserver:[OneSignalLifecycleObserver sharedInstance]]; +} + +- (void)sceneDidBecomeActive { + [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"ecm sceneDidBecomeActive"]; + + if ([OneSignal app_id]) { + [OneSignalTracker onFocus:NO]; + [OneSignalLocation onFocus:YES]; + [[OSMessagingController sharedInstance] onApplicationDidBecomeActive]; + } +} + +- (void)applicationDidBecomeActive { + [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"ecm applicationDidBecomeActive"]; + + if ([OneSignal app_id]) { + [OneSignalTracker onFocus:NO]; + [OneSignalLocation onFocus:YES]; + [[OSMessagingController sharedInstance] onApplicationDidBecomeActive]; + } +} + +- (void)sceneWillResignActive { + [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"ecm sceneWillResignActive"]; + + if ([OneSignal app_id]) + [OneSignalTracker onFocus:YES]; +} + +- (void)applicationWillResignActive { + [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"ecm applicationWillResignActive"]; + + if ([OneSignal app_id]) + [OneSignalTracker onFocus:YES]; +} + +- (void)sceneDidEnterBackground { + [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"ecm sceneDidEnterBackground"]; + + if ([OneSignal app_id]) + [OneSignalLocation onFocus:NO]; +} + +- (void)applicationDidEnterBackground { + [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"ecm applicationDidEnterBackground"]; + + if ([OneSignal app_id]) + [OneSignalLocation onFocus:NO]; +} + +- (void)dealloc { + [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"lifecycle observer deallocated"]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +@end diff --git a/iOS_SDK/OneSignalSDK/Source/UIApplicationDelegate+OneSignal.m b/iOS_SDK/OneSignalSDK/Source/UIApplicationDelegate+OneSignal.m index 48304f922..bb39847a5 100644 --- a/iOS_SDK/OneSignalSDK/Source/UIApplicationDelegate+OneSignal.m +++ b/iOS_SDK/OneSignalSDK/Source/UIApplicationDelegate+OneSignal.m @@ -101,16 +101,6 @@ - (void) setOneSignalDelegate:(id)delegate { [OneSignalAppDelegate sizzlePreiOS10MethodsPhase2]; - injectToProperClass(@selector(oneSignalApplicationWillResignActive:), - @selector(applicationWillResignActive:), delegateSubclasses, newClass, delegateClass); - - // Required for background location - injectToProperClass(@selector(oneSignalApplicationDidEnterBackground:), - @selector(applicationDidEnterBackground:), delegateSubclasses, newClass, delegateClass); - - injectToProperClass(@selector(oneSignalApplicationDidBecomeActive:), - @selector(applicationDidBecomeActive:), delegateSubclasses, newClass, delegateClass); - // Used to track how long the app has been closed injectToProperClass(@selector(oneSignalApplicationWillTerminate:), @selector(applicationWillTerminate:), delegateSubclasses, newClass, delegateClass); @@ -242,39 +232,6 @@ - (void)oneSignalLocalNotificationOpened:(UIApplication*)application notificatio [self oneSignalLocalNotificationOpened:application notification:notification]; } -- (void)oneSignalApplicationWillResignActive:(UIApplication*)application { - [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"oneSignalApplicationWillResignActive"]; - - if ([OneSignal app_id]) - [OneSignalTracker onFocus:YES]; - - if ([self respondsToSelector:@selector(oneSignalApplicationWillResignActive:)]) - [self oneSignalApplicationWillResignActive:application]; -} - -- (void) oneSignalApplicationDidEnterBackground:(UIApplication*)application { - [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"oneSignalApplicationDidEnterBackground"]; - - if ([OneSignal app_id]) - [OneSignalLocation onFocus:NO]; - - if ([self respondsToSelector:@selector(oneSignalApplicationDidEnterBackground:)]) - [self oneSignalApplicationDidEnterBackground:application]; -} - -- (void)oneSignalApplicationDidBecomeActive:(UIApplication*)application { - [OneSignal onesignal_Log:ONE_S_LL_VERBOSE message:@"oneSignalApplicationDidBecomeActive"]; - - if ([OneSignal app_id]) { - [OneSignalTracker onFocus:NO]; - [OneSignalLocation onFocus:YES]; - [[OSMessagingController sharedInstance] onApplicationDidBecomeActive]; - } - - if ([self respondsToSelector:@selector(oneSignalApplicationDidBecomeActive:)]) - [self oneSignalApplicationDidBecomeActive:application]; -} - -(void)oneSignalApplicationWillTerminate:(UIApplication *)application { if ([OneSignal app_id])