Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -134,26 +134,6 @@ class OSIdentityModel: OSModel {
let newExternalId = remoteAliases[OS_EXTERNAL_ID]

internalAddAliases(remoteAliases)
fireUserStateChanged(newOnesignalId: newOnesignalId, newExternalId: newExternalId)
}

/**
Fires the user observer if `onesignal_id` OR `external_id` has changed from the previous snapshot (previous hydration).
*/
private func fireUserStateChanged(newOnesignalId: String?, newExternalId: String?) {
let prevOnesignalId = OneSignalUserDefaults.initShared().getSavedString(forKey: OS_SNAPSHOT_ONESIGNAL_ID, defaultValue: nil)
let prevExternalId = OneSignalUserDefaults.initShared().getSavedString(forKey: OS_SNAPSHOT_EXTERNAL_ID, defaultValue: nil)

guard prevOnesignalId != newOnesignalId || prevExternalId != newExternalId else {
return
}

OneSignalUserDefaults.initShared().saveString(forKey: OS_SNAPSHOT_ONESIGNAL_ID, withValue: newOnesignalId)
OneSignalUserDefaults.initShared().saveString(forKey: OS_SNAPSHOT_EXTERNAL_ID, withValue: newExternalId)

let curUserState = OSUserState(onesignalId: newOnesignalId, externalId: newExternalId)
let changedState = OSUserChangedState(current: curUserState)

OneSignalUserManagerImpl.sharedInstance.userStateChangesObserver.notifyChange(changedState)
OSUserUtils.fireUserStateChanged(newOnesignalId: newOnesignalId, newExternalId: newExternalId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ enum OSSubscriptionType: String {
Internal subscription model.
*/
class OSSubscriptionModel: OSModel {
struct Constants {
static let isDisabledInternallyKey = "isDisabledInternallyKey"
}

var type: OSSubscriptionType

var address: String? { // This is token on push subs so must remain Optional
Expand Down Expand Up @@ -194,6 +198,21 @@ class OSSubscriptionModel: OSModel {
}
}

/**
Set to `true` by the SDK when logout is called with Identity Verification turned on.
The properties of `_isDisabled` and `notificationTypes` remain unchanged, to maintain correct data.
When a subscription update is made, this value will be read and `enabled = false` and `notification_types = -2` will be sent.
When a user logs in, this property will be set to `false` and the subscription will be included in the User Create request..
*/
var _isDisabledInternally = false {
didSet {
guard _isDisabledInternally != oldValue else {
return
}
self.set(property: Constants.isDisabledInternallyKey, newValue: _isDisabledInternally)
}
}

// Properties for push subscription
var testType: Int? {
didSet {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ class OSSubscriptionModelStoreListener: OSModelStoreListener {
}

func getUpdateModelDelta(_ args: OSModelChangedArgs) -> OSDelta? {
/*
Don't generate a Delta if setting internal disable to false, which will generate a subscription update.
This means a user is logging in and a create user will be sent with the updated subscription included.
*/
if args.property == OSSubscriptionModel.Constants.isDisabledInternallyKey && args.newValue as? Bool == false {
return nil
}

return OSDelta(
name: OS_UPDATE_SUBSCRIPTION_DELTA,
identityModelId: OneSignalUserManagerImpl.sharedInstance.user.identityModel.modelId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,10 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager {
}
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OneSignalUserManager internal _login called with externalId: \(externalId ?? "nil")")

if externalId != nil {
pushSubscriptionModel?._isDisabledInternally = false
}

/*
Logging in to a "new-to-the-sdk" externalId from an anonymous user, if JWT is OFF or UNKNOWN.

Expand Down Expand Up @@ -440,6 +444,17 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager {
prepareForNewUser()
_user = nil
createUserIfNil()

/*
If Identity Verification is on, disable the push subscription.
Since the anonymous placeholder user will not be created to the backend,
fire the user observer here to represent "no user" in the SDK.
This is necessary so internal user observers can know when a user logs out and then back in.
*/
if jwtConfig.isRequired == true {
user.pushSubscriptionModel._isDisabledInternally = true
OSUserUtils.fireUserStateChanged(newOnesignalId: nil, newExternalId: nil)
}
}

@objc
Expand Down Expand Up @@ -561,16 +576,6 @@ public class OneSignalUserManagerImpl: NSObject, OneSignalUserManager {
}
updatePropertiesDeltas(property: .purchases, value: purchases)
}

@objc
public func updateUserJwt(externalId: String, token: String) {
guard !OneSignalConfigManager.shouldAwaitAppIdAndLogMissingPrivacyConsent(forMethod: "updateUserJwt") else {
return
}
OneSignalLog.onesignalLog(ONE_S_LOG_LEVEL.LL_VERBOSE, message: "Update User JWT called with externalId: \(externalId) and token: \(token)")

identityModelRepo.updateJwtToken(externalId: externalId, token: token)
}
}

// MARK: - Sessions
Expand Down Expand Up @@ -663,6 +668,16 @@ extension OneSignalUserManagerImpl {
jwtConfig.subscribe(listener, key: key)
}

@objc
public func updateUserJwt(externalId: String, token: String) {
guard !OneSignalConfigManager.shouldAwaitAppIdAndLogMissingPrivacyConsent(forMethod: "updateUserJwt") else {
return
}
OneSignalLog.onesignalLog(ONE_S_LOG_LEVEL.LL_VERBOSE, message: "Update User JWT called with externalId: \(externalId) and token: \(token)")

identityModelRepo.updateJwtToken(externalId: externalId, token: token)
}

@objc
public func invalidateJwtForExternalId(externalId: String, error: NSError) {
guard jwtConfig.isRequired == true else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,17 +65,23 @@ class OSRequestUpdateSubscription: OneSignalRequest, OSUserRequest {
var subscriptionParams = subscriptionObject
subscriptionParams.removeValue(forKey: "address")
subscriptionParams.removeValue(forKey: "notificationTypes")
subscriptionParams.removeValue(forKey: OSSubscriptionModel.Constants.isDisabledInternallyKey)
subscriptionParams["token"] = subscriptionModel.address
subscriptionParams["device_os"] = subscriptionModel.deviceOs
subscriptionParams["sdk"] = subscriptionModel.sdk
subscriptionParams["app_version"] = subscriptionModel.appVersion

// notificationTypes defaults to -1 instead of nil, don't send if it's -1
if subscriptionModel.notificationTypes != -1 {
subscriptionParams["notification_types"] = subscriptionModel.notificationTypes
if subscriptionModel._isDisabledInternally {
subscriptionParams["enabled"] = false
subscriptionParams["notification_types"] = -2
} else {
// notificationTypes defaults to -1 instead of nil, don't send if it's -1
if subscriptionModel.notificationTypes != -1 {
subscriptionParams["notification_types"] = subscriptionModel.notificationTypes
}
subscriptionParams["enabled"] = subscriptionModel.enabled
}

subscriptionParams["enabled"] = subscriptionModel.enabled
// TODO: The above is not quite right. If we hydrate, we will over-write any pending updates
// May use subscriptionObject, but enabled and notification_types should be sent together...

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,24 @@ class OSUserUtils {
}
return headers
}

/**
Fires the user observer if `onesignal_id` OR `external_id` has changed from the previous snapshot (previous hydration).
*/
static func fireUserStateChanged(newOnesignalId: String?, newExternalId: String?) {
let prevOnesignalId = OneSignalUserDefaults.initShared().getSavedString(forKey: OS_SNAPSHOT_ONESIGNAL_ID, defaultValue: nil)
let prevExternalId = OneSignalUserDefaults.initShared().getSavedString(forKey: OS_SNAPSHOT_EXTERNAL_ID, defaultValue: nil)

guard prevOnesignalId != newOnesignalId || prevExternalId != newExternalId else {
return
}

OneSignalUserDefaults.initShared().saveString(forKey: OS_SNAPSHOT_ONESIGNAL_ID, withValue: newOnesignalId)
OneSignalUserDefaults.initShared().saveString(forKey: OS_SNAPSHOT_EXTERNAL_ID, withValue: newExternalId)

let curUserState = OSUserState(onesignalId: newOnesignalId, externalId: newExternalId)
let changedState = OSUserChangedState(current: curUserState)

OneSignalUserManagerImpl.sharedInstance.userStateChangesObserver.notifyChange(changedState)
}
}
Loading