Skip to content

Commit 4d7e758

Browse files
authored
Merge pull request #4075 from bbirman/fix-push-unregister-wrong-user
Fix push register/unregister not respecting user parameter for prefer…
2 parents 25f2ca7 + b141c2f commit 4d7e758

4 files changed

Lines changed: 190 additions & 99 deletions

File tree

libs/SalesforceSDKCore/SalesforceSDKCore/Classes/PushNotification/PushNotificationManager.swift

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,16 @@ public class PushNotificationManager: NSObject {
8686
}
8787

8888
public var deviceToken: String?
89-
public var deviceSalesforceId: String?
89+
90+
@available(*, deprecated,
91+
message: "Deprecated in Salesforce Mobile SDK 14.0 and will be removed in Salesforce Mobile SDK 15.0. This value is managed internally by registerSalesforceNotifications and unregisterSalesforceNotifications. No replacement is needed.")
92+
public var deviceSalesforceId: String? {
93+
get { _deviceSalesforceId }
94+
set { _deviceSalesforceId = newValue }
95+
}
96+
// Separate private variable to avoid deprecation warnings until the field is removed
97+
private var _deviceSalesforceId: String?
98+
9099
public var customPushRegistrationBody: [String: Any]?
91100

92101
/// Controls which users are re-registered for push notifications when the app returns to the foreground.
@@ -135,7 +144,7 @@ public class PushNotificationManager: NSObject {
135144
#endif
136145
let preferences = notificationRegister.preferences(for: UserAccountManager.shared.currentUserAccount)
137146
self.deviceToken = preferences?.string(forKey: PushNotificationConstants.deviceToken)
138-
self.deviceSalesforceId = preferences?.string(forKey: PushNotificationConstants.deviceSalesforceId)
147+
self._deviceSalesforceId = preferences?.string(forKey: PushNotificationConstants.deviceSalesforceId)
139148

140149
setupNotificationObservers()
141150
}
@@ -282,10 +291,11 @@ public class PushNotificationManager: NSObject {
282291
}
283292

284293
SFSDKCoreLogger.i(Self.self, message: "Registration succeeded")
285-
self.deviceSalesforceId = json["id"] as? String
294+
// TODO: Remove in Mobile SDK 15.0 and set value in preferences directly
295+
self._deviceSalesforceId = json["id"] as? String
286296

287-
let prefs = SFPreferences.currentUserLevel()
288-
prefs?.setObject(self.deviceSalesforceId ?? "", forKey: PushNotificationConstants.deviceSalesforceId)
297+
let prefs = notificationRegister.preferences(for: user)
298+
prefs?.setObject(self._deviceSalesforceId ?? "", forKey: PushNotificationConstants.deviceSalesforceId)
289299
prefs?.synchronize()
290300

291301
SFSDKCoreLogger.i(Self.self, message: "Response: \(json)")
@@ -333,24 +343,20 @@ public class PushNotificationManager: NSObject {
333343
@objc(unregisterSalesforceNotificationsWithCompletionBlock:completionBlock:)
334344
public func unregisterSalesforceNotifications(for user: UserAccount,
335345
completionBlock: (() -> Void)?) -> Bool {
336-
guard deviceSalesforceId != nil else {
337-
completionBlock?()
338-
return true
339-
}
340-
341346
if isSimulator {
342347
completionBlock?()
343348
return true
344349
}
345-
let preferences = notificationRegister.preferences(for: UserAccountManager.shared.currentUserAccount)
346-
guard let prefs = preferences else {
350+
let preferences = notificationRegister.preferences(for: user)
351+
guard let preferences else {
347352
SFSDKCoreLogger.e(Self.self, message: "Cannot unregister from notifications with Salesforce: no user prefs")
348353
return false
349354
}
350-
351-
guard let sfId = prefs.string(forKey: PushNotificationConstants.deviceSalesforceId) else {
352-
SFSDKCoreLogger.e(Self.self, message: "Cannot unregister from notifications with Salesforce: no deviceSalesforceId")
353-
return false
355+
356+
guard let sfId = preferences.string(forKey: PushNotificationConstants.deviceSalesforceId) else {
357+
// User has no registered device — nothing to unregister
358+
completionBlock?()
359+
return true
354360
}
355361

356362
guard let restClient = notificationRegister.client(for: user) else {

libs/SalesforceSDKCore/SalesforceSDKCore/Classes/PushNotification/RemoteNotificationRegistering.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ final class DefaultRemoteNotificationRegistrar: RemoteNotificationRegistering {
4848
}
4949

5050
public func client(for user: UserAccount?) -> RestClient? {
51-
guard let account = user else {
51+
guard let user else {
5252
return RestClient.shared
5353
}
54-
return RestClient.restClient(for: account)
54+
return RestClient.restClient(for: user)
5555
}
5656

5757
func preferences(for user: UserAccount?) -> SFPreferences? {
58-
guard let account = user else {
58+
guard let user else {
5959
return SFPreferences.currentUserLevel()
6060
}
61-
return SFPreferences.sharedPreferences(for: .user, user: account)
61+
return SFPreferences.sharedPreferences(for: .user, user: user)
6262
}
6363
}

0 commit comments

Comments
 (0)