Flutter钥匙串管理插件apple_keychain的使用

Flutter钥匙串管理插件apple_keychain的使用

一个用于在iOS上安全存储和检索数据的Flutter插件。它还允许使用相同的app组标识符在多个应用之间共享数据。

特性

  • 在iOS钥匙串中安全地存储数据。
  • 从钥匙串中检索已存储的数据。
  • 使用共同的app组标识符在多个应用之间共享数据。

使用

要使用此插件,在pubspec.yaml文件中添加apple_keychain作为依赖项:

dependencies:
  apple_keychain: ^1.0.0

然后,在Dart代码中导入库:

import 'package:apple_keychain/apple_keychain.dart';

存储数据

要在钥匙串中存储数据,使用write方法:

// 定义键和值
String key = 'myKey';
String value = 'myValue';

// 将数据写入钥匙串
await AppleKeychain.write(key: key, value: value);

检索数据

要从钥匙串中检索数据,使用read方法:

// 定义键
String key = 'myKey';

// 从钥匙串中读取数据
String value = await AppleKeychain.read(key: key);

在应用之间共享数据

要在多个应用之间共享数据(使用相同的app组标识符),在读取或写入数据时设置accessGroup参数:

// 定义键、值和访问组
String key = 'myKey';
String value = 'myValue';
String accessGroup = 'com.example.appgroup';

// 将数据写入钥匙串并指定访问组
await AppleKeychain.write(key: key, value: value, accessGroup: accessGroup);

// 从钥匙串中读取共享数据并指定访问组
String sharedValue = await AppleKeychain.read(key: key, accessGroup: accessGroup);

确保在Xcode项目设置中配置适当的app组标识符。

对于更多详细的使用示例,请参阅示例

问题与贡献

如遇到任何问题或错误,请在GitHub仓库上创建一个问题。欢迎贡献!

许可证

该插件根据MIT许可证发布。


以下是完整的示例代码:

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

import 'package:flutter/services.dart';
import 'package:apple_keychain/apple_keychain.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _appleKeychainPlugin = AppleKeychain();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息异步,因此我们在异步方法中初始化
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能失败,因此我们使用try/catch处理PlatformException
    // 我们还处理消息可能返回null的情况
    try {
      platformVersion = await _appleKeychainPlugin.getPlatformVersion() ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // 如果小部件在异步平台消息仍在飞行时被树移除,则我们想要丢弃回复而不是调用setState来更新我们的非存在的外观
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Text('运行于: $_platformVersion\n'),
        ),
      ),
    );
  }
}

更多关于Flutter钥匙串管理插件apple_keychain的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter钥匙串管理插件apple_keychain的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,如果你需要在 iOS 设备上安全地存储敏感信息(如密码、令牌等),可以使用 apple_keychain 插件。这个插件提供了对 iOS 钥匙串(Keychain)的访问,钥匙串是 iOS 提供的一种安全存储机制,用于存储敏感信息。

安装 apple_keychain 插件

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

dependencies:
  flutter:
    sdk: flutter
  apple_keychain: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装插件。

使用 apple_keychain 插件

以下是一些基本的使用示例,展示了如何使用 apple_keychain 插件来存储、读取和删除钥匙串中的信息。

1. 存储数据到钥匙串

import 'package:apple_keychain/apple_keychain.dart';

void storeData() async {
  final keychain = AppleKeychain();
  const key = 'my_secret_key';
  const value = 'my_secret_value';

  try {
    await keychain.save(key: key, value: value);
    print('Data stored successfully');
  } catch (e) {
    print('Failed to store data: $e');
  }
}

2. 从钥匙串读取数据

import 'package:apple_keychain/apple_keychain.dart';

void readData() async {
  final keychain = AppleKeychain();
  const key = 'my_secret_key';

  try {
    final value = await keychain.read(key: key);
    print('Read data: $value');
  } catch (e) {
    print('Failed to read data: $e');
  }
}

3. 从钥匙串删除数据

import 'package:apple_keychain/apple_keychain.dart';

void deleteData() async {
  final keychain = AppleKeychain();
  const key = 'my_secret_key';

  try {
    await keychain.delete(key: key);
    print('Data deleted successfully');
  } catch (e) {
    print('Failed to delete data: $e');
  }
}

注意事项

  1. 安全性:钥匙串是 iOS 提供的一种安全存储机制,适合存储敏感信息。但是,开发者仍需谨慎处理敏感数据,避免泄露。

  2. 平台限制apple_keychain 插件仅适用于 iOS 平台。如果你需要在 Android 上实现类似的功能,可以使用其他插件,如 flutter_secure_storage

  3. 错误处理:在使用钥匙串时,可能会遇到各种错误(如钥匙串访问失败、数据不存在等),因此建议在使用时添加适当的错误处理逻辑。

示例完整代码

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

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

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

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

class _KeychainExampleState extends State<KeychainExample> {
  final keychain = AppleKeychain();
  final TextEditingController _keyController = TextEditingController();
  final TextEditingController _valueController = TextEditingController();

  void _storeData() async {
    final key = _keyController.text;
    final value = _valueController.text;

    if (key.isEmpty || value.isEmpty) {
      print('Key and value cannot be empty');
      return;
    }

    try {
      await keychain.save(key: key, value: value);
      print('Data stored successfully');
    } catch (e) {
      print('Failed to store data: $e');
    }
  }

  void _readData() async {
    final key = _keyController.text;

    if (key.isEmpty) {
      print('Key cannot be empty');
      return;
    }

    try {
      final value = await keychain.read(key: key);
      print('Read data: $value');
    } catch (e) {
      print('Failed to read data: $e');
    }
  }

  void _deleteData() async {
    final key = _keyController.text;

    if (key.isEmpty) {
      print('Key cannot be empty');
      return;
    }

    try {
      await keychain.delete(key: key);
      print('Data deleted successfully');
    } catch (e) {
      print('Failed to delete data: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Keychain Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _keyController,
              decoration: InputDecoration(labelText: 'Key'),
            ),
            TextField(
              controller: _valueController,
              decoration: InputDecoration(labelText: 'Value'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _storeData,
              child: Text('Store Data'),
            ),
            ElevatedButton(
              onPressed: _readData,
              child: Text('Read Data'),
            ),
            ElevatedButton(
              onPressed: _deleteData,
              child: Text('Delete Data'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部