diff --git a/Apps/CocoaPods-FCM/src/View/SettingsView.swift b/Apps/CocoaPods-FCM/src/View/SettingsView.swift index eef5a4f16..53991f73f 100644 --- a/Apps/CocoaPods-FCM/src/View/SettingsView.swift +++ b/Apps/CocoaPods-FCM/src/View/SettingsView.swift @@ -156,7 +156,7 @@ struct SettingsView: View { init() { self.settingsManager = CioSettingsManager() self.keyValueStorage = KeyValueStore() - self.pushToken = keyValueStorage.pushToken ?? "(none)" + self.pushToken = CustomerIO.shared.registeredDeviceToken ?? "(none)" self.settings = settingsManager.appSetSettings ?? CioSettings.getFromCioSdk() } diff --git a/Sources/Tracking/CustomerIO.swift b/Sources/Tracking/CustomerIO.swift index f86c13bac..916b5e009 100644 --- a/Sources/Tracking/CustomerIO.swift +++ b/Sources/Tracking/CustomerIO.swift @@ -21,6 +21,8 @@ public protocol CustomerIOInstance: AutoMockable { body: RequestBody ) + var registeredDeviceToken: String? { get } + func clearIdentify() func track( @@ -238,6 +240,18 @@ public class CustomerIO: CustomerIOInstance { ) } + /** + Use `registeredDeviceToken` to fetch the current FCM/APN device token. + This returns an optional string value. + Example use: + ``` + CustomerIO.shared.registeredDeviceToken + ``` + */ + public var registeredDeviceToken: String? { + implementation?.registeredDeviceToken + } + public var config: SdkConfig? { implementation?.config } diff --git a/Sources/Tracking/CustomerIOImplementation.swift b/Sources/Tracking/CustomerIOImplementation.swift index 26e01155b..0f3bcb49b 100644 --- a/Sources/Tracking/CustomerIOImplementation.swift +++ b/Sources/Tracking/CustomerIOImplementation.swift @@ -72,6 +72,10 @@ class CustomerIOImplementation: CustomerIOInstance { } } + public var registeredDeviceToken: String? { + globalDataStore.pushDeviceToken + } + // this function could use a refactor. It's long and complex. Our automated tests are what keeps us feeling // confident in the code, but the code here is difficult to maintain. // swiftlint:disable:next function_body_length diff --git a/Sources/Tracking/autogenerated/AutoMockable.generated.swift b/Sources/Tracking/autogenerated/AutoMockable.generated.swift index 7809fc03e..2cce3e650 100644 --- a/Sources/Tracking/autogenerated/AutoMockable.generated.swift +++ b/Sources/Tracking/autogenerated/AutoMockable.generated.swift @@ -210,6 +210,42 @@ public class CustomerIOInstanceMock: CustomerIOInstance, Mock { } } + /** + When setter of the property called, the value given to setter is set here. + When the getter of the property called, the value set here will be returned. Your chance to mock the property. + */ + public var underlyingRegisteredDeviceToken: String? = nil + /// `true` if the getter or setter of property is called at least once. + public var registeredDeviceTokenCalled: Bool { + registeredDeviceTokenGetCalled || registeredDeviceTokenSetCalled + } + + /// `true` if the getter called on the property at least once. + public var registeredDeviceTokenGetCalled: Bool { + registeredDeviceTokenGetCallsCount > 0 + } + + public var registeredDeviceTokenGetCallsCount = 0 + /// `true` if the setter called on the property at least once. + public var registeredDeviceTokenSetCalled: Bool { + registeredDeviceTokenSetCallsCount > 0 + } + + public var registeredDeviceTokenSetCallsCount = 0 + /// The mocked property with a getter and setter. + public var registeredDeviceToken: String? { + get { + mockCalled = true + registeredDeviceTokenGetCallsCount += 1 + return underlyingRegisteredDeviceToken + } + set(value) { + mockCalled = true + registeredDeviceTokenSetCallsCount += 1 + underlyingRegisteredDeviceToken = value + } + } + /** When setter of the property called, the value given to setter is set here. When the getter of the property called, the value set here will be returned. Your chance to mock the property. @@ -289,6 +325,9 @@ public class CustomerIOInstanceMock: CustomerIOInstance, Mock { config = nil configGetCallsCount = 0 configSetCallsCount = 0 + registeredDeviceToken = nil + registeredDeviceTokenGetCallsCount = 0 + registeredDeviceTokenSetCallsCount = 0 profileAttributesGetCallsCount = 0 profileAttributesSetCallsCount = 0 deviceAttributesGetCallsCount = 0 diff --git a/Tests/Tracking/CustomerIOImplementationTest.swift b/Tests/Tracking/CustomerIOImplementationTest.swift index 515428a1f..9e2b7d1e4 100644 --- a/Tests/Tracking/CustomerIOImplementationTest.swift +++ b/Tests/Tracking/CustomerIOImplementationTest.swift @@ -296,6 +296,17 @@ class CustomerIOImplementationTest: UnitTest { XCTAssertEqual(globalDataStoreMock.pushDeviceToken, givenDeviceToken) } + func test_registeredDeviceToken_givenDeviceTokenAlreadySaved_expectToken() { + let givenDeviceToken = String.random + customerIO.registerDeviceToken(givenDeviceToken) + + XCTAssertEqual(customerIO.registeredDeviceToken, givenDeviceToken) + } + + func test_registeredDeviceToken_givenDeviceTokenNotSaved_expectNil() { + XCTAssertNil(customerIO.registeredDeviceToken) + } + func test_registerDeviceToken_givenCustomerIdentified_expectAddTaskToQueue_expectStoreDeviceToken() { let givenDeviceToken = String.random let givenIdentifier = String.random