"Произошла ошибка при доступе к связке ключей"
Я использую плагин Firebase Auth для Flutter, чтобы войти в систему с помощью Google в своем приложении, и он отлично работает как на iOS, так и на Android.
Моя проблема начинается, когда я пытаюсь использовать Firebase Auth в моем iOS "Share Extension". Я новичок в iOS, поэтому я не очень хорошо знаком со Swift и Xcode, но, насколько я понимаю, я должен включить кросс-прикладную аутентификацию с помощью общей цепочки ключей iOS, чтобы аутентифицировать пользователя в моем общем расширении.
У меня есть 2 цели в моем проекте, "Runner" и "Share Extension", поэтому я включил Keychain Sharing для них обоих:
Когда совместное использование связки ключей включено, я получаю следующую ошибку, когда пытаюсь войти в систему с помощью Firebase Auth:
Unhandled Exception: PlatformException(ERROR_KEYCHAIN_ERROR, An error occurred when accessing the keychain. The @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo dictionary will contain more information about the error encountered, null)
#0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
#1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:321:33)
<asynchronous suspension>
#2 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:349:48)
#3 MethodChannelFirebaseAuth.signInWithCredential (package:firebase_auth_platform_interface/src/method_channel_firebase_auth.dart:161:23)
#4 FirebaseAuth.signInWithCredential (package:firebase_auth/src/firebase_auth.dart:208:10)
#5 signInWithGoogle (package:matkonit/google_sign_in.dart:17:45)
<asynchronous suspension>
#6 LoginPageState.signInButton.<anonymous closure>.<anonymous clo<…>
Вот что я получаю, когда печатаю NSLocalizedFailureReasonErrorKey:
SecItemCopyMatching (-34018)
Что я могу сделать, чтобы это исправить?
Изменить: я заметил, что перезапуск симулятора заставляет войти в систему, но только иногда... Я не мог понять, почему.
2 ответа
Я не добавлял префикс Team ID перед своим App ID, поэтому это не сработало. Для этого вам потребуется учетная запись разработчика Apple и идентификатор группы, например:
Auth.auth().useUserAccessGroup("XK********.com.matkonit.SharedItems")
У меня это сработало, когда я установил «Apple Development» как CODE_SIGN_IDENTITY и выбрал свою личную учетную запись как DEVELOPMENT_TEAM.
Я также добавил это в DebugProfile.entitlements:
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)com.example</string>
</array>
Где «com.example» — это идентификатор пакета.
У меня есть бесплатная учетная запись разработчика, поэтому я использую этот пример с профилем отладки, но считаю, что это необходимо и при использовании профиля выпуска.