Skip to content

Commit d5540ae

Browse files
author
Rodrigo Gomez Palacio
committed
OSConsistencyKey Implementation & replacement for previous enum
Motivation: we need `setRywToken` to be extensible to future consistency use-cases. Here we are replacing the specific OSIamFetchOffsetKey enum argument type with a type-erased wrapper class we can use factor methods on to get the raw value. The reason we have to do it this way is because swift enums cannot conform to class-bound protocols or generics.
1 parent ed9343e commit d5540ae

File tree

7 files changed

+61
-12
lines changed

7 files changed

+61
-12
lines changed

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,9 @@
236236
5B053FBC2CAE07EB002F30C4 /* OneSignalOSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C115161289A259500565C41 /* OneSignalOSCore.framework */; };
237237
5B053FC32CAE0843002F30C4 /* OSConsistencyManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC1DE672C90C23E00CA8807 /* OSConsistencyManagerTests.swift */; };
238238
5B58E4F8237CE7B4009401E0 /* UIDeviceOverrider.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B58E4F6237CE7B4009401E0 /* UIDeviceOverrider.m */; };
239+
5B58F09B2CC0419100298493 /* OSConsistencyKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B58F09A2CC0419100298493 /* OSConsistencyKey.swift */; };
239240
5BC1DE5C2C90B7E600CA8807 /* OSConsistencyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC1DE5B2C90B7E600CA8807 /* OSConsistencyManager.swift */; };
240241
5BC1DE5E2C90B80E00CA8807 /* OSCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC1DE5D2C90B80E00CA8807 /* OSCondition.swift */; };
241-
5BC1DE602C90B83900CA8807 /* OSConsistencyKeyEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC1DE5F2C90B83900CA8807 /* OSConsistencyKeyEnum.swift */; };
242242
5BC1DE622C90B85A00CA8807 /* OSIamFetchOffsetKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC1DE612C90B85A00CA8807 /* OSIamFetchOffsetKey.swift */; };
243243
5BC1DE642C90BB9000CA8807 /* OSIamFetchReadyCondition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC1DE632C90BB9000CA8807 /* OSIamFetchReadyCondition.swift */; };
244244
7A123295235DFE3B002B6CE3 /* OutcomeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A123294235DFE3B002B6CE3 /* OutcomeTests.m */; };
@@ -1382,9 +1382,9 @@
13821382
5B053FB82CAE07EB002F30C4 /* OneSignalOSCoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OneSignalOSCoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
13831383
5B58E4F3237CE7B3009401E0 /* UIDeviceOverrider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIDeviceOverrider.h; sourceTree = "<group>"; };
13841384
5B58E4F6237CE7B4009401E0 /* UIDeviceOverrider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIDeviceOverrider.m; sourceTree = "<group>"; };
1385+
5B58F09A2CC0419100298493 /* OSConsistencyKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSConsistencyKey.swift; sourceTree = "<group>"; };
13851386
5BC1DE5B2C90B7E600CA8807 /* OSConsistencyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSConsistencyManager.swift; sourceTree = "<group>"; };
13861387
5BC1DE5D2C90B80E00CA8807 /* OSCondition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSCondition.swift; sourceTree = "<group>"; };
1387-
5BC1DE5F2C90B83900CA8807 /* OSConsistencyKeyEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSConsistencyKeyEnum.swift; sourceTree = "<group>"; };
13881388
5BC1DE612C90B85A00CA8807 /* OSIamFetchOffsetKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSIamFetchOffsetKey.swift; sourceTree = "<group>"; };
13891389
5BC1DE632C90BB9000CA8807 /* OSIamFetchReadyCondition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSIamFetchReadyCondition.swift; sourceTree = "<group>"; };
13901390
5BC1DE672C90C23E00CA8807 /* OSConsistencyManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSConsistencyManagerTests.swift; sourceTree = "<group>"; };
@@ -2357,7 +2357,7 @@
23572357
5BC1DE662C90BCD100CA8807 /* IamFetch */,
23582358
5BC1DE5B2C90B7E600CA8807 /* OSConsistencyManager.swift */,
23592359
5BC1DE5D2C90B80E00CA8807 /* OSCondition.swift */,
2360-
5BC1DE5F2C90B83900CA8807 /* OSConsistencyKeyEnum.swift */,
2360+
5B58F09A2CC0419100298493 /* OSConsistencyKey.swift */,
23612361
);
23622362
path = Consistency;
23632363
sourceTree = "<group>";
@@ -4148,12 +4148,12 @@
41484148
buildActionMask = 2147483647;
41494149
files = (
41504150
DEFB3E652BB7346D00E65DAD /* OSLiveActivities.swift in Sources */,
4151-
5BC1DE602C90B83900CA8807 /* OSConsistencyKeyEnum.swift in Sources */,
41524151
3C4F9E4428A4466C009F453A /* OSOperationRepo.swift in Sources */,
41534152
3C11518B289ADEEB00565C41 /* OSEventProducer.swift in Sources */,
41544153
3C115165289A259500565C41 /* OneSignalOSCore.docc in Sources */,
41554154
5BC1DE5E2C90B80E00CA8807 /* OSCondition.swift in Sources */,
41564155
5BC1DE5C2C90B7E600CA8807 /* OSConsistencyManager.swift in Sources */,
4156+
5B58F09B2CC0419100298493 /* OSConsistencyKey.swift in Sources */,
41574157
3C115189289ADEA300565C41 /* OSModelStore.swift in Sources */,
41584158
3C115185289ADE4F00565C41 /* OSModel.swift in Sources */,
41594159
3CF1A5632C669EA40056B3AA /* OSNewRecordsState.swift in Sources */,

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/Consistency/IamFetch/OSIamFetchOffsetKey.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
import Foundation
2929

30-
@objc public enum OSIamFetchOffsetKey: Int, OSConsistencyKeyEnum, Hashable {
30+
@objc public enum OSIamFetchOffsetKey: Int {
3131
case user = 0
3232
case subscription = 1
3333
}

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/Consistency/OSConsistencyKeyEnum.swift renamed to iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/Consistency/OSConsistencyKey.swift

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,38 @@
2727

2828
import Foundation
2929

30-
public protocol OSConsistencyKeyEnum: Hashable {
30+
/**
31+
A type-erased wrapper for enums to be compatible with Obj-C
32+
33+
It allows the seamless use of swift enums with `Int` raw values since swift enums cannot conform to class-bound protocols.
34+
They cannot be used with generic @objc initializers either.
35+
36+
This wrapper stores the `rawValue` of **any** enum & exposes factory methods for each supported enum.
37+
38+
Instructions: As needed we can add new enums for new consistency use-cases by providing additional factory methods that initialize
39+
the wrapper with the enum's `rawValue`.
40+
*/
41+
@objc public class OSConsistencyKey: NSObject {
42+
private let value: Int
43+
44+
// Private initializer to store the raw value.
45+
private init(value: Int) {
46+
self.value = value
47+
}
48+
49+
// Expose the rawValue to Objective-C.
50+
@objc public func rawValue() -> Int {
51+
return value
52+
}
53+
54+
/* F A C T O R Y M E T H O D S */
55+
56+
// Example:
57+
// @objc public static func fromSomeNewKey(_ key: OSSomeNewKey) -> OSConsistencyKey {
58+
// return OSConsistencyKey(value: key.rawValue)
59+
// }
60+
61+
@objc public static func fromIamFetchOffsetKey(_ key: OSIamFetchOffsetKey) -> OSConsistencyKey {
62+
return OSConsistencyKey(value: key.rawValue)
63+
}
3164
}

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/Consistency/OSConsistencyManager.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ import OneSignalCore
4040
private override init() {}
4141

4242
// Function to set the token in a thread-safe manner
43-
@objc public func setRywToken(id: String, key: OSIamFetchOffsetKey, value: String?) {
43+
@objc public func setRywToken(id: String, key: OSConsistencyKey, value: String?) {
4444
queue.sync {
45-
let nsKey = NSNumber(value: key.rawValue)
45+
let nsKey = NSNumber(value: key.rawValue())
4646
if self.indexedTokens[id] == nil {
4747
self.indexedTokens[id] = [:]
4848
}

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSPropertyOperationExecutor.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,11 @@ class OSPropertyOperationExecutor: OSOperationExecutor {
258258
if let onesignalId = request.identityModel.onesignalId {
259259
if let rywToken = response?["ryw_token"] as? String
260260
{
261-
OSConsistencyManager.shared.setRywToken(id: onesignalId, key: OSIamFetchOffsetKey.user, value: rywToken)
261+
OSConsistencyManager.shared.setRywToken(
262+
id: onesignalId,
263+
key: OSConsistencyKey.fromIamFetchOffsetKey(OSIamFetchOffsetKey.user),
264+
value: rywToken
265+
)
262266
} else {
263267
// handle a potential regression where ryw_token is no longer returned by API
264268
OSConsistencyManager.shared.resolveConditionsWithID(id: OSIamFetchReadyCondition.CONDITIONID)

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSSubscriptionOperationExecutor.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,11 @@ class OSSubscriptionOperationExecutor: OSOperationExecutor {
301301
if let onesignalId = request.identityModel.onesignalId {
302302
if let rywToken = response["ryw_token"] as? String
303303
{
304-
OSConsistencyManager.shared.setRywToken(id: onesignalId, key: OSIamFetchOffsetKey.subscription, value: rywToken)
304+
OSConsistencyManager.shared.setRywToken(
305+
id: onesignalId,
306+
key: OSConsistencyKey.fromIamFetchOffsetKey(OSIamFetchOffsetKey.subscription),
307+
value: rywToken
308+
)
305309
} else {
306310
// handle a potential regression where ryw_token is no longer returned by API
307311
OSConsistencyManager.shared.resolveConditionsWithID(id: OSIamFetchReadyCondition.CONDITIONID)
@@ -418,7 +422,11 @@ class OSSubscriptionOperationExecutor: OSOperationExecutor {
418422
if let onesignalId = OneSignalUserManagerImpl.sharedInstance.onesignalId {
419423
if let rywToken = response?["ryw_token"] as? String
420424
{
421-
OSConsistencyManager.shared.setRywToken(id: onesignalId, key: OSIamFetchOffsetKey.subscription, value: rywToken)
425+
OSConsistencyManager.shared.setRywToken(
426+
id: onesignalId,
427+
key: OSConsistencyKey.fromIamFetchOffsetKey(OSIamFetchOffsetKey.subscription),
428+
value: rywToken
429+
)
422430
} else {
423431
// handle a potential regression where ryw_token is no longer returned by API
424432
OSConsistencyManager.shared.resolveConditionsWithID(id: OSIamFetchReadyCondition.CONDITIONID)

iOS_SDK/OneSignalSDK/OneSignalUser/Source/Executors/OSUserExecutor.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,11 @@ extension OSUserExecutor {
262262
if let onesignalId = request.identityModel.onesignalId {
263263
if let rywToken = response["ryw_token"] as? String
264264
{
265-
OSConsistencyManager.shared.setRywToken(id: onesignalId, key: OSIamFetchOffsetKey.user, value: rywToken)
265+
OSConsistencyManager.shared.setRywToken(
266+
id: onesignalId,
267+
key: OSConsistencyKey.fromIamFetchOffsetKey(OSIamFetchOffsetKey.user),
268+
value: rywToken
269+
)
266270
} else {
267271
// handle a potential regression where ryw_token is no longer returned by API
268272
OSConsistencyManager.shared.resolveConditionsWithID(id: OSIamFetchReadyCondition.CONDITIONID)

0 commit comments

Comments
 (0)