12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
+ import FirebaseCoreInternal
15
16
import Foundation
16
17
18
+ // TODO(Swift 6 Breaking): Consider breaking up into a checked Sendable Swift
19
+ // type and unchecked Sendable ObjC wrapper class.
20
+
17
21
/// Used to set and retrieve settings related to handling action codes.
18
22
@objc ( FIRActionCodeSettings) open class ActionCodeSettings : NSObject ,
19
- @unchecked Sendable /* TODO: sendable */ {
23
+ @unchecked Sendable {
20
24
/// This URL represents the state/Continue URL in the form of a universal link.
21
25
///
22
26
/// This URL can should be constructed as a universal link that would either directly open
23
27
/// the app where the action code would be handled or continue to the app after the action code
24
28
/// is handled by Firebase.
25
- @objc ( URL) open var url : URL ?
29
+ @objc ( URL) open var url : URL ? {
30
+ get { impl. url. value ( ) }
31
+ set { impl. url. withLock { $0 = newValue } }
32
+ }
26
33
27
34
/// Indicates whether the action code link will open the app directly or after being
28
35
/// redirected from a Firebase owned web widget.
29
- @objc open var handleCodeInApp : Bool = false
36
+ @objc open var handleCodeInApp : Bool {
37
+ get { impl. handleCodeInApp. value ( ) }
38
+ set { impl. handleCodeInApp. withLock { $0 = newValue } }
39
+ }
30
40
31
41
/// The iOS bundle ID, if available. The default value is the current app's bundle ID.
32
- @objc open var iOSBundleID : String ?
42
+ @objc open var iOSBundleID : String ? {
43
+ get { impl. iOSBundleID. value ( ) }
44
+ set { impl. iOSBundleID. withLock { $0 = newValue } }
45
+ }
33
46
34
47
/// The Android package name, if available.
35
- @objc open var androidPackageName : String ?
48
+ @objc open var androidPackageName : String ? {
49
+ get { impl. androidPackageName. value ( ) }
50
+ set { impl. androidPackageName. withLock { $0 = newValue } }
51
+ }
36
52
37
53
/// The minimum Android version supported, if available.
38
- @objc open var androidMinimumVersion : String ?
54
+ @objc open var androidMinimumVersion : String ? {
55
+ get { impl. androidMinimumVersion. value ( ) }
56
+ set { impl. androidMinimumVersion. withLock { $0 = newValue } }
57
+ }
39
58
40
59
/// Indicates whether the Android app should be installed on a device where it is not available.
41
- @objc open var androidInstallIfNotAvailable : Bool = false
60
+ @objc open var androidInstallIfNotAvailable : Bool {
61
+ get { impl. androidInstallIfNotAvailable. value ( ) }
62
+ set { impl. androidInstallIfNotAvailable. withLock { $0 = newValue } }
63
+ }
42
64
43
65
/// The Firebase Dynamic Link domain used for out of band code flow.
44
66
#if !FIREBASE_CI
@@ -48,14 +70,22 @@ import Foundation
48
70
message: " Firebase Dynamic Links is deprecated. Migrate to use Firebase Hosting link and use `linkDomain` to set a custom domain instead. "
49
71
)
50
72
#endif // !FIREBASE_CI
51
- @objc open var dynamicLinkDomain : String ?
73
+ @objc open var dynamicLinkDomain : String ? {
74
+ get { impl. dynamicLinkDomain. value ( ) }
75
+ set { impl. dynamicLinkDomain. withLock { $0 = newValue } }
76
+ }
52
77
53
78
/// The out of band custom domain for handling code in app.
54
- @objc public var linkDomain : String ?
79
+ @objc public var linkDomain : String ? {
80
+ get { impl. linkDomain. value ( ) }
81
+ set { impl. linkDomain. withLock { $0 = newValue } }
82
+ }
83
+
84
+ private let impl : SendableActionCodeSettings
55
85
56
86
/// Sets the iOS bundle ID.
57
87
@objc override public init ( ) {
58
- iOSBundleID = Bundle . main . bundleIdentifier
88
+ impl = . init ( )
59
89
}
60
90
61
91
/// Sets the Android package name, the flag to indicate whether or not to install the app,
@@ -71,13 +101,60 @@ import Foundation
71
101
@objc open func setAndroidPackageName( _ androidPackageName: String ,
72
102
installIfNotAvailable: Bool ,
73
103
minimumVersion: String ? ) {
74
- self . androidPackageName = androidPackageName
75
- androidInstallIfNotAvailable = installIfNotAvailable
76
- androidMinimumVersion = minimumVersion
104
+ impl
105
+ . setAndroidPackageName (
106
+ androidPackageName,
107
+ installIfNotAvailable: installIfNotAvailable,
108
+ minimumVersion: minimumVersion
109
+ )
77
110
}
78
111
79
112
/// Sets the iOS bundle ID.
80
113
open func setIOSBundleID( _ bundleID: String ) {
81
- iOSBundleID = bundleID
114
+ impl. setIOSBundleID ( bundleID)
115
+ }
116
+ }
117
+
118
+ private extension ActionCodeSettings {
119
+ /// Checked Sendable implementation of `ActionCodeSettings`.
120
+ final class SendableActionCodeSettings : Sendable {
121
+ let url = FIRAllocatedUnfairLock < URL ? > ( initialState: nil )
122
+
123
+ let handleCodeInApp = FIRAllocatedUnfairLock < Bool > ( initialState: false )
124
+
125
+ let iOSBundleID : FIRAllocatedUnfairLock < String ? >
126
+
127
+ let androidPackageName = FIRAllocatedUnfairLock < String ? > ( initialState: nil )
128
+
129
+ let androidMinimumVersion = FIRAllocatedUnfairLock < String ? > ( initialState: nil )
130
+
131
+ let androidInstallIfNotAvailable = FIRAllocatedUnfairLock < Bool > ( initialState: false )
132
+
133
+ #if !FIREBASE_CI
134
+ @available (
135
+ * ,
136
+ deprecated,
137
+ message: " Firebase Dynamic Links is deprecated. Migrate to use Firebase Hosting link and use `linkDomain` to set a custom domain instead. "
138
+ )
139
+ #endif // !FIREBASE_CI
140
+ let dynamicLinkDomain = FIRAllocatedUnfairLock < String ? > ( initialState: nil )
141
+
142
+ let linkDomain = FIRAllocatedUnfairLock < String ? > ( initialState: nil )
143
+
144
+ init ( ) {
145
+ iOSBundleID = FIRAllocatedUnfairLock < String ? > ( initialState: Bundle . main. bundleIdentifier)
146
+ }
147
+
148
+ func setAndroidPackageName( _ androidPackageName: String ,
149
+ installIfNotAvailable: Bool ,
150
+ minimumVersion: String ? ) {
151
+ self . androidPackageName. withLock { $0 = androidPackageName }
152
+ androidInstallIfNotAvailable. withLock { $0 = installIfNotAvailable }
153
+ androidMinimumVersion. withLock { $0 = minimumVersion }
154
+ }
155
+
156
+ func setIOSBundleID( _ bundleID: String ) {
157
+ iOSBundleID. withLock { $0 = bundleID }
158
+ }
82
159
}
83
160
}
0 commit comments