diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSPropertiesModel.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSPropertiesModel.swift index e9575dddf..03d2901f6 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSPropertiesModel.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSPropertiesModel.swift @@ -63,7 +63,14 @@ class OSPropertiesModel: OSModel { } } - var timezoneId = TimeZone.current.identifier + var timezoneId: String? = TimeZone.current.identifier { + didSet { + guard timezoneId != oldValue else { + return + } + self.set(property: "timezone_id", newValue: timezoneId) + } + } var tags: [String: String] = [:] private let tagsLock = NSRecursiveLock() @@ -90,6 +97,7 @@ class OSPropertiesModel: OSModel { super.encode(with: coder) coder.encode(language, forKey: "language") coder.encode(tags, forKey: "tags") + coder.encode(timezoneId, forKey: "timezoneId") // ... and more } } @@ -97,6 +105,7 @@ class OSPropertiesModel: OSModel { required init?(coder: NSCoder) { super.init(coder: coder) language = coder.decodeObject(forKey: "language") as? String + timezoneId = coder.decodeObject(forKey: "timezoneId") as? String guard let tags = coder.decodeObject(forKey: "tags") as? [String: String] else { // log error return @@ -106,6 +115,10 @@ class OSPropertiesModel: OSModel { // ... and more } + func update() { + timezoneId = TimeZone.current.identifier + } + /** Called to clear the model's data in preparation for hydration via a fetch user call. */ diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSUserInternalImpl.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSUserInternalImpl.swift index 75b02deb6..ff705640b 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSUserInternalImpl.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OSUserInternalImpl.swift @@ -37,6 +37,7 @@ protocol OSUserInternal { var pushSubscriptionModel: OSSubscriptionModel { get } var identityModel: OSIdentityModel { get } var propertiesModel: OSPropertiesModel { get } + func update() // Aliases func addAliases(_ aliases: [String: String]) func removeAliases(_ labels: [String]) @@ -72,6 +73,11 @@ class OSUserInternalImpl: NSObject, OSUserInternal { self.pushSubscriptionModel = pushSubscriptionModel } + func update() { + self.pushSubscriptionModel.update() + self.propertiesModel.update() + } + // MARK: - Aliases /** diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift index d1ad50a08..5d22dc858 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/OneSignalUserManagerImpl.swift @@ -256,7 +256,7 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager { subscriptionModelStoreListener.start() pushSubscriptionModelStoreListener.start() if hasCachedUser { - _user?.pushSubscriptionModel.update() + _user?.update() } } @@ -294,6 +294,18 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager { // 3. Make the request userExecutor!.fetchIdentityBySubscription(newUser) + + // 4. Send any updates to sync the local state + updateLegacyPlayer(newUser) + } + + /** + Migrating a legacy player does not result in a Create User call, but certain local data should be sent manually. + */ + private func updateLegacyPlayer(_ user: OSUserInternal) { + if let timezoneId = user.propertiesModel.timezoneId { + updatePropertiesDeltas(property: .timezone_id, value: timezoneId) + } } private func createNewUser(externalId: String?, token: String?) -> OSUserInternal { @@ -567,6 +579,7 @@ extension OneSignalUserManagerImpl { /// It enqueues an OSDelta to the Operation Repo. /// /// - Parameter property:Expected inputs are `.session_time"`, `.session_count"`, and `.purchases"`. + /// May be `.timezone_id` or others if the SDK is sending an update for a legacy player. func updatePropertiesDeltas(property: OSPropertiesSupportedProperty, value: Any, flush: Bool = false) { guard !OneSignalConfigManager.shouldAwaitAppIdAndLogMissingPrivacyConsent(forMethod: "updatePropertiesDeltas") else { return diff --git a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Support/OSPropertiesSupportedProperty.swift b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Support/OSPropertiesSupportedProperty.swift index ecaa24777..c33af2091 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Support/OSPropertiesSupportedProperty.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalUser/Source/Support/OSPropertiesSupportedProperty.swift @@ -36,6 +36,7 @@ enum OSPropertiesSupportedProperty: String { case language case location case tags + case timezone_id // Created manually by User Manager, not through Models case session_count case session_time