Flutter Line登录认证插件line_login_sdk的使用

Flutter Line登录认证插件line_login_sdk的使用

flutter_line_sdk

build

一个允许开发者在Flutter应用中通过Dart访问LINE原生SDK的Flutter插件。

该插件可以帮助你在应用中集成LINE登录功能。你可以将用户重定向到LINE或网页,以使用其LINE凭据进行登录。例如:

import 'package:flutter_line_sdk/flutter_line_sdk.dart';

void login() async {
    try {
        final result = await LineSDK.instance.login();
        setState(() {
            _userProfile = result.userProfile;
            // 用户ID -> result.userProfile?.userId
            // 用户名 -> result.userProfile?.displayName
            // 用户头像 -> result.userProfile?.pictureUrl
            // 等等...
        });
    } on PlatformException catch (e) {
        // 错误处理。
        print(e);
    }
}

更多示例,请查看示例应用API定义


前置条件

从版本2.0开始,flutter_line_sdk支持Dart的空安全。如果你仍在寻找不带空安全的旧版本,请查看版本1.3.0

要从移动平台访问你的LINE登录通道,你需要一些额外的配置。在LINDE开发者控制台中,进入你的LINE登录通道设置,并在应用设置选项卡中输入以下信息。

iOS应用设置

设置项 描述
iOS Bundle ID 必填。应用的Bundle标识符。在Xcode中,可以在Runner项目设置的常规标签页中找到它。必须为小写,如com.example.app。可以指定多个Bundle标识符,每个标识符占一行。
iOS Universal Link 可选。设置为配置好的应用的Universal Link。有关如何使用Universal Link处理登录流程的更多信息,请参阅Universal Links支持

Android应用设置

设置项 描述
Android包名 必填。用于启动Google Play商店的应用包名。
Android包签名 可选。可以通过每行输入一个签名来设置多个签名。
Android Scheme 可选。用于启动应用的自定义URL Scheme。

安装

添加flutter_line_sdk包

使用标准方式将此包添加到你的Flutter应用中,如Flutter文档所述。该过程包括以下步骤:

  1. 打开应用文件夹中的pubspec.yaml文件,在dependencies下添加flutter_line_sdk:
  2. 在终端运行以下命令以安装它:flutter pub get

现在,flutter_line_sdk的Dart部分应该已经安装完成。接下来,你需要分别为iOS和Android项目设置LINE SDK。

设置LINE SDK

iOS

在文本编辑器中打开ios/Runner/Info.plist文件,并在其最后的</dict>标签之前插入以下片段:

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <!-- 指定返回LINE时使用的URL Scheme -->
      <string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    </array>
  </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
  <!-- 指定启动LINE时使用的URL Scheme -->
  <string>lineauth2</string>
</array>

由于LINE SDK现在需要iOS 13.0或更高版本来提供底层原生功能,因此你必须在ios/Podfile文件的Runner目标中添加以下行:

target 'Runner' do
+ platform :ios, '13.0'

  use_frameworks!
  use_modular_headers!
  ...

Android

为了确保与最新功能兼容,你需要将应用的build.gradle文件中的minSdk版本更新为24或更高。

以下是具体步骤:

  1. 打开应用的build.gradle文件。
  2. 定位到android块,并在其内部找到defaultConfig块。
  3. defaultConfig块中,将当前的minSdk值替换为24

以下是更改后的差异示例:

android {
    defaultConfig {
-        minSdk flutter.minSdkVersion
+        minSdk 24
    }
}

导入和使用

设置

在项目中任何需要使用的地方导入flutter_line_sdk

import 'package:flutter_line_sdk/flutter_line_sdk.dart';

要使用该包,你需要设置频道ID。你可以通过调用setup方法来完成此操作,例如在main函数中:

- void main() => runApp(MyApp());
+ void main() {
+   WidgetsFlutterBinding.ensureInitialized();
+   LineSDK.instance.setup("${your_channel_id}").then((_) {
+     print("LineSDK Prepared");
+   });
+   runApp(App());
+ }

这只是示例。你可以在任何时候调用setup,但必须确保只调用一次,并且在调用任何其他LINE SDK方法之前调用。

为了帮助你快速上手,我们列出了几个基本用法示例。所有可用的flutter_line_sdk方法都在Dart Packages站点上有详细说明。

登录

现在你可以让用户通过LINE登录了。

通过将Future<LoginResult>的值赋给变量来获取登录结果。 为了优雅地处理错误,请将其包装在一个try...on语句中:

void _signIn() async {
  try {
    final result = await LineSDK.instance.login();
    // 用户ID -> result.userProfile?.userId
    // 用户名 -> result.userProfile?.displayName
    // 用户头像 -> result.userProfile?.pictureUrl
  } on PlatformException catch (e) {
    _showDialog(context, e.toString());
  }
}

默认情况下,login使用["profile"]作为其范围。在这种情况下,登录完成后,result中会有一个userProfile值。 如果需要其他范围,请将它们作为列表传递给login。更多内容请参见范围文档

final result = await LineSDK.instance.login(
    scopes: ["profile", "openid", "email"]
);
// 用户邮箱,如果用户在LINE中设置了邮箱并授予了你的请求。
final userEmail = result.accessToken.email;

注意:虽然可能无用,但如果未包含"profile"范围,则userProfile将是null

注销

try {
  await LineSDK.instance.logout();
} on PlatformException catch (e) {
  print(e.message);
}

获取用户资料

try {
  final result = await LineSDK.instance.getProfile();
  // 用户ID -> result.userId
  // 用户名 -> result.displayName
  // 用户头像 -> result.pictureUrl
} on PlatformException catch (e) {
  print(e.message);
}

获取当前存储的访问令牌

try {
  final result = await LineSDK.instance.currentAccessToken;
  // 访问令牌 -> result?.value
} on PlatformException catch (e) {
  print(e.message);
}

注意:如果用户未登录,它将返回null。此方法的有效result并不一定意味着访问令牌本身有效。它可能已过期或被用户从另一台设备或LINE客户端撤销。

使用LINE服务器验证访问令牌

try {
  final result = await LineSDK.instance.verifyAccessToken();
  // 如果令牌有效,result.data是可访问的。
} on PlatformException catch (e) {
  print(e.message);
  // 令牌无效,或其他错误。
}

刷新当前访问令牌

try {
  final result = await LineSDK.instance.refreshToken();
  // 访问令牌 -> result.value
  // 过期时间 -> result.expiresIn
} on PlatformException catch (e) {
  print(e.message);
}

通常情况下,你不需要手动刷新访问令牌,因为LINE SDK会在必要时自动尝试刷新访问令牌。我们不建议手动刷新访问令牌。让LINE SDK自动管理访问令牌通常更简单、更安全、更具未来性。


错误处理

所有API都可以抛出带有codemessagePlatformException。使用这些信息来识别原生SDK内部发生的错误。

错误代码和消息在iOS和Android之间可能会有所不同。请务必阅读iOS的错误定义和Android的错误定义,以便在不同平台上提供更好的错误恢复和用户体验。


贡献

如果你认为发现了一个漏洞或有与安全相关的任何问题,请不要公开发布问题。而是发送电子邮件至dl_oss_dev@linecorp.com

在为本项目做出贡献之前,请阅读CONTRIBUTING.md


示例代码

以下是完整的示例代码:

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  LineSDK.instance.setup('1620019587').then((_) {
    print('LineSDK Prepared');
  });
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('LINE Login Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                final result = await LineSDK.instance.login();
                print('User Profile: ${result.userProfile}');
              } on PlatformException catch (e) {
                print('Error: ${e.message}');
              }
            },
            child: Text('Login with LINE'),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter中使用line_login_sdk插件进行Line登录认证的步骤如下:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  line_login_sdk: ^2.0.0  # 请使用最新版本

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

2. 配置Line开发者账号

在使用Line登录之前,你需要注册一个Line开发者账号并创建一个应用以获取Channel ID

  1. 访问 Line Developers 并登录。
  2. 创建一个新的Provider(如果你还没有)。
  3. 创建一个新的Channel(应用),选择Login类型。
  4. 获取Channel ID,并配置回调URL。

3. 配置Android项目

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <application
        android:label="YourApp"
        android:icon="@mipmap/ic_launcher">
        
        <!-- Add this activity for Line Login -->
        <activity
            android:name="com.linecorp.linesdk.auth.LineAuthenticationActivity"
            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="line3rdp.com.example.yourapp" />
            </intent-filter>
        </activity>
    </application>
</manifest>

line3rdp.com.example.yourapp替换为你的应用包名。

4. 配置iOS项目

ios/Runner/Info.plist文件中添加以下配置:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string>
        </array>
    </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>lineauth2</string>
</array>

5. 初始化Line登录SDK

在你的Flutter项目中初始化Line登录SDK:

import 'package:line_login_sdk/line_login_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化Line登录SDK
  await LineLoginSdk.instance.initialize(
    channelId: 'YOUR_CHANNEL_ID',
  );

  runApp(MyApp());
}

6. 实现Line登录

在你的应用界面中,添加一个按钮并实现Line登录逻辑:

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

class LoginPage extends StatelessWidget {
  Future<void> _loginWithLine() async {
    try {
      final result = await LineLoginSdk.instance.login();
      if (result.isSuccess) {
        // 登录成功
        final accessToken = result.accessToken;
        final userProfile = result.userProfile;
        print('登录成功: $userProfile');
      } else {
        // 登录失败
        print('登录失败: ${result.errorMessage}');
      }
    } catch (e) {
      print('登录异常: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Line登录'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _loginWithLine,
          child: Text('使用Line登录'),
        ),
      ),
    );
  }
}

7. 处理登出

你可以使用以下代码来处理用户登出:

Future<void> _logoutFromLine() async {
  try {
    await LineLoginSdk.instance.logout();
    print('登出成功');
  } catch (e) {
    print('登出异常: $e');
  }
}

8. 获取用户信息

登录成功后,你可以通过result.userProfile获取用户信息,例如:

final userProfile = result.userProfile;
print('用户ID: ${userProfile.userId}');
print('用户姓名: ${userProfile.displayName}');
print('用户头像: ${userProfile.pictureUrl}');
print('用户状态: ${userProfile.statusMessage}');
回到顶部