在flutter项目中在iOS上登录facebook错误

Edd*_*dyG 3 xcode facebook ios flutter

我用facebook应用程序写了一个flutter登录。

它在 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
Run Code Online (Sandbox Code Playgroud)

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,
                ),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

pod 'FBSDKCoreKit', '~> 4.44'
Run Code Online (Sandbox Code Playgroud)

甚至这里所有建议的解决方案 如何在 Xcode 中使用 FBSDKLoginKit 修复构建错误

我得到的错误是

No known class method for selector 'dictionary:setObject:forKey:'
Run Code Online (Sandbox Code Playgroud)

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

请注意,我将 Xcode 更新到最新版本,但错误并未修复。

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

Edd*_*dyG 5

更新(2020 年 7 月)

您可以使用适用于 Android 和 iOS 的新软件包: flutter_login_facebook

如果你想使用flutter_facebook_login,下面是一个解决方案:

更新(2020 年 4 月)

  1. 添加flutter_facbook_login从3.0.0版本开始,pub.dev你扑项目
  2. Facebook 开发人员上创建您的应用程序并相应地配置您的 Flutter 应用程序
  3. 在 Xcode 中将您的 iOS 目标版本更改为 9
  4. 在终端中打开Podfile.lock位于 Flutter 项目的 iOS 文件夹中,并将所有 facebook api 版本更改为 5.8.0。如果Podfile.lock不存在,请运行您的应用程序一次(因此该文件已创建),并在触发错误编辑Podfile.lock后再次运行它。如果您的应用程序仍然失败,请pod install从终端手动运行。

有两个问题:

  1. Facebook 登录 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是运行 facebook 登录 api 的 iOS 更新 13.x 时的错误。我发现了一个使登录工作的周转。

final facebookLogin = new FacebookLogin();
facebookLogin.loginBehavior = FacebookLoginBehavior.webViewOnly;
Run Code Online (Sandbox Code Playgroud)