Flutter Facebook登录插件meta_facebook_login的使用

Flutter Facebook 登录插件 meta_facebook_login 的使用

meta_facebook_login

pub package Build Status Coverage Status

一个用于在 Android 和 iOS 上使用原生 Facebook 登录 SDK 的 Flutter 插件。

AndroidX 支持

  • 如果你想要 避免使用 AndroidX,请使用版本 1.2.0。
  • 对于 使用 AndroidX 的 Flutter 项目,请使用版本 2.0.0 及以上。

安装

为了使一切正常运行,你需要在你的 Flutter 项目中声明 pubspec 依赖。还需要进行一些 Android 和 iOS 特定的配置,否则你的应用可能会崩溃。

在你的 Flutter 项目中

参见 安装说明

Android

这假定你已经在 “将包名称和默认类与您的应用关联”“为您的应用提供开发和发布密钥哈希” 中完成了操作,这些步骤可以在 Android Facebook 登录文档 中找到。

完成上述步骤后,找出你的 Facebook 应用 ID。你可以在 Facebook 开发者控制台中的 Facebook 应用仪表板里找到你的 Facebook 应用 ID。

一旦你找到了 Facebook 应用 ID,你需要做两件事:

首先,将以下内容复制粘贴到你的字符串资源文件中。如果你还没有创建该文件,请创建它。

路径:<你的项目根目录>/android/app/src/main/res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">你的应用名称。</string>

    <!-- 替换 "000000000000" 为你的 Facebook 应用 ID。 -->
    <string name="facebook_app_id">000000000000</string>

    <!--
      替换 "000000000000" 为你的 Facebook 应用 ID。
      **注意**:方案需要以 `fb` 开头,然后是你的 ID。
    -->
    <string name="fb_login_protocol_scheme">fb000000000000</string>
</resources>

然后,将以下内容复制粘贴到你的 Android Manifest 文件中:

路径:<你的项目根目录>/android/app/src/main/AndroidManifest.xml

<meta-data android:name="com.facebook.sdk.ApplicationId"
    android:value="@string/facebook_app_id"/>

<activity android:name="com.facebook.FacebookActivity"
    android:configChanges=
            "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:label="@string/app_name" />

<activity
    android:name="com.facebook.CustomTabActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="@string/fb_login_protocol_scheme" />
    </intent-filter>
</activity>

一个完整的 AndroidManifest 文件样本可以在这里找到:此处

完成!

iOS

这假定你已经在 “注册并配置您的应用与 Facebook” 步骤中完成了操作,该步骤可以在 iOS Facebook 登录文档 中找到。 (注意:你可以跳过 “步骤 2:设置您的开发环境” 和 “步骤 5:连接您的应用代理”)。

完成上述步骤后,找出你的 Facebook 应用 ID。你可以在 Facebook 开发者控制台中的 Facebook 应用仪表板里找到你的 Facebook 应用 ID。

一旦你找到了 Facebook 应用 ID,那么你只需要将以下内容复制粘贴到你的 Info.plist 文件中,在结束标签 <\/dict><\/plist> 之前。

注意:如果你正在使用此插件与例如 google_sign_in 插件结合使用,后者也需要你在 Info.plist 文件中添加 CFBundleURLTypes 键,你需要将它们合并在一起)。

路径:<你的项目根目录>/ios/Runner/Info.plist

<key>CFBundleURLTypes</key>
<array>
    <!--
    <dict>
    ... 一些其他的 CFBundleURLTypes 定义。
    </dict>
    -->
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <!--
              替换 "000000000000" 为你的 Facebook 应用 ID。
              **注意**:方案需要以 `fb` 开头,然后是你的 ID。
            -->
            <string>fb000000000000</string>
        </array>
    </dict>
</array>

<key>FacebookAppID</key>

<!-- 替换 "000000000000" 为你的 Facebook 应用 ID。 -->
<string>000000000000</string>
<key>FacebookDisplayName</key>

<!-- 替换 "YOUR_APP_NAME" 为你的 Facebook 应用名称。 -->
<string>YOUR_APP_NAME</string>

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-share-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>

一个完整的 Info.plist 文件样本可以在这里找到:此处

完成!

如何使用它?

库尽可能地匹配原生 Android 和 iOS 登录 SDK 的 API。完整的 API 文档可以在 源代码 中查看。所有内容都有文档记录。

由于示例代码比一页文档更有价值,这里涵盖了通常的情况:

import 'package:meta_facebook_login/meta_facebook_login.dart';

final facebookLogin = FacebookLogin();
final result = await facebookLogin.logIn(['email']);

switch (result.status) {
  case FacebookLoginStatus.loggedIn:
    _sendTokenToServer(result.accessToken.token);
    _showLoggedInUI();
    break;
  case FacebookLoginStatus.cancelledByUser:
    _showCancelledMessage();
    break;
  case FacebookLoginStatus.error:
    _showErrorOnUI(result.errorMessage);
    break;
}

你也可以改变登录对话框的视觉外观。例如:

// 让用户通过基于 WebViews 的登录对话框登录。耶!
facebookLogin.loginBehavior = FacebookLoginBehavior.webViewOnly;

完整的 API 文档与源代码一起存在,可以在这里找到:此处

获取已登录用户的 Facebook 个人资料

目前,这个功能不会集成到此插件中。参见 讨论

然而,你可以通过四行 Dart 代码实现:

final result = await facebookSignIn.logIn(['email']);
final token = result.accessToken.token;
final graphResponse = await http.get(
            'https://graph.facebook.com/v2.12/me?fields=name,first_name,last_name,email&access_token=${token}');
final profile = JSON.decode(graphResponse.body);

变量 profile 现在将包含以下信息:

{
   "name": "Iiro Krankka",
   "first_name": "Iiro",
   "last_name": "Krankka",
   "email": "iiro.krankka\u0040gmail.com",
   "id": "<user id here>"
}

排错

如果你没有在 Flutter 项目中完成 AndroidX 设置,你的项目可能无法构建。简单的解决方法是在你的 android/gradle.properties 文件中添加两行:

android.useAndroidX=true
android.enableJetifier=true

更多关于Flutter Facebook登录插件meta_facebook_login的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Facebook登录插件meta_facebook_login的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


meta_facebook_login 是一个用于在 Flutter 应用中实现 Facebook 登录的插件。它允许用户通过 Facebook 账户进行身份验证,并获取用户的个人信息和访问令牌。

以下是如何在 Flutter 项目中使用 meta_facebook_login 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 meta_facebook_login 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  meta_facebook_login: ^12.0.0

然后运行 flutter pub get 来安装依赖。

2. 配置 Facebook 开发者平台

在 Facebook 开发者平台上创建一个应用,并获取 App IDApp Secret。然后按照以下步骤进行配置:

  • 在 Facebook 开发者平台中,进入你的应用设置。
  • 在 “Settings” > “Basic” 中,找到 App IDApp Secret
  • 在 “Products” 中添加 “Facebook Login” 产品。
  • 在 “Valid OAuth Redirect URIs” 中添加 https://www.facebook.com/connect/login_success.html

3. 配置 Android 和 iOS 项目

Android 配置

android/app/src/main/AndroidManifest.xml 文件中添加以下内容:

<application
    ...>
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/facebook_app_id"/>
    <activity
        android:name="com.facebook.FacebookActivity"
        android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
        android:label="@string/app_name" />
    <activity
        android:name="com.facebook.CustomTabActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="@string/fb_login_protocol_scheme" />
        </intent-filter>
    </activity>
</application>

android/app/src/main/res/values/strings.xml 文件中添加:

<string name="facebook_app_id">YOUR_FACEBOOK_APP_ID</string>
<string name="fb_login_protocol_scheme">fbYOUR_FACEBOOK_APP_ID</string>

iOS 配置

ios/Runner/Info.plist 文件中添加以下内容:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fbYOUR_FACEBOOK_APP_ID</string>
        </array>
    </dict>
</array>
<key>FacebookAppID</key>
<string>YOUR_FACEBOOK_APP_ID</string>
<key>FacebookDisplayName</key>
<string>YOUR_APP_NAME</string>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-share-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>

4. 实现 Facebook 登录

在 Flutter 项目中实现 Facebook 登录的代码示例如下:

import 'package:flutter/material.dart';
import 'package:meta_facebook_login/meta_facebook_login.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FacebookLoginDemo(),
    );
  }
}

class FacebookLoginDemo extends StatefulWidget {
  [@override](/user/override)
  _FacebookLoginDemoState createState() => _FacebookLoginDemoState();
}

class _FacebookLoginDemoState extends State<FacebookLoginDemo> {
  final MetaFacebookLogin facebookLogin = MetaFacebookLogin();
  String _message = 'Logged out';

  Future<void> _login() async {
    final LoginResult result = await facebookLogin.logIn(permissions: [
      MetaFacebookPermission.email,
      MetaFacebookPermission.publicProfile,
    ]);

    switch (result.status) {
      case MetaFacebookLoginStatus.success:
        final AccessToken accessToken = result.accessToken!;
        setState(() {
          _message = 'Logged in with token: ${accessToken.token}';
        });
        break;
      case MetaFacebookLoginStatus.cancelled:
        setState(() {
          _message = 'Login cancelled';
        });
        break;
      case MetaFacebookLoginStatus.error:
        setState(() {
          _message = 'Login error: ${result.errorMessage}';
        });
        break;
    }
  }

  Future<void> _logout() async {
    await facebookLogin.logOut();
    setState(() {
      _message = 'Logged out';
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Facebook Login Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_message),
            ElevatedButton(
              onPressed: _login,
              child: Text('Login with Facebook'),
            ),
            ElevatedButton(
              onPressed: _logout,
              child: Text('Logout'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部