From a95cdea47a715f75464727b25f5a8140cc538866 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 27 Feb 2024 08:55:01 -0500 Subject: [PATCH] * Change convenience method from `monitor` to `setup` and add setup options for more granular control. * Do not retry LA reqeust when retryable failure until app restarts --- .../LiveActivityController.swift | 6 ++--- .../OneSignal.xcodeproj/project.pbxproj | 17 ++++++++++++++ .../Executors/OSLiveActivitiesExecutor.swift | 4 ++-- .../Source/OSLiveActivities.swift | 23 ++++++++++++++++--- .../OneSignalLiveActivitiesManagerImpl.swift | 16 +++++++------ 5 files changed, 50 insertions(+), 16 deletions(-) diff --git a/iOS_SDK/OneSignalDevApp/OneSignalDevApp/LiveActivityController.swift b/iOS_SDK/OneSignalDevApp/OneSignalDevApp/LiveActivityController.swift index 73800bc44..4598c83d4 100644 --- a/iOS_SDK/OneSignalDevApp/OneSignalDevApp/LiveActivityController.swift +++ b/iOS_SDK/OneSignalDevApp/OneSignalDevApp/LiveActivityController.swift @@ -28,8 +28,6 @@ import Foundation import ActivityKit import UserNotifications -import OneSignalUser -import OneSignalLiveActivities import OneSignalFramework @objc @@ -40,8 +38,8 @@ class LiveActivityController: NSObject { static func start() { // ExampleAppFirstWidgetAttributes and ExampleAppSecondWidgetAttributes enable the OneSignal SDK to // listen for start/update tokens, this is the only call needed. - OneSignal.LiveActivities.monitor(ExampleAppFirstWidgetAttributes.self) - OneSignal.LiveActivities.monitor(ExampleAppSecondWidgetAttributes.self) + OneSignal.LiveActivities.setup(ExampleAppFirstWidgetAttributes.self) + OneSignal.LiveActivities.setup(ExampleAppSecondWidgetAttributes.self) if #available(iOS 17.2, *) { // ExampleAppThirdWidgetAttributes is an example of how to manually set up LA. diff --git a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj index dc7ecf48c..4f5b44bed 100644 --- a/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj +++ b/iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj @@ -148,6 +148,8 @@ 4746E2A72B86B64100D6324C /* LiveActivitiesSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4746E2A62B86B64100D6324C /* LiveActivitiesSwiftTests.swift */; }; 4746E2AB2B8775C400D6324C /* LiveActivitiesObjcTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4746E2AA2B8775C400D6324C /* LiveActivitiesObjcTests.m */; }; 4746E2AD2B8833C200D6324C /* OSLiveActivities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4746E2AC2B8833C200D6324C /* OSLiveActivities.swift */; }; + 4746E2AE2B8946F200D6324C /* OneSignalCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE7D17E627026B95002D3A5D /* OneSignalCore.framework */; }; + 4746E2AF2B8946F200D6324C /* OneSignalCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE7D17E627026B95002D3A5D /* OneSignalCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 47AE653C2B7D39DF006EBAA9 /* OneSignalLiveActivities.h in Headers */ = {isa = PBXBuildFile; fileRef = 47AE653B2B7D39DF006EBAA9 /* OneSignalLiveActivities.h */; settings = {ATTRIBUTES = (Public, ); }; }; 47AE653F2B7D39DF006EBAA9 /* OneSignalLiveActivities.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47AE65392B7D39DF006EBAA9 /* OneSignalLiveActivities.framework */; }; 47AE65402B7D39DF006EBAA9 /* OneSignalLiveActivities.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 47AE65392B7D39DF006EBAA9 /* OneSignalLiveActivities.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -569,6 +571,13 @@ remoteGlobalIDString = DE69E19A282ED8060090BB3D; remoteInfo = OneSignalUser; }; + 4746E2B02B8946F200D6324C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37747F8B19147D6400558FAD /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE7D17E527026B95002D3A5D; + remoteInfo = OneSignalCore; + }; 47AE653D2B7D39DF006EBAA9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 37747F8B19147D6400558FAD /* Project object */; @@ -802,6 +811,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 4746E2AF2B8946F200D6324C /* OneSignalCore.framework in Embed Frameworks */, 472620BA2B7D6EF90014013A /* OneSignalUser.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -1293,6 +1303,7 @@ buildActionMask = 2147483647; files = ( 472620B92B7D6EF90014013A /* OneSignalUser.framework in Frameworks */, + 4746E2AE2B8946F200D6324C /* OneSignalCore.framework in Frameworks */, 472620B82B7D6E6D0014013A /* ActivityKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2616,6 +2627,7 @@ ); dependencies = ( 472620BC2B7D6EFA0014013A /* PBXTargetDependency */, + 4746E2B12B8946F200D6324C /* PBXTargetDependency */, ); name = OneSignalLiveActivities; productName = OneSignalLiveActivities; @@ -3467,6 +3479,11 @@ target = DE69E19A282ED8060090BB3D /* OneSignalUser */; targetProxy = 472620BB2B7D6EFA0014013A /* PBXContainerItemProxy */; }; + 4746E2B12B8946F200D6324C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DE7D17E527026B95002D3A5D /* OneSignalCore */; + targetProxy = 4746E2B02B8946F200D6324C /* PBXContainerItemProxy */; + }; 47AE653E2B7D39DF006EBAA9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 47AE65382B7D39DF006EBAA9 /* OneSignalLiveActivities */; diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift index 1cdd888a1..7096a2568 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift @@ -121,7 +121,7 @@ class OSLiveActivitiesExecutor : OSPushSubscriptionObserver { // The live activities request dispatch queue, serial. This synchronizes access to `updateTokens` and `startTokens`. private var requestDispatch: DispatchQueue = DispatchQueue(label: "OneSignal.LiveActivities") - private var pollIntervalSeconds = 60 + private var pollIntervalSeconds = 30 func start() { OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OneSignal.LiveActivities starting executor") @@ -216,7 +216,7 @@ class OSLiveActivitiesExecutor : OSPushSubscriptionObserver { return } } - self.pollPendingRequests() + // retryable failures will stay in the cache, and will retry the next time the app starts } } } diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OSLiveActivities.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OSLiveActivities.swift index b27652f84..01ac94c45 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OSLiveActivities.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OSLiveActivities.swift @@ -95,15 +95,16 @@ public protocol OSLiveActivities { public extension OSLiveActivities { /** - Enable the OneSignalSDK to monitor the provided`ActivityAttributes` structure, which conforms to the + Enable the OneSignalSDK to setup the provided`ActivityAttributes` structure, which conforms to the `OneSignalLiveActivityAttributes`. When using this function, OneSignal will manage the capturing and synchronizing of both pushToStart and pushToUpdate tokens. - Parameters - activityType: The specific `OneSignalLiveActivityAttributes` structure tied to the live activity. + - options: An optional structure to provide for more granular setup options. */ @available(iOS 16.1, *) - static func monitor(_ activityType: T.Type) { - OneSignalLiveActivitiesManagerImpl.monitor(activityType) + static func setup(_ activityType: T.Type, options: LiveActivitySetupOptions? = nil) { + OneSignalLiveActivitiesManagerImpl.setup(activityType, options: options) } /** @@ -127,3 +128,19 @@ public extension OSLiveActivities { OneSignalLiveActivitiesManagerImpl.removePushToStartToken(activityType) } } + +/** + The setup options for `OneSignal.LiveActivities.setup`. + */ +public struct LiveActivitySetupOptions { + /** + When true, OneSignal will listen for pushToStart tokens for the `OneSignalLiveActivityAttributes` structure. + */ + public var enablePushToStart: Bool = true + + /** + When true, OneSignal will listen for pushToUpdate tokens for each start live activity that uses the + `OneSignalLiveActivityAttributes` structure. + */ + public var enablePushToUpdate: Bool = true +} diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift index 2e600a4db..5ba336191 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift @@ -98,8 +98,8 @@ public class OneSignalLiveActivitiesManagerImpl: NSObject, OSLiveActivities { } @available(iOS 16.1, *) - public static func monitor(_ activityType: Attributes.Type) { - if #available(iOS 17.2, *) { + public static func setup(_ activityType: Attributes.Type, options: LiveActivitySetupOptions? = nil) { + if #available(iOS 17.2, *), (options == nil || options!.enablePushToStart) { Task { for try await data in Activity.pushToStartTokenUpdates { let token = data.map {String(format: "%02x", $0)}.joined() @@ -134,11 +134,13 @@ public class OneSignalLiveActivitiesManagerImpl: NSObject, OSLiveActivities { } } - // listen for activity update token updates so we can tell OneSignal how to update the activity - Task { - for await pushToken in activity.pushTokenUpdates { - let token = pushToken.map {String(format: "%02x", $0)}.joined() - OneSignalLiveActivitiesManagerImpl.enter(activity.attributes.onesignal.activityId, withToken: token) + if (options == nil || options!.enablePushToUpdate) { + // listen for activity update token updates so we can tell OneSignal how to update the activity + Task { + for await pushToken in activity.pushTokenUpdates { + let token = pushToken.map {String(format: "%02x", $0)}.joined() + OneSignalLiveActivitiesManagerImpl.enter(activity.attributes.onesignal.activityId, withToken: token) + } } } }