Skip to content

Commit f8537fc

Browse files
committed
save and use lastpushpayload from memory
1 parent 47e9faa commit f8537fc

File tree

6 files changed

+41
-144
lines changed

6 files changed

+41
-144
lines changed

swift-sdk/Constants.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ enum Const {
4242
}
4343

4444
public enum UserDefault {
45-
static let payloadKey = "itbl_payload_key"
4645
static let attributionInfoKey = "itbl_attribution_info_key"
4746
static let emailKey = "itbl_email"
4847
static let userIdKey = "itbl_userid"
@@ -63,7 +62,6 @@ enum Const {
6362
static let email = "itbl_email"
6463
static let userId = "itbl_userid"
6564
static let authToken = "itbl_auth_token"
66-
static let lastPushPayloadAndExpiration = "itbl_last_push_payload_and_expiration"
6765
}
6866
}
6967

swift-sdk/Internal/InternalIterableAPI.swift

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ import UIKit
77

88
final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
99
var apiKey: String
10-
10+
var lastPushPayload: [AnyHashable: Any]? {
11+
get {
12+
_payloadData
13+
} set {
14+
setPayloadData(newValue)
15+
}
16+
}
1117
var email: String? {
1218
get {
1319
_email
@@ -24,6 +30,12 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
2430
}
2531
}
2632

33+
var authToken: String? {
34+
get {
35+
authManager.getAuthToken()
36+
}
37+
}
38+
2739
var deviceId: String {
2840
if let value = localStorage.deviceId {
2941
return value
@@ -40,10 +52,6 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
4052
appPackageName: Bundle.main.appPackageName ?? "")
4153
}
4254

43-
var lastPushPayload: [AnyHashable: Any]? {
44-
localStorage.getLastPushPayload(dateProvider.currentDate)
45-
}
46-
4755
var attributionInfo: IterableAttributionInfo? {
4856
get {
4957
localStorage.getAttributionInfo(currentDate: dateProvider.currentDate)
@@ -95,9 +103,19 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
95103
deviceAttributes.removeValue(forKey: name)
96104
}
97105

106+
func setPayloadData(_ data: [AnyHashable: Any]?){
107+
ITBInfo()
108+
_payloadData = data
109+
}
110+
98111
func setEmail(_ email: String?, authToken: String? = nil) {
99112
ITBInfo()
100113

114+
if _email == email && email != nil && authToken != nil {
115+
checkAndUpdateAuthToken(authToken)
116+
return
117+
}
118+
101119
if _email == email {
102120
return
103121
}
@@ -115,6 +133,11 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
115133
func setUserId(_ userId: String?, authToken: String? = nil) {
116134
ITBInfo()
117135

136+
if _userId == userId && userId != nil && authToken != nil {
137+
checkAndUpdateAuthToken(authToken)
138+
return
139+
}
140+
118141
if _userId == userId {
119142
return
120143
}
@@ -400,6 +423,7 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
400423
private var deepLinkManager: DeepLinkManager
401424

402425
private var _email: String?
426+
private var _payloadData: [AnyHashable: Any]?
403427
private var _userId: String?
404428

405429
/// the hex representation of this device token
@@ -492,6 +516,8 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
492516
}
493517

494518
private func requestNewAuthToken() {
519+
ITBInfo()
520+
495521
authManager.requestNewAuthToken(hasFailedPriorAuth: false, onSuccess: { [weak self] token in
496522
if token != nil {
497523
self?.completeUserLogin()
@@ -519,15 +545,20 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
519545
}
520546

521547
private func save(pushPayload payload: [AnyHashable: Any]) {
522-
let expiration = Calendar.current.date(byAdding: .hour,
523-
value: Const.UserDefault.payloadExpiration,
524-
to: dateProvider.currentDate)
525-
localStorage.saveLastPushPayload(payload, withExpiration: expiration)
526-
527548
if let metadata = IterablePushNotificationMetadata.metadata(fromLaunchOptions: payload) {
528549
if let templateId = metadata.templateId {
529550
attributionInfo = IterableAttributionInfo(campaignId: metadata.campaignId, templateId: templateId, messageId: metadata.messageId)
530551
}
552+
553+
if !metadata.isGhostPush {
554+
lastPushPayload = payload
555+
}
556+
}
557+
}
558+
559+
private func checkAndUpdateAuthToken(_ authToken: String? = nil) {
560+
if config.authDelegate != nil && authToken != authManager.getAuthToken() {
561+
onLogin(authToken)
531562
}
532563
}
533564

@@ -587,7 +618,6 @@ final class InternalIterableAPI: NSObject, PushTrackerProtocol, AuthProvider {
587618

588619
private func handle(launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
589620
guard let launchOptions = launchOptions else {
590-
localStorage.saveLastPushPayload(nil, withExpiration: nil)
591621
return
592622
}
593623
if let remoteNotificationPayload = launchOptions[UIApplication.LaunchOptionsKey.remoteNotification] as? [AnyHashable: Any] {

swift-sdk/Internal/IterableKeychain.swift

Lines changed: 0 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -63,74 +63,10 @@ class IterableKeychain {
6363
}
6464
}
6565

66-
func getLastPushPayload(currentDate: Date) -> [AnyHashable: Any]? {
67-
guard let payloadExpirationPair = getPayloadExpirationPairFromKeychain() else {
68-
return nil
69-
}
70-
71-
if isLastPushPayloadExpired(expiration: payloadExpirationPair.expiration, currentDate: currentDate) {
72-
removePayloadExpirationPairFromKeychain()
73-
return nil
74-
}
75-
76-
return decodeJsonPayload(payloadExpirationPair.payload)
77-
}
78-
79-
func setLastPushPayload(_ payload: [AnyHashable: Any]?, withExpiration expiration: Date?) {
80-
guard let payload = payload, JSONSerialization.isValidJSONObject(payload) else {
81-
removePayloadExpirationPairFromKeychain()
82-
return
83-
}
84-
85-
savePayloadExpirationPairToKeychain(payload: payload, expiration: expiration)
86-
}
87-
8866
// MARK: - PRIVATE/INTERNAL
8967

9068
private let wrapper: KeychainWrapper
9169

92-
private func getPayloadExpirationPairFromKeychain() -> (payload: Data, expiration: Date?)? {
93-
// get the value from the keychain
94-
guard let keychainValue = wrapper.data(forKey: Const.Keychain.Key.lastPushPayloadAndExpiration) else {
95-
return nil
96-
}
97-
98-
// decode the payload/expiration pair
99-
guard let payloadExpirationPair = try? JSONDecoder().decode(LastPushPayloadValue.self, from: keychainValue) else {
100-
return nil
101-
}
102-
103-
// cast the payload as a JSON object
104-
guard let lastPushPayloadJSON = try? JSONSerialization.jsonObject(with: payloadExpirationPair.payload, options: []) as? [AnyHashable: Any] else {
105-
return nil
106-
}
107-
108-
guard let lastPushPayloadData = try? JSONSerialization.data(withJSONObject: lastPushPayloadJSON) else {
109-
return nil
110-
}
111-
112-
return (payload: lastPushPayloadData, expiration: payloadExpirationPair.expiration)
113-
}
114-
115-
private func savePayloadExpirationPairToKeychain(payload: [AnyHashable: Any]?, expiration: Date?) {
116-
guard let payload = payload else {
117-
removePayloadExpirationPairFromKeychain()
118-
return
119-
}
120-
121-
guard let payloadAsData = encodeJsonPayload(payload) else {
122-
return
123-
}
124-
125-
let payloadExpirationPair = LastPushPayloadValue(payload: payloadAsData, expiration: expiration)
126-
127-
guard let encodedPair = try? JSONEncoder().encode(payloadExpirationPair) else {
128-
return
129-
}
130-
131-
wrapper.set(encodedPair, forKey: Const.Keychain.Key.lastPushPayloadAndExpiration)
132-
}
133-
13470
private func encodeJsonPayload(_ json: [AnyHashable: Any]?) -> Data? {
13571
guard let json = json, JSONSerialization.isValidJSONObject(json) else {
13672
return nil
@@ -146,21 +82,4 @@ class IterableKeychain {
14682

14783
return try? JSONSerialization.jsonObject(with: data) as? [AnyHashable: Any]
14884
}
149-
150-
private func removePayloadExpirationPairFromKeychain() {
151-
wrapper.removeValue(forKey: Const.Keychain.Key.lastPushPayloadAndExpiration)
152-
}
153-
154-
private func isLastPushPayloadExpired(expiration: Date?, currentDate: Date) -> Bool {
155-
guard let expiration = expiration else {
156-
return false
157-
}
158-
159-
return !(expiration.timeIntervalSinceReferenceDate > currentDate.timeIntervalSinceReferenceDate)
160-
}
161-
162-
private struct LastPushPayloadValue: Codable {
163-
let payload: Data
164-
let expiration: Date?
165-
}
16685
}

swift-sdk/Internal/IterableUserDefaults.swift

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -78,33 +78,9 @@ class IterableUserDefaults {
7878
try? save(codable: attributionInfo, withKey: .attributionInfo, andExpiration: expiration)
7979
}
8080

81-
// migrated to IterableKeychain
82-
func getPayload(currentDate: Date) -> [AnyHashable: Any]? {
83-
(try? dict(withKey: .payload, currentDate: currentDate)) ?? nil
84-
}
85-
86-
// migrated to IterableKeychain
87-
func save(payload: [AnyHashable: Any]?, withExpiration expiration: Date?) {
88-
try? save(dict: payload, withKey: .payload, andExpiration: expiration)
89-
}
9081

9182
// MARK: data migration functions
9283

93-
func getLastPushPayloadExpirationPairForMigration() -> (payload: [AnyHashable: Any]?, expiration: Date?)? {
94-
guard let encodedEnvelope = userDefaults.value(forKey: UserDefaultsKey.payload.value) as? Data else {
95-
return nil
96-
}
97-
98-
do {
99-
let envelope = try JSONDecoder().decode(Envelope.self, from: encodedEnvelope)
100-
let decoded = try JSONSerialization.jsonObject(with: envelope.payload, options: []) as? [AnyHashable: Any]
101-
102-
return (payload: decoded, envelope.expiration)
103-
} catch {
104-
return nil
105-
}
106-
}
107-
10884
func getAuthDataForMigration() -> (email: String?, userId: String?, authToken: String?) {
10985
return (email: email, userId: userId, authToken: authToken)
11086
}
@@ -212,8 +188,6 @@ class IterableUserDefaults {
212188
private init(value: String) {
213189
self.value = value
214190
}
215-
216-
static let payload = UserDefaultsKey(value: Const.UserDefault.payloadKey)
217191
static let attributionInfo = UserDefaultsKey(value: Const.UserDefault.attributionInfoKey)
218192
static let email = UserDefaultsKey(value: Const.UserDefault.emailKey)
219193
static let userId = UserDefaultsKey(value: Const.UserDefault.userIdKey)

swift-sdk/Internal/LocalStorage.swift

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,11 @@ struct LocalStorage: LocalStorageProtocol {
7575
iterableUserDefaults.save(attributionInfo: attributionInfo, withExpiration: expiration)
7676
}
7777

78-
func getLastPushPayload(_ currentDate: Date) -> [AnyHashable: Any]? {
79-
return keychain.getLastPushPayload(currentDate: currentDate)
80-
}
81-
82-
func saveLastPushPayload(_ payload: [AnyHashable: Any]?, withExpiration expiration: Date?) {
83-
keychain.setLastPushPayload(payload, withExpiration: expiration)
84-
}
85-
8678
func upgrade() {
8779
ITBInfo()
8880

8981
/// moves `email`, `userId`, and `authToken` from `UserDefaults` to `IterableKeychain`
9082
moveAuthDataFromUserDefaultsToKeychain()
91-
92-
/// moves `lastPushPayload` from `UserDefaults` to `IterableKeychain`
93-
moveLastPushPayloadFromUserDefaultsToKeychain()
9483
}
9584

9685
// MARK: Private
@@ -131,13 +120,4 @@ struct LocalStorage: LocalStorageProtocol {
131120
ITBInfo("UPDATED: migrated authToken from UserDefaults to IterableKeychain")
132121
}
133122
}
134-
135-
private func moveLastPushPayloadFromUserDefaultsToKeychain() {
136-
if let (userDefaultLastPushPayload, expiration) = iterableUserDefaults.getLastPushPayloadExpirationPairForMigration() {
137-
keychain.setLastPushPayload(userDefaultLastPushPayload, withExpiration: expiration)
138-
iterableUserDefaults.save(payload: nil, withExpiration: nil)
139-
140-
ITBInfo("UPDATED: migrated lastPushPayload from UserDefaults to IterableKeychain")
141-
}
142-
}
143123
}

swift-sdk/Internal/LocalStorageProtocol.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@ protocol LocalStorageProtocol {
2323

2424
func save(attributionInfo: IterableAttributionInfo?, withExpiration expiration: Date?)
2525

26-
func getLastPushPayload(_ currentDate: Date) -> [AnyHashable: Any]?
27-
28-
func saveLastPushPayload(_ payload: [AnyHashable: Any]?, withExpiration expiration: Date?)
29-
3026
func upgrade()
3127
}
3228

0 commit comments

Comments
 (0)