1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15+ import FirebaseCoreInternal
1516import Foundation
1617
18+ // TODO(Swift 6 Breaking): Consider breaking up into a checked Sendable Swift
19+ // type and unchecked Sendable ObjC wrapper class.
20+
1721/// Used to set and retrieve settings related to handling action codes.
18- @objc ( FIRActionCodeSettings) open class ActionCodeSettings : NSObject {
22+ @objc ( FIRActionCodeSettings) open class ActionCodeSettings : NSObject ,
23+ @unchecked Sendable {
1924 /// This URL represents the state/Continue URL in the form of a universal link.
2025 ///
2126 /// This URL can should be constructed as a universal link that would either directly open
2227 /// the app where the action code would be handled or continue to the app after the action code
2328 /// is handled by Firebase.
24- @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+ }
2533
2634 /// Indicates whether the action code link will open the app directly or after being
2735 /// redirected from a Firebase owned web widget.
28- @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+ }
2940
3041 /// The iOS bundle ID, if available. The default value is the current app's bundle ID.
31- @objc open var iOSBundleID : String ?
42+ @objc open var iOSBundleID : String ? {
43+ get { impl. iOSBundleID. value ( ) }
44+ set { impl. iOSBundleID. withLock { $0 = newValue } }
45+ }
3246
3347 /// The Android package name, if available.
34- @objc open var androidPackageName : String ?
48+ @objc open var androidPackageName : String ? {
49+ get { impl. androidPackageName. value ( ) }
50+ set { impl. androidPackageName. withLock { $0 = newValue } }
51+ }
3552
3653 /// The minimum Android version supported, if available.
37- @objc open var androidMinimumVersion : String ?
54+ @objc open var androidMinimumVersion : String ? {
55+ get { impl. androidMinimumVersion. value ( ) }
56+ set { impl. androidMinimumVersion. withLock { $0 = newValue } }
57+ }
3858
3959 /// Indicates whether the Android app should be installed on a device where it is not available.
40- @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+ }
4164
4265 /// The Firebase Dynamic Link domain used for out of band code flow.
4366 #if !FIREBASE_CI
@@ -47,14 +70,22 @@ import Foundation
4770 message: " Firebase Dynamic Links is deprecated. Migrate to use Firebase Hosting link and use `linkDomain` to set a custom domain instead. "
4871 )
4972 #endif // !FIREBASE_CI
50- @objc open var dynamicLinkDomain : String ?
73+ @objc open var dynamicLinkDomain : String ? {
74+ get { impl. dynamicLinkDomain. value ( ) }
75+ set { impl. dynamicLinkDomain. withLock { $0 = newValue } }
76+ }
5177
5278 /// The out of band custom domain for handling code in app.
53- @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
5485
5586 /// Sets the iOS bundle ID.
5687 @objc override public init ( ) {
57- iOSBundleID = Bundle . main . bundleIdentifier
88+ impl = . init ( )
5889 }
5990
6091 /// Sets the Android package name, the flag to indicate whether or not to install the app,
@@ -70,13 +101,60 @@ import Foundation
70101 @objc open func setAndroidPackageName( _ androidPackageName: String ,
71102 installIfNotAvailable: Bool ,
72103 minimumVersion: String ? ) {
73- self . androidPackageName = androidPackageName
74- androidInstallIfNotAvailable = installIfNotAvailable
75- androidMinimumVersion = minimumVersion
104+ impl
105+ . setAndroidPackageName (
106+ androidPackageName,
107+ installIfNotAvailable: installIfNotAvailable,
108+ minimumVersion: minimumVersion
109+ )
76110 }
77111
78112 /// Sets the iOS bundle ID.
79113 open func setIOSBundleID( _ bundleID: String ) {
80- 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+ }
81159 }
82160}
0 commit comments