Skip to content

Commit a943e4e

Browse files
nan-lichunhuidu-dev
andcommitted
fix: [SDK-4899] lock OSSubscriptionModel state to stop encode crashes
OSSubscriptionModel is archived on background queues (operation repo delta queue, executor pending-request caches, model store persistence) while other threads mutate its String-typed properties (APNs token, permission changes, server hydration). The unsynchronized reads crashed in production with EXC_BAD_ACCESS in objc_retain during encode(with:) (GitHub #1588). Move the stored properties into a value-type State guarded by a single NSLock held only for raw reads/writes - never while firing change events, notifying observers, or writing UserDefaults - so the re-entrant archive path and callouts into app code cannot deadlock. encode(with:), jsonRepresentation(), and currentPushSubscriptionState now read one consistent snapshot. All existing setter side-effect logic is preserved, including notificationTypes pinning to -2 while disabled without firing a change event. Co-Authored-By: chunhuidu-dev <270835659+chunhuidu-dev@users.noreply.github.com>
1 parent 5be86ab commit a943e4e

3 files changed

Lines changed: 357 additions & 94 deletions

File tree

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@
164164
3CA8B8822BEC2FCB0010ADA1 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C7A39D42B7C18EE0082665E /* XCTest.framework */; };
165165
3CA8B8832BEC2FCB0010ADA1 /* XCTest.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3C7A39D42B7C18EE0082665E /* XCTest.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
166166
3CA93BC4300AEFFA000724B3 /* SubscriptionUpdateRaceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA93BC3300AEFFA000724B3 /* SubscriptionUpdateRaceTests.swift */; };
167+
3CA93BC7300B0100000724B3 /* SubscriptionModelConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CA93BC6300B0100000724B3 /* SubscriptionModelConcurrencyTests.swift */; };
167168
3CAA4BB72F0BAFBA00A16682 /* TriggerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CAA4BB62F0BAFBA00A16682 /* TriggerTests.swift */; };
168169
3CB331682F281679000E1801 /* CustomEventsIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CB331672F281679000E1801 /* CustomEventsIntegrationTests.swift */; };
169170
3CB3316A2F281692000E1801 /* OSCustomEventsExecutorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CB331692F281692000E1801 /* OSCustomEventsExecutorTests.swift */; };
@@ -1405,6 +1406,7 @@
14051406
3C9AD6D22B228BB000BC1540 /* OSRequestUpdateProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSRequestUpdateProperties.swift; sourceTree = "<group>"; };
14061407
3CA6CE0928E4F19B00CA0585 /* OSUserRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSUserRequest.swift; sourceTree = "<group>"; };
14071408
3CA93BC3300AEFFA000724B3 /* SubscriptionUpdateRaceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionUpdateRaceTests.swift; sourceTree = "<group>"; };
1409+
3CA93BC6300B0100000724B3 /* SubscriptionModelConcurrencyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionModelConcurrencyTests.swift; sourceTree = "<group>"; };
14081410
3CAA4BB62F0BAFBA00A16682 /* TriggerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TriggerTests.swift; sourceTree = "<group>"; };
14091411
3CB331672F281679000E1801 /* CustomEventsIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEventsIntegrationTests.swift; sourceTree = "<group>"; };
14101412
3CB331692F281692000E1801 /* OSCustomEventsExecutorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSCustomEventsExecutorTests.swift; sourceTree = "<group>"; };
@@ -2361,6 +2363,7 @@
23612363
3CDE664A2BFC2A55006DA114 /* OneSignalUserTests-Bridging-Header.h */,
23622364
3CF11E3E2C6D61AC002856F5 /* Executors */,
23632365
3CC063ED2B6D7FE8002BB07F /* OneSignalUserTests.swift */,
2366+
3CA93BC6300B0100000724B3 /* SubscriptionModelConcurrencyTests.swift */,
23642367
3CC890342C5BF9A7002CB4CC /* UserConcurrencyTests.swift */,
23652368
3CB331672F281679000E1801 /* CustomEventsIntegrationTests.swift */,
23662369
3C67F7792BEB2B710085A0F0 /* SwitchUserIntegrationTests.swift */,
@@ -4472,6 +4475,7 @@
44724475
3CF11E3D2C6D6155002856F5 /* UserExecutorTests.swift in Sources */,
44734476
3C67F77A2BEB2B710085A0F0 /* SwitchUserIntegrationTests.swift in Sources */,
44744477
3CC063EE2B6D7FE8002BB07F /* OneSignalUserTests.swift in Sources */,
4478+
3CA93BC7300B0100000724B3 /* SubscriptionModelConcurrencyTests.swift in Sources */,
44754479
3CC890352C5BF9A7002CB4CC /* UserConcurrencyTests.swift in Sources */,
44764480
3CB3316A2F281692000E1801 /* OSCustomEventsExecutorTests.swift in Sources */,
44774481
3CA93BC4300AEFFA000724B3 /* SubscriptionUpdateRaceTests.swift in Sources */,

0 commit comments

Comments
 (0)