在flutter项目中,在iOS上登录时出现facebook错误



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

它在安卓系统上运行正常。在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'

甚至这里提出的所有解决方案如何修复Xcode 中FBSDKLoginKit的构建错误

我得到的错误是

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

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

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

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

更新(2020年7月(

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

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

更新(2020年4月(

  1. 将pub.dev中的flatter_facbook_login 3.0.0版本添加到您的flutter项目中
  2. 在Facebook开发人员上创建你的应用程序,并相应地配置你的flutter应用程序
  3. 在Xcode中将您的iOS目标版本更改为9
  4. 在终端中打开位于flutter项目iOS文件夹中的Podfile.lock,并将所有facebookapi版本更改为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

我在Xcode中打开了Runner.xcworkspace(位于flutter项目中的iOS文件夹中(,然后打开了File->WorkSpace设置,并选择"新建生成系统"选项。

对于所有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;
}

}

最新更新