Flutter苹果钱包集成插件apple_passkit的使用

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

Flutter苹果钱包集成插件apple_passkit的使用

Apple PassKit

pub package likes popularity pub points

Twitter Follow GitHub followers Bluesky Follow GitHub Sponsors

这是一个Flutter绑定,用于Apple的PassKit。该库允许你向用户的Wallet添加PkPass文件,并读取用户Wallet中可用的PkPass文件。

如果你需要在代码中处理PkPass文件,可以考虑使用passkitpasskit_ui,它们不依赖于iOS/macOS,且大部分是跨平台的。

什么是PassKit?

Passes 是信息的一种数字表示形式,这些信息可能会打印在小纸片或塑料卡片上。它们让用户可以在物理世界中采取行动。Passes 可以包含图片和条形码,并且你可以通过iOS上的推送通知更新Passes。

一个PkPass文件渲染后看起来像这样:

PassKit示例

如何使用?

final passKit = ApplePassKit();
// 首先检查PassKit是否可用
bool isAvailable = await passKit.isPassLibraryAvailable();
// 然后检查是否可以实际添加passes
bool canAddPasses = await passKit.canAddPasses();

// 当这两个条件都为真时,你可以添加一个pass。
if(isAvailable && canAddPasses) {
    await passKit.addPass(pass);
}

要查看所有方法,请参阅API文档

查看你的应用程序的passes

按照Xcode项目设置文档中的说明进行设置。

之后,使用await ApplePassKit().passes()加载已安装的passes。

Apple Wallet PassKit 文档

添加passes失败

如果你遇到将pass添加到wallet的问题,可以尝试使用passkit,它可能提供更具体的错误消息供你参考。

示例Demo

以下是一个完整的示例demo,展示了如何使用apple_passkit插件来与Apple Wallet进行交互:

// ignore_for_file: use_build_context_synchronously

import 'package:flutter/material.dart';
import 'package:apple_passkit/apple_passkit.dart';
import 'package:flutter/services.dart';

final _applePasskitPlugin = ApplePassKit();

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: const _Body(),
      ),
    );
  }
}

class _Body extends StatelessWidget {
  const _Body();

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          ElevatedButton(
            onPressed: () async {
              final isAvailable =
                  await _applePasskitPlugin.isPassLibraryAvailable();
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(
                  content: Text('Is library available: $isAvailable'),
                ),
              );
            },
            child: const Text('Is library available?'),
          ),
          ElevatedButton(
            onPressed: () async {
              final canAdd = await _applePasskitPlugin.canAddPasses();
              ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Can add passes: $canAdd')));
            },
            child: const Text('Can add passes?'),
          ),
          ElevatedButton(
            onPressed: () async {
              await _applePasskitPlugin.addPass(await getFlightPass());
            },
            child: const Text('Add pass variant 1'),
          ),
          ElevatedButton(
            onPressed: () async {
              await _applePasskitPlugin
                  .addPassesWithoutUI(await getMultiplePasses());
            },
            child: const Text('Add multiple passes via popup'),
          ),
          ElevatedButton(
            onPressed: () async {
              await _applePasskitPlugin.addPasses(await getMultiplePasses());
            },
            child: const Text('Add multiple passes via ViewController'),
          ),
          ElevatedButton(
            onPressed: () async {
              final passes = await _applePasskitPlugin.passes();
              ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Passes: ${passes.join(', ')}')));
            },
            child: const Text('Passes'),
          ),
        ],
      ),
    );
  }
}

Future<List<Uint8List>> getMultiplePasses() async {
  return [await getFlightPass()];
}

Future<Uint8List> getFlightPass() async {
  final pkPass = await rootBundle.load('assets/coupon.pkpass');
  return pkPass.buffer.asUint8List(pkPass.offsetInBytes, pkPass.lengthInBytes);
}

以上代码展示了如何创建一个简单的Flutter应用,该应用可以通过按钮与Apple Wallet进行交互,包括检查PassKit库是否可用、是否可以添加passes、添加单个或多个passes以及查看已安装的passes。


更多关于Flutter苹果钱包集成插件apple_passkit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter苹果钱包集成插件apple_passkit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成Apple Wallet(苹果钱包)通常使用apple_passkit插件。这个插件允许你生成和管理Apple Wallet中的通行证(passes),如优惠券、门票、登机牌等。以下是一个基本的代码示例,展示了如何使用apple_passkit插件来创建和注册一个通行证。

首先,确保你已经在pubspec.yaml文件中添加了apple_passkit依赖:

dependencies:
  flutter:
    sdk: flutter
  apple_passkit: ^最新版本号

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

接下来,你需要配置你的iOS项目以支持Apple Wallet。在你的ios/Runner/Info.plist文件中,添加以下权限请求:

<key>NSAppleMusicUsageDescription</key>
<string>我们需要访问您的Apple Music账户信息来管理您的通行证。</string>
<key>NSWalletUsageDescription</key>
<string>我们需要访问您的钱包以添加和管理通行证。</string>

注意:实际使用中,根据Apple的隐私政策,你需要确保这些描述是准确且用户友好的。

然后,在你的Flutter代码中,你可以使用apple_passkit插件来创建和注册通行证。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Apple Wallet Integration'),
        ),
        body: Center(
          child: AddToWalletButton(),
        ),
      ),
    );
  }
}

class AddToWalletButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        try {
          // 这里你需要提供你的pass.json文件的URL或者本地路径
          // 以及相关的证书和密钥(这些通常是从Apple Developer账户下载的)
          String passJsonUrl = "https://example.com/your-pass.json";
          String teamIdentifier = "YOUR_TEAM_IDENTIFIER";
          String passTypeIdentifier = "com.example.pass.yourpassid";
          String webServiceUrl = "https://example.com/your-webservice";
          String authenticationToken = "YOUR_AUTHENTICATION_TOKEN"; // 如果需要的话

          // 创建Passbook对象
          var passbook = await PKPassbook.init(
            teamIdentifier: teamIdentifier,
            passTypeIdentifier: passTypeIdentifier,
            webServiceUrl: webServiceUrl,
            authenticationToken: authenticationToken,
          );

          // 注册通行证
          var result = await passbook.registerPass(
            passDataUrl: Uri.parse(passJsonUrl),
          );

          if (result) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('通行证已成功添加到钱包')),
            );
          } else {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('添加通行证失败')),
            );
          }
        } catch (e) {
          print("Error adding pass to wallet: $e");
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('发生错误: $e')),
          );
        }
      },
      child: Text('添加到钱包'),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,用于将通行证添加到Apple Wallet。你需要替换示例中的URL、团队标识符、通行证类型标识符、Web服务URL和身份验证令牌为你的实际值。

请注意,实际开发中,你需要处理更多的细节,如错误处理、用户交互反馈以及符合Apple Wallet通行证规范的JSON文件创建等。此外,你还需要确保你的服务器端配置正确,以支持通行证的注册和更新。

由于apple_passkit插件的具体使用可能会随着插件版本的更新而有所变化,因此建议查阅最新的插件文档以获取最准确的信息。

回到顶部