diff --git a/composeApp/src/commonMain/kotlin/net/codinux/banking/ui/service/AuthenticationService.kt b/composeApp/src/commonMain/kotlin/net/codinux/banking/ui/service/AuthenticationService.kt
index 10ebbc8..3a2e46a 100644
--- a/composeApp/src/commonMain/kotlin/net/codinux/banking/ui/service/AuthenticationService.kt
+++ b/composeApp/src/commonMain/kotlin/net/codinux/banking/ui/service/AuthenticationService.kt
@@ -23,7 +23,7 @@ fun AuthenticationService.safelyAuthenticateWithBiometrics(authenticationResult:
try {
this.authenticateWithBiometrics(authenticationResult)
} catch (e: Throwable) {
- Log.error(e) { "Could not authenticate with Biometrics" }
- DI.uiState.applicationErrorOccurred(ErroneousAction.BiometricAuthentication, "Beim Login mit Fingerabdruck / Gesichtsscan ist etwas fehlgeschlagen, was nicht fehlschlagen sollte. Die folgende Fehlermeldung wird Ihnen vermutlich nichts sagen. Am besten informieren Sie die Entwickler (die faulen Säcke), z. B. mit einem Screenshot dieser Fehlermeldung, damit diese sich darum kümmern.", e)
+ DI.bankingService.showAndLogError(ErroneousAction.BiometricAuthentication, "Could not authenticate with Biometrics", "Beim Login mit Fingerabdruck / Gesichtsscan ist etwas fehlgeschlagen, was nicht fehlschlagen sollte. Die folgende Fehlermeldung wird Ihnen vermutlich nichts sagen. Am besten informieren Sie die Entwickler (die faulen Säcke), z. B. mit einem Screenshot dieser Fehlermeldung, damit diese sich darum kümmern.", e)
+ authenticationResult(AuthenticationResult(false))
}
}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/net/codinux/banking/ui/service/BankingService.kt b/composeApp/src/commonMain/kotlin/net/codinux/banking/ui/service/BankingService.kt
index 7c3461a..bc68a80 100644
--- a/composeApp/src/commonMain/kotlin/net/codinux/banking/ui/service/BankingService.kt
+++ b/composeApp/src/commonMain/kotlin/net/codinux/banking/ui/service/BankingService.kt
@@ -427,7 +427,7 @@ class BankingService(
}
}
- private fun showAndLogError(action: ErroneousAction, logMessage: String, messageToShowToUser: String? = null, exception: Throwable? = null) {
+ fun showAndLogError(action: ErroneousAction, logMessage: String, messageToShowToUser: String? = null, exception: Throwable? = null) {
log.error(exception) { logMessage }
uiState.applicationErrorOccurred(action, messageToShowToUser, exception)
diff --git a/composeApp/src/iosMain/kotlin/net/codinux/banking/ui/service/AuthenticationService.ios.kt b/composeApp/src/iosMain/kotlin/net/codinux/banking/ui/service/AuthenticationService.ios.kt
index b09cdc9..50c62b4 100644
--- a/composeApp/src/iosMain/kotlin/net/codinux/banking/ui/service/AuthenticationService.ios.kt
+++ b/composeApp/src/iosMain/kotlin/net/codinux/banking/ui/service/AuthenticationService.ios.kt
@@ -4,12 +4,12 @@ import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.memScoped
import kotlinx.cinterop.refTo
import net.codinux.banking.ui.model.AuthenticationResult
-import platform.CoreCrypto.CCCalibratePBKDF
import platform.CoreCrypto.CCKeyDerivationPBKDF
import platform.CoreCrypto.CC_SHA512
import platform.CoreCrypto.CC_SHA512_DIGEST_LENGTH
import platform.CoreCrypto.kCCPBKDF2
import platform.CoreCrypto.kCCPRFHmacAlgSHA256
+import platform.LocalAuthentication.LAContext
import platform.Security.SecRandomCopyBytes
import platform.Security.kSecRandomDefault
@@ -35,10 +35,23 @@ actual object AuthenticationService {
}
- actual val supportsBiometricAuthentication = false // TODO
+ actual val supportsBiometricAuthentication: Boolean by lazy {
+ try {
+ val localAuthenticationContext = LAContext()
+
+ localAuthenticationContext.canEvaluatePolicy(platform.LocalAuthentication.LAPolicyDeviceOwnerAuthenticationWithBiometrics, null)
+ } catch (e: Throwable) {
+ false
+ }
+ }
actual fun authenticateWithBiometrics(authenticationResult: (AuthenticationResult) -> Unit) {
- authenticationResult(AuthenticationResult(false, "Biometrics is not implemented yet"))
+ val context = LAContext()
+ val reason = "Authentifizieren Sie sich bitte um die App zu entsperren"
+
+ context.evaluatePolicy(platform.LocalAuthentication.LAPolicyDeviceOwnerAuthenticationWithBiometrics, reason) { success, error ->
+ authenticationResult(AuthenticationResult(success, error?.localizedDescription))
+ }
}
diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist
index e4d356d..919da14 100644
--- a/iosApp/iosApp/Info.plist
+++ b/iosApp/iosApp/Info.plist
@@ -22,6 +22,10 @@
$(CURRENT_PROJECT_VERSION)
LSRequiresIPhoneOS
+ NSCameraUsageDescription
+ Used to scan QR codes to initiate money transfer
+ NSFaceIDUsageDescription
+ On user demand we use FaceID to unlock the app
UIApplicationSceneManifest
UIApplicationSupportsMultipleScenes