在flutter项目中的iOS上使用Facebook错误登录

我用Facebook应用编写了一个不稳定的登录名。

它在Android上正常工作。 在iOS模拟器和真实的iPhone设备上,它不起作用。两者都拥有iOS 13.2。

pub spec.yaml文件

  firebase_auth: ^0.6.6
  flutter_facebook_login: ^1.1.1
  flutter_auth_buttons: ^0.3.1

main.dart文件

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_facebook_login/flutter_facebook_login.dart';
import 'package:flutter_auth_buttons/flutter_auth_buttons.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  FirebaseAuth _auth = FirebaseAuth.instance;
  bool isLogged = false;
  FirebaseUser myUser;

  Future<FirebaseUser> _loginWithFacebook() async {
    var facebookLogin = new FacebookLogin();
    var result = await facebookLogin.logInWithReadPermissions(['email']);
    debugPrint(result.status.toString());
    if (result.status == FacebookLoginStatus.loggedIn) {
      FirebaseUser user =
          await _auth.signInWithFacebook(accessToken: result.accessToken.token);
      return user;
    }
    return null;
  }

  void _login() {
    _loginWithFacebook().then((response) {
      if (response != null) {
        myUser = response;
        setState(() {
          isLogged = true;
        });
      }
    });
  }

  void _logout() async {
    await _auth.signOut().then((response) {
      setState(() {
        isLogged = false;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Login App',home: Scaffold(
        appBar: AppBar(
          title: Text(isLogged ? 'Profile Page' : 'Login App'),actions: <Widget>[
            IconButton(
              onpressed: _logout,icon: Icon(Icons.power_settings_new),)
          ],),body: Center(
          child: isLogged
              ? Column(
                  mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
                    Text('Name: ' + myUser.displayName),Image.network(myUser.photoUrl),],)
              : FacebookSignInButton(
                  onpressed: _login,);
  }
}

我在Xcode项目中正确添加了plist文件。并根据以下步骤正确配置了Facebook开发人员的iOS版本: https://developers.facebook.com/docs/facebook-login/ios

我在旧版构建和新构建系统之间更改了Xcode中的项目工作区设置。我仍然遇到错误。

我尝试将以下内容添加到pod文件中,但仍然出现错误

pod 'FBSDKCoreKit','~> 4.44'

这里甚至所有建议的解决方案 How to fix build error with FBSDKLoginKit in Xcode

我得到的错误是

No known class method for selector 'dictionary:setObject:forKey:'

我还尝试在发布规范文件中更改Firebase版本和Facebook Flutter登录版本(在1.1.1和1.2.0之间,因为我不想使用AndroidX),但仍然出现错误。

请注意,我已将Xcode更新到最新版本,并且错误没有得到解决。

我将所有pod的Xcode中的iOS部署版本更改为版本8。错误未修复!

english0335 回答:在flutter项目中的iOS上使用Facebook错误登录

有两个问题:

  1. Facebook Login API和Firebase之间的兼容性。
  2. iOS更新到版本13.x。

在pubspec.yaml文件中,firebase版本更新为最新版本。 另外,我正在使用1.2.0版进行Facebook登录,但仍然可以使用1.1.1版。

firebase_auth: ^0.14.0+5
flutter_facebook_login: ^1.2.0
flutter_auth_buttons: ^0.3.1

我用Xcode(位于flutter项目内的iOS文件夹中)打开Runner.xcworkspace,然后选择File-> WorkSpace设置,然后选择New Build System选项。

对于所有Pod,请将iOS部署版本更改为8.0(或更高版本)。

现在,应用程序可以成功构建并在iOS上运行。但是,每次我单击“使用Facebook登录”按钮时,都会得到CancelledByUser。

当iOS更新13.x运行Facebook登录api时,这是一个错误。 我找到了使登录有效的解决方法。

final facebookLogin = new FacebookLogin();
facebookLogin.loginBehavior = FacebookLoginBehavior.webViewOnly;
,

您可以直接使用我的功能,因为它适用于 android 和 iOS,并且还可以在 firebase 控制台中注册用户。

我只是在 WebView 中打开登录页面,当用户注册自己时,我将凭据存储在 firebase 中,然后打印他的名字。

 final FacebookLogin fblogin = FacebookLogin();
FirebaseAuth auth = FirebaseAuth.instance;
 
 Future loginwihFacebook() async {
   

fblogin.loginBehavior = FacebookLoginBehavior.webViewOnly;
final result = await fblogin.logInWithReadPermissions(["email"]);

switch (result.status) {
  case FacebookLoginStatus.loggedIn:
    final token = result.accessToken.token;
    await auth.signInWithCredential(FacebookAuthProvider.credential(token));

    var url =
        'https://graph.facebook.com/v2.12/me?fields=name,first_name,picture,last_name,email&access_token=$token';
    var graphapiresponse = await http.get(url);
    var profileData = jsonDecode(graphapiresponse.body);      
    var name = profileData["name"];
    print(name);
    break;
  case FacebookLoginStatus.cancelledByUser:
    print("cancelled by user");
    break;
  case FacebookLoginStatus.error:
    print("error");
    break;
}


 }
本文链接:https://www.f2er.com/3124376.html

大家都在问