Build Information
Successful build of Revnix, reference v1.11.0 (095c4f), with Swift 6.1 for macOS (SPM) on 30 Oct 2026 12:52:33 UTC.
Swift 6 data race errors: 3
Build Command
env DEVELOPER_DIR=/Applications/Xcode-16.3.0.app xcrun swift build --arch arm64 -Xswiftc -Xfrontend -Xswiftc -stats-output-dir -Xswiftc -Xfrontend -Xswiftc .stats -Xswiftc -strict-concurrency=complete -Xswiftc -enable-upcoming-feature -Xswiftc StrictConcurrency -Xswiftc -enable-upcoming-feature -Xswiftc DisableOutwardActorInference -Xswiftc -enable-upcoming-feature -Xswiftc GlobalActorIsolatedTypesUsability -Xswiftc -enable-upcoming-feature -Xswiftc InferSendableFromCapturesBuild Log
========================================
RunAll
========================================
Builder version: 5.1.4
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/Oth-tech/RevnixSDK-iOS.git
Reference: v1.11.0
Initialized empty Git repository in /Users/admin/builder/spi-builder-workspace/.git/
From https://github.com/Oth-tech/RevnixSDK-iOS
* tag v1.11.0 -> FETCH_HEAD
HEAD is now at 095c4f1 Merge pull request #70 from Oth-tech/release/v1.11.0
Cloned https://github.com/Oth-tech/RevnixSDK-iOS.git
Revision (git rev-parse @):
095c4f1e0427cc482d7b791dcb919723cac1a0eb
SPI manifest file found: $PWD/.spi.yml
SUCCESS checkout https://github.com/Oth-tech/RevnixSDK-iOS.git at v1.11.0
========================================
Build
========================================
Selected platform: macosSpm
Swift version: 6.1
Building package at path: $PWD
https://github.com/Oth-tech/RevnixSDK-iOS.git
https://github.com/Oth-tech/RevnixSDK-iOS.git
{
"dependencies" : [
],
"manifest_display_name" : "Revnix",
"name" : "Revnix",
"path" : "/Users/admin/builder/spi-builder-workspace",
"platforms" : [
{
"name" : "ios",
"version" : "16.0"
},
{
"name" : "macos",
"version" : "13.0"
},
{
"name" : "tvos",
"version" : "16.0"
},
{
"name" : "watchos",
"version" : "9.0"
}
],
"products" : [
{
"name" : "Revnix",
"targets" : [
"Revnix"
],
"type" : {
"library" : [
"automatic"
]
}
}
],
"targets" : [
{
"c99name" : "RevnixTests",
"module_type" : "SwiftTarget",
"name" : "RevnixTests",
"path" : "Tests/RevnixTests",
"resources" : [
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/Revnix.storekit",
"rule" : {
"copy" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/paywall-background-wire.json",
"rule" : {
"copy" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/paywall-selection-wire.json",
"rule" : {
"copy" : {
}
}
}
],
"sources" : [
"AttributionTests.swift",
"DeepLinkPrivacyTests.swift",
"ImplicitPlacementTests.swift",
"PaywallBackgroundTests.swift",
"PaywallBlockFillTests.swift",
"PaywallBlockGeometryTests.swift",
"PaywallBlockTests.swift",
"PaywallLocalizationTests.swift",
"PaywallSelectionWireTests.swift",
"PreviewTests.swift",
"PrivacyManifestTests.swift",
"RevnixClientTests.swift",
"SkanTests.swift",
"StoreKitIntegrationTests.swift",
"TrackingTests.swift"
],
"target_dependencies" : [
"Revnix"
],
"type" : "test"
},
{
"c99name" : "Revnix",
"module_type" : "SwiftTarget",
"name" : "Revnix",
"path" : "Sources/Revnix",
"product_memberships" : [
"Revnix"
],
"resources" : [
{
"path" : "/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PrivacyInfo.xcprivacy",
"rule" : {
"copy" : {
}
}
}
],
"sources" : [
"DeviceFacts.swift",
"ImplicitPlacements.swift",
"Models.swift",
"PaywallBackground.swift",
"PaywallBlockGeometry.swift",
"PaywallBlocks.swift",
"PaywallLocalization.swift",
"PaywallRenderRules.swift",
"RevnixClient.swift",
"RevnixConfig.swift",
"RevnixError.swift",
"RevnixPaywallBlockView.swift",
"RevnixPaywallView.swift",
"Skan.swift",
"Storage.swift",
"StoreKitGlue.swift",
"Tracking.swift"
],
"type" : "library"
}
],
"tools_version" : "5.9"
}
Running build ...
env DEVELOPER_DIR=/Applications/Xcode-16.3.0.app xcrun swift build --arch arm64 -Xswiftc -Xfrontend -Xswiftc -stats-output-dir -Xswiftc -Xfrontend -Xswiftc .stats -Xswiftc -strict-concurrency=complete -Xswiftc -enable-upcoming-feature -Xswiftc StrictConcurrency -Xswiftc -enable-upcoming-feature -Xswiftc DisableOutwardActorInference -Xswiftc -enable-upcoming-feature -Xswiftc GlobalActorIsolatedTypesUsability -Xswiftc -enable-upcoming-feature -Xswiftc InferSendableFromCaptures
Building for debugging...
[0/3] Write sources
[1/3] Copying PrivacyInfo.xcprivacy
[2/3] Write swift-version-2F0A5646E1D333AE.txt
[4/21] Compiling Revnix Tracking.swift
[5/22] Compiling Revnix resource_bundle_accessor.swift
[6/22] Compiling Revnix Storage.swift
[7/22] Compiling Revnix StoreKitGlue.swift
[8/22] Compiling Revnix RevnixError.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:1309:54: warning: main actor-isolated property 'assetTrack' can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
1307 | audioSilencers = looper.loopingPlayerItems.map { item in
1308 | item.observe(\.tracks, options: [.initial]) { item, _ in
1309 | for track in item.tracks where track.assetTrack?.mediaType == .audio { track.isEnabled = false }
| `- warning: main actor-isolated property 'assetTrack' can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
1310 | }
1311 | }
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVPlayerItemTrack.h:45:57: note: property declared here
43 | notification queue. By default, this queue is the main queue.
44 | */
45 | @property (nonatomic, readonly, nullable) AVAssetTrack *assetTrack;
| `- note: property declared here
46 |
47 | /*!
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:1314:56: warning: non-sendable result type 'AVMediaSelectionGroup?' cannot be sent from nonisolated context in call to instance method 'loadMediaSelectionGroup(for:)'; this is an error in the Swift 6 language mode
1312 | for item in looper.loopingPlayerItems {
1313 | Task {
1314 | if let audible = try? await item.asset.loadMediaSelectionGroup(for: .audible) {
| `- warning: non-sendable result type 'AVMediaSelectionGroup?' cannot be sent from nonisolated context in call to instance method 'loadMediaSelectionGroup(for:)'; this is an error in the Swift 6 language mode
1315 | item.select(nil, in: audible)
1316 | }
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVMediaSelectionGroup.h:28:12: note: class 'AVMediaSelectionGroup' does not conform to the 'Sendable' protocol
26 |
27 | API_AVAILABLE(macos(10.8), ios(5.0), tvos(9.0), watchos(1.0), visionos(1.0))
28 | @interface AVMediaSelectionGroup : NSObject <NSCopying> {
| `- note: class 'AVMediaSelectionGroup' does not conform to the 'Sendable' protocol
29 | @private
30 | AVMediaSelectionGroupInternal *_mediaSelectionGroup;
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:26:1: warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'AVFoundation'
24 | import SwiftUI
25 | #if os(macOS)
26 | import AVFoundation
| `- warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'AVFoundation'
27 | typealias RevnixNativeView = NSView
28 | #elseif !os(watchOS)
[9/22] Compiling Revnix RevnixPaywallBlockView.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:1309:54: warning: main actor-isolated property 'assetTrack' can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
1307 | audioSilencers = looper.loopingPlayerItems.map { item in
1308 | item.observe(\.tracks, options: [.initial]) { item, _ in
1309 | for track in item.tracks where track.assetTrack?.mediaType == .audio { track.isEnabled = false }
| `- warning: main actor-isolated property 'assetTrack' can not be referenced from a Sendable closure; this is an error in the Swift 6 language mode
1310 | }
1311 | }
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVPlayerItemTrack.h:45:57: note: property declared here
43 | notification queue. By default, this queue is the main queue.
44 | */
45 | @property (nonatomic, readonly, nullable) AVAssetTrack *assetTrack;
| `- note: property declared here
46 |
47 | /*!
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:1314:56: warning: non-sendable result type 'AVMediaSelectionGroup?' cannot be sent from nonisolated context in call to instance method 'loadMediaSelectionGroup(for:)'; this is an error in the Swift 6 language mode
1312 | for item in looper.loopingPlayerItems {
1313 | Task {
1314 | if let audible = try? await item.asset.loadMediaSelectionGroup(for: .audible) {
| `- warning: non-sendable result type 'AVMediaSelectionGroup?' cannot be sent from nonisolated context in call to instance method 'loadMediaSelectionGroup(for:)'; this is an error in the Swift 6 language mode
1315 | item.select(nil, in: audible)
1316 | }
/Applications/Xcode-16.3.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVMediaSelectionGroup.h:28:12: note: class 'AVMediaSelectionGroup' does not conform to the 'Sendable' protocol
26 |
27 | API_AVAILABLE(macos(10.8), ios(5.0), tvos(9.0), watchos(1.0), visionos(1.0))
28 | @interface AVMediaSelectionGroup : NSObject <NSCopying> {
| `- note: class 'AVMediaSelectionGroup' does not conform to the 'Sendable' protocol
29 | @private
30 | AVMediaSelectionGroupInternal *_mediaSelectionGroup;
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallBlockView.swift:26:1: warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'AVFoundation'
24 | import SwiftUI
25 | #if os(macOS)
26 | import AVFoundation
| `- warning: add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'AVFoundation'
27 | typealias RevnixNativeView = NSView
28 | #elseif !os(watchOS)
[10/22] Compiling Revnix PaywallLocalization.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallLocalization.swift:106:13: warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
104 |
105 | private let revnixLocaleOverrideLock = NSLock()
106 | private var revnixLocaleOverride: String?
| |- warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
| |- note: convert 'revnixLocaleOverride' to a 'let' constant to make 'Sendable' shared state immutable
| |- note: add '@MainActor' to make var 'revnixLocaleOverride' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
107 |
108 | func revnixSetLocaleOverride(_ tag: String?) {
[11/22] Compiling Revnix PaywallRenderRules.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallLocalization.swift:106:13: warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
104 |
105 | private let revnixLocaleOverrideLock = NSLock()
106 | private var revnixLocaleOverride: String?
| |- warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
| |- note: convert 'revnixLocaleOverride' to a 'let' constant to make 'Sendable' shared state immutable
| |- note: add '@MainActor' to make var 'revnixLocaleOverride' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
107 |
108 | func revnixSetLocaleOverride(_ tag: String?) {
[12/22] Compiling Revnix RevnixClient.swift
[13/22] Compiling Revnix RevnixConfig.swift
[14/22] Compiling Revnix Models.swift
[15/22] Compiling Revnix PaywallBackground.swift
[16/22] Compiling Revnix PaywallBlockGeometry.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:347:71: warning: conditional downcast from 'String?' to 'String' does nothing
345 | let c = try decoder.container(keyedBy: CodingKeys.self)
346 | icon = try? c.decodeIfPresent(String.self, forKey: .icon)
347 | title = (try? c.decodeIfPresent(String.self, forKey: .title)) as? String ?? ""
| `- warning: conditional downcast from 'String?' to 'String' does nothing
348 | description = try? c.decodeIfPresent(String.self, forKey: .description)
349 | }
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:544:69: warning: conditional downcast from 'String?' to 'String' does nothing
542 | return
543 | }
544 | let id = (try? c.decodeIfPresent(String.self, forKey: .id)) as? String ?? ""
| `- warning: conditional downcast from 'String?' to 'String' does nothing
545 | let style = try? c.decodeIfPresent(BlockStyle.self, forKey: .style)
546 | func string(_ key: Keys) -> String? { (try? c.decodeIfPresent(String.self, forKey: key)) ?? nil }
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:573:83: warning: conditional downcast from '[ListItem]?' to '[ListItem]' does nothing
571 | ))
572 | case "list":
573 | let items = (try? c.decodeIfPresent([ListItem].self, forKey: .items)) as? [ListItem] ?? []
| `- warning: conditional downcast from '[ListItem]?' to '[ListItem]' does nothing
574 | self = .list(ListBlock(
575 | id: id, items: items, iconColor: string(.iconColor), style: style,
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:606:93: warning: conditional downcast from '[PaywallBlock]?' to '[PaywallBlock]' does nothing
604 | ))
605 | case "card":
606 | let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
| `- warning: conditional downcast from '[PaywallBlock]?' to '[PaywallBlock]' does nothing
607 | let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
608 | let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:607:80: warning: conditional downcast from 'Int?' to 'Int' does nothing
605 | case "card":
606 | let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
607 | let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
| `- warning: conditional downcast from 'Int?' to 'Int' does nothing
608 | let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
609 | self = .card(CardBlock(
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:608:83: warning: conditional downcast from 'Int?' to 'Int' does nothing
606 | let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
607 | let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
608 | let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
| `- warning: conditional downcast from 'Int?' to 'Int' does nothing
609 | self = .card(CardBlock(
610 | id: id, layout: string(.layout), autoAdvance: int(.autoAdvance), repeatMode: string(.repeat),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:817:73: warning: conditional downcast from 'Int?' to 'Int' does nothing
815 | }
816 | self.screens = screens
817 | version = ((try? c.decodeIfPresent(Int.self, forKey: .version)) as? Int) ?? 1
| `- warning: conditional downcast from 'Int?' to 'Int' does nothing
818 | layout = try? c.decodeIfPresent(String.self, forKey: .layout)
819 | // `background` is a plain string in the original form and an object in
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:826:80: warning: conditional downcast from 'String?' to 'String' does nothing
824 | backgroundSpec = spec
825 | background = revnixBackgroundGround(spec) ?? "#000000"
826 | textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
| `- warning: conditional downcast from 'String?' to 'String' does nothing
827 | accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
828 | accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:827:74: warning: conditional downcast from 'String?' to 'String' does nothing
825 | background = revnixBackgroundGround(spec) ?? "#000000"
826 | textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
827 | accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
| `- warning: conditional downcast from 'String?' to 'String' does nothing
828 | accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
829 | fontFamily = try? c.decodeIfPresent(String.self, forKey: .fontFamily)
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:828:80: warning: conditional downcast from 'String?' to 'String' does nothing
826 | textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
827 | accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
828 | accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
| `- warning: conditional downcast from 'String?' to 'String' does nothing
829 | fontFamily = try? c.decodeIfPresent(String.self, forKey: .fontFamily)
830 | // REV-271: a malformed table costs the translations, never the
[17/22] Compiling Revnix PaywallBlocks.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:347:71: warning: conditional downcast from 'String?' to 'String' does nothing
345 | let c = try decoder.container(keyedBy: CodingKeys.self)
346 | icon = try? c.decodeIfPresent(String.self, forKey: .icon)
347 | title = (try? c.decodeIfPresent(String.self, forKey: .title)) as? String ?? ""
| `- warning: conditional downcast from 'String?' to 'String' does nothing
348 | description = try? c.decodeIfPresent(String.self, forKey: .description)
349 | }
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:544:69: warning: conditional downcast from 'String?' to 'String' does nothing
542 | return
543 | }
544 | let id = (try? c.decodeIfPresent(String.self, forKey: .id)) as? String ?? ""
| `- warning: conditional downcast from 'String?' to 'String' does nothing
545 | let style = try? c.decodeIfPresent(BlockStyle.self, forKey: .style)
546 | func string(_ key: Keys) -> String? { (try? c.decodeIfPresent(String.self, forKey: key)) ?? nil }
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:573:83: warning: conditional downcast from '[ListItem]?' to '[ListItem]' does nothing
571 | ))
572 | case "list":
573 | let items = (try? c.decodeIfPresent([ListItem].self, forKey: .items)) as? [ListItem] ?? []
| `- warning: conditional downcast from '[ListItem]?' to '[ListItem]' does nothing
574 | self = .list(ListBlock(
575 | id: id, items: items, iconColor: string(.iconColor), style: style,
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:606:93: warning: conditional downcast from '[PaywallBlock]?' to '[PaywallBlock]' does nothing
604 | ))
605 | case "card":
606 | let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
| `- warning: conditional downcast from '[PaywallBlock]?' to '[PaywallBlock]' does nothing
607 | let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
608 | let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:607:80: warning: conditional downcast from 'Int?' to 'Int' does nothing
605 | case "card":
606 | let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
607 | let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
| `- warning: conditional downcast from 'Int?' to 'Int' does nothing
608 | let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
609 | self = .card(CardBlock(
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:608:83: warning: conditional downcast from 'Int?' to 'Int' does nothing
606 | let children = (try? c.decodeIfPresent([PaywallBlock].self, forKey: .children)) as? [PaywallBlock] ?? []
607 | let columns = (try? c.decodeIfPresent(Int.self, forKey: .columns)) as? Int
608 | let index = (try? c.decodeIfPresent(Int.self, forKey: .packageIndex)) as? Int
| `- warning: conditional downcast from 'Int?' to 'Int' does nothing
609 | self = .card(CardBlock(
610 | id: id, layout: string(.layout), autoAdvance: int(.autoAdvance), repeatMode: string(.repeat),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:817:73: warning: conditional downcast from 'Int?' to 'Int' does nothing
815 | }
816 | self.screens = screens
817 | version = ((try? c.decodeIfPresent(Int.self, forKey: .version)) as? Int) ?? 1
| `- warning: conditional downcast from 'Int?' to 'Int' does nothing
818 | layout = try? c.decodeIfPresent(String.self, forKey: .layout)
819 | // `background` is a plain string in the original form and an object in
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:826:80: warning: conditional downcast from 'String?' to 'String' does nothing
824 | backgroundSpec = spec
825 | background = revnixBackgroundGround(spec) ?? "#000000"
826 | textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
| `- warning: conditional downcast from 'String?' to 'String' does nothing
827 | accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
828 | accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:827:74: warning: conditional downcast from 'String?' to 'String' does nothing
825 | background = revnixBackgroundGround(spec) ?? "#000000"
826 | textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
827 | accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
| `- warning: conditional downcast from 'String?' to 'String' does nothing
828 | accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
829 | fontFamily = try? c.decodeIfPresent(String.self, forKey: .fontFamily)
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallBlocks.swift:828:80: warning: conditional downcast from 'String?' to 'String' does nothing
826 | textColor = ((try? c.decodeIfPresent(String.self, forKey: .textColor)) as? String) ?? "#FFFFFF"
827 | accent = ((try? c.decodeIfPresent(String.self, forKey: .accent)) as? String) ?? "#6478ff"
828 | accentInk = ((try? c.decodeIfPresent(String.self, forKey: .accentInk)) as? String) ?? "#FFFFFF"
| `- warning: conditional downcast from 'String?' to 'String' does nothing
829 | fontFamily = try? c.decodeIfPresent(String.self, forKey: .fontFamily)
830 | // REV-271: a malformed table costs the translations, never the
[18/22] Compiling Revnix DeviceFacts.swift
[19/22] Compiling Revnix ImplicitPlacements.swift
[20/22] Emitting module Revnix
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PaywallLocalization.swift:106:13: warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
104 |
105 | private let revnixLocaleOverrideLock = NSLock()
106 | private var revnixLocaleOverride: String?
| |- warning: var 'revnixLocaleOverride' is not concurrency-safe because it is nonisolated global shared mutable state; this is an error in the Swift 6 language mode
| |- note: convert 'revnixLocaleOverride' to a 'let' constant to make 'Sendable' shared state immutable
| |- note: add '@MainActor' to make var 'revnixLocaleOverride' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
107 |
108 | func revnixSetLocaleOverride(_ tag: String?) {
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:93:23: warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
71 | public struct RevnixPaywallTheme: Equatable {
| `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
72 | public var background: Color
73 | public var textPrimary: Color
:
91 |
92 | /// Base theme for dark configs (and legacy configs without `mode`).
93 | public static let dark = RevnixPaywallTheme(
| |- warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'dark' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
94 | background: rgb(0x0f1116), textPrimary: rgb(0xffffff),
95 | textSecondary: rgb(0x9aa0a8), textFaint: rgb(0x6b7078),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:100:23: warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
71 | public struct RevnixPaywallTheme: Equatable {
| `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
72 | public var background: Color
73 | public var textPrimary: Color
:
98 | /// Base theme when the dashboard config sets `mode: "light"`. Keep in
99 | /// lockstep with the builder preview (PaywallPhonePreview SCREEN_PALETTES).
100 | public static let light = RevnixPaywallTheme(
| |- warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'light' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
101 | background: rgb(0xffffff), textPrimary: rgb(0x16181d),
102 | textSecondary: rgb(0x5b6068), textFaint: rgb(0x9aa0a8),
[21/22] Compiling Revnix RevnixPaywallView.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:93:23: warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
71 | public struct RevnixPaywallTheme: Equatable {
| `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
72 | public var background: Color
73 | public var textPrimary: Color
:
91 |
92 | /// Base theme for dark configs (and legacy configs without `mode`).
93 | public static let dark = RevnixPaywallTheme(
| |- warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'dark' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
94 | background: rgb(0x0f1116), textPrimary: rgb(0xffffff),
95 | textSecondary: rgb(0x9aa0a8), textFaint: rgb(0x6b7078),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:100:23: warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
71 | public struct RevnixPaywallTheme: Equatable {
| `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
72 | public var background: Color
73 | public var textPrimary: Color
:
98 | /// Base theme when the dashboard config sets `mode: "light"`. Keep in
99 | /// lockstep with the builder preview (PaywallPhonePreview SCREEN_PALETTES).
100 | public static let light = RevnixPaywallTheme(
| |- warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'light' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
101 | background: rgb(0xffffff), textPrimary: rgb(0x16181d),
102 | textSecondary: rgb(0x5b6068), textFaint: rgb(0x9aa0a8),
[22/22] Compiling Revnix Skan.swift
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:93:23: warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
71 | public struct RevnixPaywallTheme: Equatable {
| `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
72 | public var background: Color
73 | public var textPrimary: Color
:
91 |
92 | /// Base theme for dark configs (and legacy configs without `mode`).
93 | public static let dark = RevnixPaywallTheme(
| |- warning: static property 'dark' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'dark' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
94 | background: rgb(0x0f1116), textPrimary: rgb(0xffffff),
95 | textSecondary: rgb(0x9aa0a8), textFaint: rgb(0x6b7078),
/Users/admin/builder/spi-builder-workspace/Sources/Revnix/RevnixPaywallView.swift:100:23: warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
69 | /// Colors the paywall renders with. Defaults mirror the dashboard preview
70 | /// chrome (a fixed dark screen) — override to match the host app's theme.
71 | public struct RevnixPaywallTheme: Equatable {
| `- note: consider making struct 'RevnixPaywallTheme' conform to the 'Sendable' protocol
72 | public var background: Color
73 | public var textPrimary: Color
:
98 | /// Base theme when the dashboard config sets `mode: "light"`. Keep in
99 | /// lockstep with the builder preview (PaywallPhonePreview SCREEN_PALETTES).
100 | public static let light = RevnixPaywallTheme(
| |- warning: static property 'light' is not concurrency-safe because non-'Sendable' type 'RevnixPaywallTheme' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'light' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
101 | background: rgb(0xffffff), textPrimary: rgb(0x16181d),
102 | textSecondary: rgb(0x5b6068), textFaint: rgb(0x9aa0a8),
Build complete! (13.10s)
Build complete.
{
"dependencies" : [
],
"manifest_display_name" : "Revnix",
"name" : "Revnix",
"path" : "/Users/admin/builder/spi-builder-workspace",
"platforms" : [
{
"name" : "ios",
"version" : "16.0"
},
{
"name" : "macos",
"version" : "13.0"
},
{
"name" : "tvos",
"version" : "16.0"
},
{
"name" : "watchos",
"version" : "9.0"
}
],
"products" : [
{
"name" : "Revnix",
"targets" : [
"Revnix"
],
"type" : {
"library" : [
"automatic"
]
}
}
],
"targets" : [
{
"c99name" : "RevnixTests",
"module_type" : "SwiftTarget",
"name" : "RevnixTests",
"path" : "Tests/RevnixTests",
"resources" : [
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/Revnix.storekit",
"rule" : {
"copy" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/paywall-background-wire.json",
"rule" : {
"copy" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/RevnixTests/Resources/paywall-selection-wire.json",
"rule" : {
"copy" : {
}
}
}
],
"sources" : [
"AttributionTests.swift",
"DeepLinkPrivacyTests.swift",
"ImplicitPlacementTests.swift",
"PaywallBackgroundTests.swift",
"PaywallBlockFillTests.swift",
"PaywallBlockGeometryTests.swift",
"PaywallBlockTests.swift",
"PaywallLocalizationTests.swift",
"PaywallSelectionWireTests.swift",
"PreviewTests.swift",
"PrivacyManifestTests.swift",
"RevnixClientTests.swift",
"SkanTests.swift",
"StoreKitIntegrationTests.swift",
"TrackingTests.swift"
],
"target_dependencies" : [
"Revnix"
],
"type" : "test"
},
{
"c99name" : "Revnix",
"module_type" : "SwiftTarget",
"name" : "Revnix",
"path" : "Sources/Revnix",
"product_memberships" : [
"Revnix"
],
"resources" : [
{
"path" : "/Users/admin/builder/spi-builder-workspace/Sources/Revnix/PrivacyInfo.xcprivacy",
"rule" : {
"copy" : {
}
}
}
],
"sources" : [
"DeviceFacts.swift",
"ImplicitPlacements.swift",
"Models.swift",
"PaywallBackground.swift",
"PaywallBlockGeometry.swift",
"PaywallBlocks.swift",
"PaywallLocalization.swift",
"PaywallRenderRules.swift",
"RevnixClient.swift",
"RevnixConfig.swift",
"RevnixError.swift",
"RevnixPaywallBlockView.swift",
"RevnixPaywallView.swift",
"Skan.swift",
"Storage.swift",
"StoreKitGlue.swift",
"Tracking.swift"
],
"type" : "library"
}
],
"tools_version" : "5.9"
}
Done.