Flutter苹果账号安全登录插件apple_sign_in_safety的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter苹果账号安全登录插件apple_sign_in_safety的使用

Clarification

该插件是apple_sign_in插件的一个副本 - https://pub.dev/packages/apple_sign_in,已迁移到Null Safety Sound。

Apple Sign In - Flutter Plugin

通过Flutter访问Sign In with Apple

平台支持

此插件目前仅支持iOS。对于Android,有一个JavaScript框架

实现步骤

  1. 在Xcode中配置你的应用程序以添加“Sign In with Apple”功能。
  2. 参见示例应用了解API的工作原理。

常见问题解答 (FAQs)

用户信息在登录后为空

用户详细信息如电子邮件和名称仅在用户首次使用“Sign in With Apple”登录时提供。这不是插件的限制,而是原生SDK的功能。

再次登录时,所有属性均为null。你需要在第一次登录时存储它们。

为了测试目的,你可以撤销凭证以重新登录:

  1. 登录到https://appleid.apple.com/account/manage
  2. 转到“Apps & Websites Using Apple ID”并点击“Manage”。
  3. 选择你的应用程序。
  4. 点击“Stop Using Apple ID”。

尝试构建项目时出现错误

“Sign In with Apple”需要Xcode 11,因为它需要iOS 13 SDK。确保你是最新的。

待办事项

  • “Sign in with Flutter”按钮的本地化。
  • 一个适当的逐步示例。
  • 支持PasswordProvider

示例代码

以下是一个完整的Flutter应用程序示例,展示了如何使用apple_sign_in_safety插件实现Apple登录。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SignInPage(),
    );
  }
}

class SignInPage extends StatefulWidget {
  @override
  _SignInPageState createState() => _SignInPageState();
}

class _SignInPageState extends State<SignInPage> {
  bool _isAvailable = false;

  @override
  void initState() {
    super.initState();
    // 检查设备是否支持Apple登录
    AppleSignInSafety.isAvailable().then((available) {
      setState(() {
        _isAvailable = available;
      });
    });
  }

  Future<void> _signInWithApple() async {
    final result = await AppleSignInSafety.performRequests([
      AppleIdRequest(requestedScopes: [Scope.email, Scope.fullName])
    ]);

    switch (result.status) {
      case AuthorizationStatus.authorized:
        print('User is signed in!');
        print('User info: ${result.credential}');
        break;
      case AuthorizationStatus.error:
        print('Sign in failed: ${result.error.toString()}');
        break;
      case AuthorizationStatus.cancelled:
        print('User cancelled sign in.');
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Sign in with Apple')),
      body: Center(
        child: _isAvailable
            ? ElevatedButton(
                onPressed: _signInWithApple,
                child: Text('Sign in with Apple'),
              )
            : Text('Sign in with Apple is not available.'),
      ),
    );
  }
}

注意事项

  • 确保你的Xcode版本为11或更高,并且你的项目已正确配置了“Sign In with Apple”功能。
  • 在真实设备上进行测试,因为模拟器可能无法完全支持所有功能。
  • 记住保存用户首次登录时提供的信息(如电子邮件和全名),因为在后续登录中这些信息将不再可用。

更多关于Flutter苹果账号安全登录插件apple_sign_in_safety的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter苹果账号安全登录插件apple_sign_in_safety的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现苹果账号安全登录,可以使用apple_sign_in_safety插件。这个插件是对官方apple_sign_in插件的一个增强版本,提供了一些额外的安全措施。下面是一个基本的使用示例,展示如何在Flutter应用中集成apple_sign_in_safety插件。

首先,确保你的Flutter项目已经创建好,并且在pubspec.yaml文件中添加apple_sign_in_safety依赖:

dependencies:
  flutter:
    sdk: flutter
  apple_sign_in_safety: ^x.y.z  # 请替换为最新版本号

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

接下来,你需要配置iOS项目。打开ios/Runner/Info.plist文件,并添加以下配置来启用Apple Sign In:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>com.yourcompany.yourapp</string> <!-- 替换为你的应用标识符 -->
        </array>
    </dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>apple-id-auth</string>
</array>

然后,在ios/Runner/AppDelegate.swift中,添加对Apple Sign In回调的处理(如果你使用的是Objective-C,则需要相应地调整代码):

import UIKit
import Flutter
import apple_sign_in_safety  // 导入插件(注意:实际使用时可能不需要显式导入,这取决于插件的实现)

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  // 如果apple_sign_in_safety插件需要额外的iOS配置,可能会在这里添加代码
  // 但通常,Flutter插件会处理大部分配置工作
}

现在,在你的Flutter代码中,你可以这样使用apple_sign_in_safety插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Apple Sign In Safety Example'),
        ),
        body: Center(
          child: AppleSignInSafetyButton(
            onCompleted: (credential) async {
              // 用户成功登录后,这里会返回AppleCredential对象
              print('User ID: ${credential.user}');
              print('Email: ${credential.email}');
              // 你可以在这里将credential发送到你的服务器进行验证和注册/登录流程
            },
            onError: (error) {
              // 处理登录错误
              print('Sign in failed: ${error.message}');
            },
          ),
        ),
      ),
    );
  }
}

在这个示例中,AppleSignInSafetyButton是一个自定义的按钮组件(具体实现可能因插件版本而异,但通常插件会提供一个类似的组件),用户点击后会触发Apple Sign In流程。登录成功后,onCompleted回调会被调用,并返回一个包含用户信息和电子邮件的AppleCredential对象。如果登录失败,onError回调会被调用。

请注意,实际使用时,你需要根据你的应用需求来处理登录成功后的逻辑,比如将凭证发送到服务器进行进一步处理。此外,由于插件和Flutter框架可能会不断更新,因此建议查看插件的官方文档和示例代码以获取最新和最准确的信息。

回到顶部