Skip to content

Commit 0550c5b

Browse files
Merge pull request #86 from stytchauth/jordan/customizable-iOS-suite-name
feat: configurable persistence file name on all platforms
2 parents 911ee95 + 0f19d0b commit 0550c5b

12 files changed

Lines changed: 39 additions & 18 deletions

File tree

examples/rn/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
"@react-navigation/bottom-tabs": "^7.4.0",
1717
"@react-navigation/elements": "^2.6.3",
1818
"@react-navigation/native": "^7.1.8",
19-
"@stytch/react-native-b2b": "file:../../source/react-native/b2b",
2019
"@stytch/react-native-consumer": "file:../../source/react-native/consumer",
2120
"expo": "^55.0.13",
2221
"expo-apple-authentication": "~55.0.13",

source/react-native/shared/android/src/main/java/com/stytch/mobile/bridge/StytchBridgeModule.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.stytch.sdk.passkeys.PasskeyProvider
2828
import com.stytch.sdk.passkeys.PasskeysParameters
2929
import com.stytch.sdk.persistence.StytchPersistenceClient
3030
import com.stytch.sdk.persistence.StytchPlatformPersistenceClient
31+
import com.stytch.sdk.persistence.STYTCH_PERSISTENCE_FILE_NAME
3132
import com.stytch.sdk.pkce.PKCEClient
3233
import io.ktor.util.decodeBase64Bytes
3334
import io.ktor.util.encodeBase64
@@ -40,7 +41,6 @@ import kotlinx.serialization.json.jsonObject
4041
import kotlinx.serialization.json.jsonPrimitive
4142
import kotlinx.coroutines.*
4243

43-
4444
/**
4545
* This bridge module is just an RN-accessible, well, bridge, to the existing code in the "real" Stytch SDK,
4646
* which is a dependency of this React Native SDK.
@@ -50,7 +50,7 @@ import kotlinx.coroutines.*
5050
class StytchBridgeModule(reactContext: ReactApplicationContext) :
5151
NativeStytchBridgeSpec(reactContext) {
5252
private val encryptionClient: StytchEncryptionClient = StytchEncryptionClient()
53-
private val platformPersistenceClient: StytchPlatformPersistenceClient = StytchPlatformPersistenceClient(reactContext)
53+
private val platformPersistenceClient: StytchPlatformPersistenceClient = StytchPlatformPersistenceClient(reactContext, STYTCH_PERSISTENCE_FILE_NAME)
5454
private val dfpProvider = DFPProviderImpl(reactContext)
5555
private val captchaProvider = CAPTCHAProviderImpl(reactContext.applicationContext as Application)
5656
private val deviceInfo = reactContext.getDeviceInfo()

source/react-native/shared/ios/StytchBridge.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#import <StytchConsumerSDK/StytchConsumerSDK.h>
33
#import <StytchConsumerSDK/StytchConsumerSDK-Swift.h>
44
SCSDKStytchEncryptionClient *encryptionClient = [[SCSDKStytchEncryptionClient alloc] init];
5-
SCSDKStytchPlatformPersistenceClient *platformPersistenceClient = [[SCSDKStytchPlatformPersistenceClient alloc] init];
5+
SCSDKStytchPlatformPersistenceClient *platformPersistenceClient = [[SCSDKStytchPlatformPersistenceClient alloc] initWithPersistenceFileName:[SCSDKStytchPlatformPersistenceClientKt STYTCH_PERSISTENCE_FILE_NAME]];
66
SCSDKCAPTCHAProviderImpl *captchaClient = [[SCSDKCAPTCHAProviderImpl alloc] init];
77
SCSDKDFPProviderImpl *dfpClient;
88
SCSDKBiometricsProvider *biometricsProvider = [[SCSDKBiometricsProvider alloc] initWithEncryptionClient:encryptionClient persistenceClient:platformPersistenceClient];

source/shared/sdk/shared/src/androidDeviceTest/kotlin/com/stytch/sdk/persistence/StytchPlatformPersistenceClientInstrumentedTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ internal class StytchPlatformPersistenceClientInstrumentedTest {
1616
@Before
1717
fun setUp() {
1818
val context = InstrumentationRegistry.getInstrumentation().targetContext
19-
client = StytchPlatformPersistenceClient(context)
19+
client = StytchPlatformPersistenceClient(context, STYTCH_PERSISTENCE_FILE_NAME)
2020
client.reset()
2121
}
2222

source/shared/sdk/shared/src/androidMain/kotlin/com/stytch/sdk/data/StytchClientConfiguration.android.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.stytch.sdk.dfp.DFPProviderImpl
99
import com.stytch.sdk.encryption.StytchEncryptionClient
1010
import com.stytch.sdk.oauth.OAuthProvider
1111
import com.stytch.sdk.passkeys.PasskeyProvider
12+
import com.stytch.sdk.persistence.STYTCH_PERSISTENCE_FILE_NAME
1213
import com.stytch.sdk.persistence.StytchPlatformPersistenceClient
1314

1415
public actual class StytchClientConfiguration(
@@ -17,13 +18,14 @@ public actual class StytchClientConfiguration(
1718
internal val endpointOptions: EndpointOptions = EndpointOptions(),
1819
internal val defaultSessionDuration: Int? = null,
1920
internal val googleCredentialConfiguration: GoogleCredentialConfiguration? = null,
21+
internal val persistenceFileName: String = STYTCH_PERSISTENCE_FILE_NAME,
2022
) {
2123
public actual fun toInternal(): StytchClientConfigurationInternal {
2224
// DFP initialization is a two-step process SOLELY because it has to be on React Native :upsidedownface:
2325
val dfpProvider = DFPProviderImpl(context)
2426
dfpProvider.configureDfp(publicToken = publicToken, dfppaDomain = endpointOptions.dfppaDomain)
2527
val encryptionClient = StytchEncryptionClient()
26-
val platformPersistenceClient = StytchPlatformPersistenceClient(context)
28+
val platformPersistenceClient = StytchPlatformPersistenceClient(context, persistenceFileName)
2729
return StytchClientConfigurationInternal(
2830
publicToken = publicToken,
2931
endpointOptions = endpointOptions,

source/shared/sdk/shared/src/androidMain/kotlin/com/stytch/sdk/persistence/StytchPlatformPersistenceClient.android.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import android.content.SharedPreferences
55

66
public actual class StytchPlatformPersistenceClient(
77
public val context: Context,
8+
persistenceFileName: String,
89
) {
9-
private val sharedPreferences: SharedPreferences = context.getSharedPreferences(STYTCH_PERSISTENCE_FILE_NAME, Context.MODE_PRIVATE)
10+
private val sharedPreferences: SharedPreferences = context.getSharedPreferences(persistenceFileName, Context.MODE_PRIVATE)
1011

1112
public actual fun saveData(
1213
key: String,

source/shared/sdk/shared/src/iosMain/kotlin/com/stytch/sdk/data/StytchClientConfiguration.ios.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.stytch.sdk.dfp.DFPProviderImpl
66
import com.stytch.sdk.encryption.StytchEncryptionClient
77
import com.stytch.sdk.oauth.OAuthProvider
88
import com.stytch.sdk.passkeys.PasskeyProvider
9+
import com.stytch.sdk.persistence.STYTCH_PERSISTENCE_FILE_NAME
910
import com.stytch.sdk.persistence.StytchPlatformPersistenceClient
1011
import kotlinx.cinterop.ExperimentalForeignApi
1112
import kotlinx.cinterop.useContents
@@ -18,14 +19,27 @@ public actual class StytchClientConfiguration(
1819
internal val publicToken: String,
1920
internal val endpointOptions: EndpointOptions = EndpointOptions(),
2021
internal val defaultSessionDuration: Int? = null,
22+
internal val persistenceFileName: String = STYTCH_PERSISTENCE_FILE_NAME,
2123
) {
22-
// Manual secondary constructor for iOS DX improvement
23-
public constructor(publicToken: String) : this(publicToken, EndpointOptions())
24+
// Manual secondary constructors for iOS DX improvement (not doing EVERY combination, just helpers for "Token Only" and "Token + One")
25+
public constructor(publicToken: String) : this(publicToken, EndpointOptions(), null, STYTCH_PERSISTENCE_FILE_NAME)
26+
public constructor(
27+
publicToken: String,
28+
endpointOptions: EndpointOptions,
29+
) : this(publicToken, endpointOptions, null, STYTCH_PERSISTENCE_FILE_NAME)
30+
public constructor(
31+
publicToken: String,
32+
defaultSessionDuration: Int,
33+
) : this(publicToken, EndpointOptions(), defaultSessionDuration, STYTCH_PERSISTENCE_FILE_NAME)
34+
public constructor(
35+
publicToken: String,
36+
nsUserDefaultsSuiteName: String,
37+
) : this(publicToken, EndpointOptions(), null, nsUserDefaultsSuiteName)
2438

2539
@OptIn(ExperimentalForeignApi::class)
2640
public actual fun toInternal(): StytchClientConfigurationInternal {
2741
val encryptionClient = StytchEncryptionClient()
28-
val platformPersistenceClient = StytchPlatformPersistenceClient()
42+
val platformPersistenceClient = StytchPlatformPersistenceClient(persistenceFileName)
2943
return StytchClientConfigurationInternal(
3044
publicToken = publicToken,
3145
endpointOptions = endpointOptions,

source/shared/sdk/shared/src/iosMain/kotlin/com/stytch/sdk/persistence/StytchPlatformPersistenceClient.ios.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import platform.Foundation.NSURLIsExcludedFromBackupKey
88
import platform.Foundation.NSUserDefaults
99
import platform.Foundation.NSUserDomainMask
1010

11-
public actual class StytchPlatformPersistenceClient {
12-
private val userDefaults: NSUserDefaults = NSUserDefaults(STYTCH_PERSISTENCE_FILE_NAME)
11+
public actual class StytchPlatformPersistenceClient(
12+
private val persistenceFileName: String,
13+
) {
14+
private val userDefaults: NSUserDefaults = NSUserDefaults(persistenceFileName)
1315

1416
init {
1517
excludeFromBackup()
@@ -32,13 +34,13 @@ public actual class StytchPlatformPersistenceClient {
3234
userDefaults.dictionaryRepresentation().keys.forEach { key ->
3335
userDefaults.removeObjectForKey(key as String)
3436
}
35-
NSUserDefaults.standardUserDefaults.removePersistentDomainForName(STYTCH_PERSISTENCE_FILE_NAME)
37+
NSUserDefaults.standardUserDefaults.removePersistentDomainForName(persistenceFileName)
3638
}
3739

3840
@OptIn(ExperimentalForeignApi::class)
3941
private fun excludeFromBackup() {
4042
val library = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, true).firstOrNull() as? String ?: return
41-
val prefsPath = "$library/Preferences/$STYTCH_PERSISTENCE_FILE_NAME.plist"
43+
val prefsPath = "$library/Preferences/$persistenceFileName.plist"
4244
val url = NSURL.fileURLWithPath(prefsPath)
4345
url.setResourceValue(value = true, forKey = NSURLIsExcludedFromBackupKey, error = null)
4446
}

source/shared/sdk/shared/src/iosSimulatorArm64Test/kotlin/com/stytch/sdk/persistence/StytchPlatformPersistenceClientSimulatorTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import kotlin.test.assertEquals
77
import kotlin.test.assertNull
88

99
internal class StytchPlatformPersistenceClientSimulatorTest {
10-
private val client = StytchPlatformPersistenceClient()
10+
private val client = StytchPlatformPersistenceClient(STYTCH_PERSISTENCE_FILE_NAME)
1111

1212
@BeforeTest
1313
fun setUp() {

source/shared/sdk/shared/src/jvmMain/kotlin/com/stytch/sdk/data/StytchClientConfiguration.jvm.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.stytch.sdk.biometrics.BiometricsProvider
44
import com.stytch.sdk.encryption.StytchEncryptionClient
55
import com.stytch.sdk.oauth.OAuthProvider
66
import com.stytch.sdk.passkeys.PasskeyProvider
7+
import com.stytch.sdk.persistence.STYTCH_PERSISTENCE_FILE_NAME
78
import com.stytch.sdk.persistence.StytchPlatformPersistenceClient
89
import java.awt.Toolkit
910

@@ -14,11 +15,12 @@ public actual class StytchClientConfiguration(
1415
internal val keystorePassword: String,
1516
internal val endpointOptions: EndpointOptions = EndpointOptions(),
1617
public val defaultSessionDuration: Int? = null,
18+
internal val persistenceFileName: String = STYTCH_PERSISTENCE_FILE_NAME,
1719
) {
1820
public actual fun toInternal(): StytchClientConfigurationInternal {
1921
// create necessary clients
2022
val encryptionClient = StytchEncryptionClient(keystorePassword)
21-
val platformPersistenceClient = StytchPlatformPersistenceClient(applicationClass)
23+
val platformPersistenceClient = StytchPlatformPersistenceClient(applicationClass, persistenceFileName)
2224
// if it failed the first time (key corruption issues), nuke any previous preferences, because they are gone
2325
if (encryptionClient.keystoreFailedOnInitialization) {
2426
platformPersistenceClient.reset()

0 commit comments

Comments
 (0)