diff --git a/iOS_SDK/OneSignalDevApp/OneSignalDevApp/ExampleAppWidgetAttributes.swift b/iOS_SDK/OneSignalDevApp/OneSignalDevApp/ExampleAppWidgetAttributes.swift index 43b2ddd2c..6bb5aa8d8 100644 --- a/iOS_SDK/OneSignalDevApp/OneSignalDevApp/ExampleAppWidgetAttributes.swift +++ b/iOS_SDK/OneSignalDevApp/OneSignalDevApp/ExampleAppWidgetAttributes.swift @@ -39,7 +39,7 @@ import OneSignalLiveActivities public struct ContentState: OneSignalLiveActivityContentState { // Dynamic stateful properties about your activity go here! var message: String - + var onesignal: OneSignalLiveActivityContentStateData? } @@ -62,7 +62,7 @@ import OneSignalLiveActivities var status: String var progress: Double var bugs: Int - + var onesignal: OneSignalLiveActivityContentStateData? } diff --git a/iOS_SDK/OneSignalDevApp/OneSignalDevApp/LiveActivityController.swift b/iOS_SDK/OneSignalDevApp/OneSignalDevApp/LiveActivityController.swift index a2939b56d..f61eab7c1 100644 --- a/iOS_SDK/OneSignalDevApp/OneSignalDevApp/LiveActivityController.swift +++ b/iOS_SDK/OneSignalDevApp/OneSignalDevApp/LiveActivityController.swift @@ -47,7 +47,7 @@ class LiveActivityController: NSObject { // This is mostly for cross-platform SDKs and allows OneSignal to handle everything but the // creation of the Widget Extension. OneSignal.LiveActivities.setupDefault() - + if #available(iOS 17.2, *) { // ExampleAppThirdWidgetAttributes is an example of how to manually set up LA. // Setup an async task to monitor and send pushToStartToken updates to OneSignalSDK. @@ -109,11 +109,11 @@ class LiveActivityController: NSObject { if #available(iOS 16.1, *) { let attributeData: [String: Any] = ["title": "in-app-title"] let contentData: [String: Any] = ["message": ["en": "HELLO", "es": "HOLA"], "progress": 0.58, "status": "1/15", "bugs": 2] - + OneSignal.LiveActivities.startDefault(activityId, attributes: attributeData, content: contentData) } } - + /** An example of starting a Live Activity whose attributes are **not** "OneSignal SDK aware". The app must handle listening for update tokens and notify the OneSignal SDK. */ diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/AnyCodable.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/AnyCodable.swift index ffec9131b..8a5ec7d4a 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/AnyCodable.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/AnyCodable.swift @@ -14,18 +14,18 @@ import Foundation */ @frozen public struct AnyCodable: Codable { public let value: Any - + public func asBool() -> Bool? { return value as? Bool } public func asInt() -> Int? { return value as? Int } public func asDouble() -> Double? { return value as? Double } public func asString() -> String? { return value as? String } public func asArray() -> [AnyCodable]? { return value as? [AnyCodable] } - public func asDict() -> [String : AnyCodable]? { return value as? [String : AnyCodable] } + public func asDict() -> [String: AnyCodable]? { return value as? [String: AnyCodable] } public init(_ value: T?) { self.value = value ?? () } - + public init(nilLiteral _: ()) { self.init(nil as Any?) } @@ -57,7 +57,7 @@ import Foundation public init(dictionaryLiteral elements: (AnyHashable, Any)...) { self.init([AnyHashable: Any](elements, uniquingKeysWith: { first, _ in first })) } - + public init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() @@ -85,7 +85,7 @@ import Foundation throw DecodingError.dataCorruptedError(in: container, debugDescription: "AnyCodable value cannot be decoded") } } - + public func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() @@ -146,7 +146,7 @@ import Foundation #if canImport(Foundation) private func encode(nsnumber: NSNumber, into container: inout SingleValueEncodingContainer) throws { - switch Character(Unicode.Scalar(UInt8(nsnumber.objCType.pointee))) { + switch Character(Unicode.Scalar(UInt8(nsnumber.objCType.pointee))) { case "B": try container.encode(nsnumber.boolValue) case "c": @@ -263,7 +263,6 @@ extension AnyCodable: ExpressibleByStringInterpolation {} extension AnyCodable: ExpressibleByArrayLiteral {} extension AnyCodable: ExpressibleByDictionaryLiteral {} - extension AnyCodable: Hashable { public func hash(into hasher: inout Hasher) { switch value { diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift index af8ff7a65..c5c9011a9 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift @@ -138,7 +138,7 @@ class OSLiveActivitiesExecutor: OSPushSubscriptionObserver { if state.previous.id == state.current.id { return } - + // when a push subscription id changes, we need to re-send up all update and start tokens with the new ID. self.requestDispatch.async { self.caches { _ in diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OSLiveActivitiesExtension.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OSLiveActivitiesExtension.swift index bcda8e418..f90ca7891 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OSLiveActivitiesExtension.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OSLiveActivitiesExtension.swift @@ -77,7 +77,7 @@ public extension OSLiveActivities { static func setupDefault(options: LiveActivitySetupOptions? = nil) { OneSignalLiveActivitiesManagerImpl.setupDefault(options: options) } - + /** Start a new LiveActivity that is modelled by the default`DefaultLiveActivityAttributes` structure. The `DefaultLiveActivityAttributes` is initialized with the dynamic `attributes` and `content` passed in. @@ -87,7 +87,7 @@ public extension OSLiveActivities { - content: A dictionary of the initital content state passed into `DefaultLiveActivityAttributes`. */ @available(iOS 16.1, *) - static func startDefault(_ activityId: String, attributes: [String : Any], content: [String : Any]) { + static func startDefault(_ activityId: String, attributes: [String: Any], content: [String: Any]) { OneSignalLiveActivitiesManagerImpl.startDefault(activityId, attributes: attributes, content: content) } } @@ -96,7 +96,7 @@ public extension OSLiveActivities { The setup options for `OneSignal.LiveActivities.setup`. */ @objc(LiveActivitySetupOptions) -public class LiveActivitySetupOptions : NSObject { +public class LiveActivitySetupOptions: NSObject { /** When true, OneSignal will listen for pushToStart tokens for the `OneSignalLiveActivityAttributes` structure. */ @@ -109,7 +109,7 @@ public class LiveActivitySetupOptions : NSObject { */ @objc public var enablePushToUpdate: Bool = true - + @objc public init(enablePushToStart: Bool = true, enablePushToUpdate: Bool = true) { self.enablePushToStart = enablePushToStart diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift index 3678ed52e..4fd11ed84 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/OneSignalLiveActivitiesManagerImpl.swift @@ -63,11 +63,11 @@ public class OneSignalLiveActivitiesManagerImpl: NSObject, OSLiveActivities { @available(iOS 17.2, *) public static func setPushToStartToken(_ activityType: String, withToken: String) throws { OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OneSignal.LiveActivities setStartToken called with activityType: \(activityType) token: \(withToken)") - + guard let activityType = activityType.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlUserAllowed) else { throw LiveActivitiesError.invalidActivityType("Cannot translate activity type to url encoded string.") } - + _executor.append(OSRequestSetStartToken(key: activityType, token: withToken)) } @@ -75,7 +75,7 @@ public class OneSignalLiveActivitiesManagerImpl: NSObject, OSLiveActivities { @available(iOS 17.2, *) public static func removePushToStartToken(_ activityType: String) throws { OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OneSignal.LiveActivities removeStartToken called with activityType: \(activityType)") - + guard let activityType = activityType.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlUserAllowed) else { throw LiveActivitiesError.invalidActivityType("Cannot translate activity type to url encoded string.") } @@ -138,28 +138,28 @@ public class OneSignalLiveActivitiesManagerImpl: NSObject, OSLiveActivities { } listenForActivity(activityType, options: options) } - + @objc @available(iOS 16.1, *) public static func setupDefault(options: LiveActivitySetupOptions? = nil) { setup(DefaultLiveActivityAttributes.self, options: options) } - + @objc @available(iOS 16.1, *) - public static func startDefault(_ activityId: String, attributes: [String : Any], content: [String : Any]) { + public static func startDefault(_ activityId: String, attributes: [String: Any], content: [String: Any]) { let oneSignalAttribute = OneSignalLiveActivityAttributeData.create(activityId: activityId) - + var attributeData = [String: AnyCodable]() for attribute in attributes { attributeData.updateValue(AnyCodable(attribute.value), forKey: attribute.key) } - + var contentData = [String: AnyCodable]() for contentItem in content { contentData.updateValue(AnyCodable(contentItem.value), forKey: contentItem.key) } - + let attributes = DefaultLiveActivityAttributes(data: attributeData, onesignal: oneSignalAttribute) let contentState = DefaultLiveActivityAttributes.ContentState(data: contentData) do { diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestRemoveUpdateToken.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestRemoveUpdateToken.swift index 3f6744c06..8dbcdeae1 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestRemoveUpdateToken.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestRemoveUpdateToken.swift @@ -50,7 +50,7 @@ class OSRequestRemoveUpdateToken: OneSignalRequest, OSLiveActivityRequest, OSLiv OneSignalLog.onesignalLog(.LL_DEBUG, message: "Cannot translate activity type to url encoded string.") return false } - + // self.path = "apps/\(appId)/activities/tokens/update/\(activityId)/subscriptions/\(subscriptionId)" self.path = "apps/\(appId)/live_activities/\(activityId)/token/\(subscriptionId)" self.method = DELETE diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestSetStartToken.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestSetStartToken.swift index 4fca9a524..d579f3606 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestSetStartToken.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestSetStartToken.swift @@ -51,7 +51,7 @@ class OSRequestSetStartToken: OneSignalRequest, OSLiveActivityRequest, OSLiveAct OneSignalLog.onesignalLog(.LL_DEBUG, message: "Cannot translate activity type to url encoded string.") return false } - + self.path = "apps/\(appId)/activities/tokens/start/\(activityType)/subscriptions/\(subscriptionId)" self.parameters = ["activity_token": self.token, "device_type": 0] self.method = PUT diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivitiesTests/DefaultLiveActivityAttributesTests.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivitiesTests/DefaultLiveActivityAttributesTests.swift index caa288b5b..bbcb0bdeb 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivitiesTests/DefaultLiveActivityAttributesTests.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivitiesTests/DefaultLiveActivityAttributesTests.swift @@ -72,7 +72,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { } } """.data(using: .utf8)! - + /* When */ let decoder = JSONDecoder() let sut = try decoder.decode(DefaultLiveActivityAttributes.self, from: json) @@ -113,7 +113,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { XCTAssertEqual(sut.data["dictValue"]?.asDict()?["anotherDict"]?.asDict()?["intValue"]?.asInt(), 7) XCTAssertEqual(sut.onesignal.activityId, "my-activity-id") } - + func testProperDecodingOfAttributesWithExtraOneSignalParameters() throws { /* Setup */ let json = """ @@ -126,7 +126,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { } } """.data(using: .utf8)! - + /* When */ let decoder = JSONDecoder() _ = try decoder.decode(DefaultLiveActivityAttributes.self, from: json) @@ -134,19 +134,19 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { /* Then */ // not blowing up is a passed test } - + func testEmptyAttributesPayloadThrowsError() { /* Setup */ let json = """ { } """.data(using: .utf8)! - + /* When/Then */ let decoder = JSONDecoder() XCTAssertThrowsError(try decoder.decode(DefaultLiveActivityAttributes.self, from: json)) } - + func testMissingDataInAttributesPayloadThrowsError() { /* Setup */ let json = """ @@ -154,12 +154,12 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { "notData": {} } """.data(using: .utf8)! - + /* When/Then */ let decoder = JSONDecoder() XCTAssertThrowsError(try decoder.decode(DefaultLiveActivityAttributes.self, from: json)) } - + func testProperDecodingOfContentStatePayload() throws { /* Setup */ let json = """ @@ -192,7 +192,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { } } """.data(using: .utf8)! - + /* When */ let decoder = JSONDecoder() let sut = try decoder.decode(DefaultLiveActivityAttributes.ContentState.self, from: json) @@ -233,7 +233,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { XCTAssertEqual(sut.data["dictValue"]?.asDict()?["anotherDict"]?.asDict()?["intValue"]?.asInt(), 7) XCTAssertNil(sut.onesignal) } - + func testProperDecodingOfContentStateWithOneSignalPayload() throws { /* Setup */ let json = """ @@ -245,7 +245,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { } } """.data(using: .utf8)! - + /* When */ let decoder = JSONDecoder() let sut = try decoder.decode(DefaultLiveActivityAttributes.ContentState.self, from: json) @@ -253,7 +253,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { /* Then */ XCTAssertEqual(sut.onesignal?.notificationId, "my-notification-id") } - + func testProperDecodingOfContentStateWithExtraOneSignalParameters() throws { /* Setup */ let json = """ @@ -266,7 +266,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { } } """.data(using: .utf8)! - + /* When */ let decoder = JSONDecoder() _ = try decoder.decode(DefaultLiveActivityAttributes.ContentState.self, from: json) @@ -274,19 +274,19 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { /* Then */ // not blowing up is a passed test } - + func testEmptyContentStatePayloadThrowsError() { /* Setup */ let json = """ { } """.data(using: .utf8)! - + /* When/Then */ let decoder = JSONDecoder() XCTAssertThrowsError(try decoder.decode(DefaultLiveActivityAttributes.ContentState.self, from: json)) } - + func testMissingDataInContentStatePayloadThrowsError() { /* Setup */ let json = """ @@ -294,7 +294,7 @@ final class DefaultLiveActivityAttributesTests: XCTestCase { "notData": {} } """.data(using: .utf8)! - + /* When/Then */ let decoder = JSONDecoder() XCTAssertThrowsError(try decoder.decode(DefaultLiveActivityAttributes.ContentState.self, from: json)) diff --git a/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSStubLiveActivities.swift b/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSStubLiveActivities.swift index 54ab3cee5..ea91df7f9 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSStubLiveActivities.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/OSStubLiveActivities.swift @@ -9,26 +9,26 @@ import OneSignalCore public class OSStubLiveActivities: NSObject, OSLiveActivities { - + @objc public static func liveActivities() -> AnyClass { return OSStubLiveActivities.self } - + public static func enter(_ activityId: String, withToken: String) { OneSignalLog.onesignalLog(.LL_ERROR, message: "OneSignalLiveActivities not found. In order to use OneSignal's LiveActivities features the OneSignalLiveActivities module must be added.") } - + public static func enter(_ activityId: String, withToken: String, withSuccess: OSResultSuccessBlock?, withFailure: OSFailureBlock?) { OneSignalLog.onesignalLog(.LL_ERROR, message: "OneSignalLiveActivities not found. In order to use OneSignal's LiveActivities features the OneSignalLiveActivities module must be added.") } - + public static func exit(_ activityId: String) { OneSignalLog.onesignalLog(.LL_ERROR, message: "OneSignalLiveActivities not found. In order to use OneSignal's LiveActivities features the OneSignalLiveActivities module must be added.") } - + public static func exit(_ activityId: String, withSuccess: OSResultSuccessBlock?, withFailure: OSFailureBlock?) { OneSignalLog.onesignalLog(.LL_ERROR, message: "OneSignalLiveActivities not found. In order to use OneSignal's LiveActivities features the OneSignalLiveActivities module must be added.") } - + } diff --git a/iOS_SDK/OneSignalSDK/UnitTests/LiveActivitiesSwiftTests.swift b/iOS_SDK/OneSignalSDK/UnitTests/LiveActivitiesSwiftTests.swift index e5a57e0e7..7cd8891b7 100644 --- a/iOS_SDK/OneSignalSDK/UnitTests/LiveActivitiesSwiftTests.swift +++ b/iOS_SDK/OneSignalSDK/UnitTests/LiveActivitiesSwiftTests.swift @@ -39,7 +39,7 @@ class DummyOneSignalAwareActivityAttributes: OneSignalLiveActivityAttributes { public struct ContentState: OneSignalLiveActivityContentState { public var onesignal: OneSignalLiveActivityContentStateData? - + } } @@ -53,13 +53,13 @@ class LiveActivitiesSwiftTests: XCTestCase { OneSignal.LiveActivities.enter("my-activity-id", withToken: "my-token", withSuccess: {_ in }, withFailure: {_ in }) OneSignal.LiveActivities.exit("my-activity-id") OneSignal.LiveActivities.exit("my-activity-id", withSuccess: {_ in }, withFailure: {_ in }) - + if #available(iOS 16.1, *) { OneSignal.LiveActivities.setup(DummyOneSignalAwareActivityAttributes.self) OneSignal.LiveActivities.setup(DummyOneSignalAwareActivityAttributes.self, options: LiveActivitySetupOptions()) OneSignal.LiveActivities.setupDefault() OneSignal.LiveActivities.setupDefault(options: LiveActivitySetupOptions()) - + OneSignal.LiveActivities.startDefault("my-activity-id", attributes: [:], content: [:]) }