Поделиться аутентификацией firebase со встроенным модулем Flutter - PullRequest
1 голос
/ 30 января 2020

У меня есть собственное приложение iOS с аутентификацией Firebase, и я также встроил в него модуль флаттера (следуя этой инструкции https://flutter.dev/docs/development/add-to-app/ios/project-setup и CocoaPods)

Я хочу использовать Firebase внутри Flutter модуль, а также внутри родной части. Как мне решить эту проблему?

Один из способов - добавить все необходимые библиотеки Firebase в модуль Flutter. В этом случае я получу 2 проблемы

  1. дублирование кода
  2. Я до сих пор не знаю, как разделить аутентификацию firebase между приложением и модулем

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Насколько я понимаю, вы должны быть в состоянии помочь себе, используя каналы платформы .

Основываясь на нашем опыте работы со встроенными представлениями Flutter, мы передаем токены аутентификации. через каналы платформы с помощью MethodChannel.

Учитывая, что вы используете Add-to-App от Flutter, я предполагаю, что у вас уже есть работающее приложение в нативном коде. В этом случае вы должны иметь возможность аутентифицировать пользователя, используя Firebase Auth для стороны Android и iOS, отдельно .

Например:

Предполагая что вы используете Kotlin, вот как вы передаете токен Dart после аутентификации пользователя с использованием кода Android.

firebase_login.kt

// Method to authenticate your user in Android
fun firebaseLogin() {
    ... 
    // Some callbacks from the Android side
    this.authenticateUserInFlutter("someTokenFromFirebase")
}

// @param token Can also be in a form of JSON object
func authenticateUserInFlutter(token: String) {
    val methodName = "authenticateUser"
    channel.invokeMethod(methodName, token, object: MethodChannel.Result {
        override fun success(result: Any?) {
            Log.i("MSG", "$result")
        }
        override fun error(code: String?, msg: String?, details: Any?) {
            Log.e("MSG", "$methodName failed: $msg")
        }
        override fun notImplemented() {
            Log.e("MSG", "$methodName not implemented")
        }
    })
}

И если вы используете Swift для iOS части.

FirebaseLogin.swift

func firebaseLogin() {
    ... 
    // Some callbacks from the iOS side
    self.authenticateUserInFlutter("someTokenFromFirebase")
}

fun authenticateUserInFlutter(token: String) {
    let methodName = "authenticateUser"
    channel.invokeMethod(methodName, arguments: value) {
    (result: Any?) -> Void in
        if let error = result as? FlutterError {
            os_log("%@ failed: %@", type: .error, methodName, error.message!)
        } else if FlutterMethodNotImplemented.isEqual(result) {
            os_log("%@ not implemented", type: .error, methodName)
        } else {
            os_log("%@", type: .info, result as! NSObject)
        }
    }
}

Наконец, вы сможете захватить существующие токены входа из родная сторона в вашем коде Dart. Вы можете использовать его для аутентификации вашего пользователя, используя firebase_auth для Flutter.

my_platform_channels_handler.dart

channel.setMethodCallHandler((MethodCall call) async {
    switch (call.method) {
    case 'authenticateUser':
        val token = "${call.arguments}"; // You can also receive JSON arguments here

        // Start authenticating the user
        final AuthCredential credential = GoogleAuthProvider.getCredential(
            accessToken: token,
            idToken: ...,
        );
        final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;

        // Be able to reply to catch the errors here
        return null;
    case 'someMethodFromNative':
        print("someMethodFromNative method invoked from the native code!")
        return null;
    default:
        throw MissingPluginException();
    }
});

ПРИМЕЧАНИЕ. Вы должны иметь возможность Храните токены на обоих концах и управляйте ими должным образом, как в собственном, так и в Dart, так что взаимодействие с пользователем будет беспроблемным, когда пользователь переключается между нативным и встроенным представлениями Flutter. 1041 * Подробнее о:

1 голос
/ 03 февраля 2020

Я не могу гарантировать это, так как сам не пробовал, но у вас не должно возникнуть проблем с добавлением зависимостей как во Flutter, так и в собственный код.

  1. Пакет Flutter Firebase зависит от собственного пакета Firebase, так что вы можете подумать, что один и тот же пакет импортируется дважды, что приводит к раздуванию кода, но обычно это не так. Инструменты сборки отвечают за анализ деревьев зависимостей и их сортировку. При этом, возможно, вы захотите убедиться, что вы используете одну и ту же версию библиотеки как для Flutter, так и для нативной стороны.
  2. В пакете аутентификации Flutter Firebase есть поток, который вы можете использовать для хранения это в син c с родной стороны: FirebaseAuth.instance.onAuthStateChanged. Если вы не настроили создание экземпляра FirebaseApp, используемого Firebase Auth, то и Flutter, и нативная сторона фактически указывают на один и тот же экземпляр нативного FirebaseApp, так что если вы, например,. войдите в систему, используя либо упомянутый выше поток, либо FirebaseAuth.instance.currentUser(), чтобы отобразить зарегистрированного пользователя во Flutter.
...