Flutter应用内购买与订阅管理插件apphud_plus的使用

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

Flutter应用内购买与订阅管理插件apphud_plus的使用

此插件是一个(仅限iOS)替代品和补充工具包,用于官方Apphud包

特性

  • 监听前台和后台的通知(已终止的应用状态)
    • 可以获取通知数据,既可以为字符串形式也可以为自定义类
  • 通过产品ID购买商品
  • 检查具有特定ID的产品是否存在
  • 检查付费墙是否已加载

开始使用

AppDelegate.swift

导入 ApphudSDKapphud_plus

application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) 方法中,在返回之前添加以下行:

Apphud.start(apiKey: "YOUR_API_KEY")
registerForNotifications()

然后添加以下代码,并根据您的需求进行定制:

extension AppDelegate {

    func registerForNotifications() {
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
            // 处理授权请求
        }
        UIApplication.shared.registerForRemoteNotifications()
    }

    /// 发送设备信息到Apphud
    override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Apphud.submitPushNotificationsToken(token: deviceToken, callback: nil)
    }

    /// 处理注册错误
    override func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    }

    /// 后台通知处理
    override func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        if Apphud.handlePushNotification(apsInfo: response.notification.request.content.userInfo) {
            SwiftApphudPlusPlugin.handleBackgroundNotifications(response.notification.request.content.userInfo)
        } else {
            // 处理其他类型的推送通知
        }
        completionHandler()
    }

    /// 前台通知处理
    override func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        if Apphud.handlePushNotification(apsInfo: notification.request.content.userInfo) {
            SwiftApphudPlusPlugin.handleForegroundNotifications(notification.request.content.userInfo)
        } else {
            // 处理其他类型的推送通知
        }
        completionHandler([]) // 返回空数组以避免显示通知横幅
    }
}

请检查 example/lib/main.dart 以查看Flutter代码示例,并确保阅读 apphud_plus.dart 中方法的文档。

注意事项

您可能无法使用示例应用程序进行购买,因为该示例应用程序没有Bundle ID。但是,如果您将API密钥插入到 AppDelegate.swift 文件中,则可以使用某些功能。

示例代码

以下是示例代码,您可以将其作为起点来构建自己的应用:

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

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

final navigationKey = GlobalKey<NavigatorState>();

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        navigatorKey: navigationKey,
        theme: ThemeData(
            useMaterial3: true,
            colorScheme: ColorScheme.fromSeed(seedColor: Colors.blueAccent)),
        home: const Home());
  }
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  [@override](/user/override)
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final _apphudPlusPlugin = ApphudPlus();

  void _showSnackBarWithText(String text) {
    ScaffoldMessenger.of(navigationKey.currentContext!)
        .showSnackBar(SnackBar(content: Text(text)));
  }

  Future<void> paywallsDidLoad() async {
    final payloadsDidLoad = await _apphudPlusPlugin.paywallsDidLoad();
    _showSnackBarWithText('Paywalls did load: $payloadsDidLoad');
  }

  Future<void> checkProductByID(String id) async {
    final result = await _apphudPlusPlugin.hasProductWithId(id);
    _showSnackBarWithText('checkProductByID ($id): $result');
  }

  Future<void> buyProductByID(String id) async {
    final result = await _apphudPlusPlugin.purchase(id);
    _showSnackBarWithText('buyProductByID ($id): $result');
  }

  void _showDialogWithTextField(Function(String) callback, BuildContext context) {
    final controller = TextEditingController();
    showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: const Text('Enter product ID'),
            actions: [
              ElevatedButton(
                child: const Text('Cancel'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
              ElevatedButton(
                child: const Text('OK'),
                onPressed: () {
                  Navigator.of(context).pop();
                  callback(controller.text);
                },
              ),
            ],
            content: TextField(
              autocorrect: false,
              textCapitalization: TextCapitalization.none,
              onChanged: (value) {},
              controller: controller,
            ),
          );
        });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('apphud_plus'),
      ),
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: paywallsDidLoad,
              child: const Text('Paywalls did load'),
            ),
            ElevatedButton(
                onPressed: () {
                  _showDialogWithTextField(
                      (p0) => checkProductByID(p0), context);
                },
                child: const Text('Check product by ID')),
            ElevatedButton(
                onPressed: () {
                  _showDialogWithTextField((p0) => buyProductByID(p0), context);
                },
                child: const Text('Buy product by ID'))
          ],
        ),
      ),
    );
  }
}

更多关于Flutter应用内购买与订阅管理插件apphud_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用内购买与订阅管理插件apphud_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用apphud_plus插件来实现应用内购买与订阅管理的代码示例。apphud_plus是一个强大的Flutter插件,用于处理应用内购买(IAP)和订阅。

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

dependencies:
  flutter:
    sdk: flutter
  apphud_plus: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,配置你的应用。这通常涉及在iOS和Android项目中设置应用内购买。由于这些步骤依赖于具体的平台配置,这里只展示Flutter代码部分。

初始化Apphud

在你的应用的主入口文件(通常是main.dart)中,初始化Apphud

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化Apphud
  Apphud.init(
    publicKey: '你的公钥', // 从Apphud控制面板获取的公钥
    listener: (event) {
      // 处理事件,例如购买成功、购买失败等
      print('Apphud event: $event');
    },
  );

  runApp(MyApp());
}

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

显示购买选项

在你的HomeScreen或其他相关屏幕上,添加购买选项:

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

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('应用内购买示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 显示购买界面
                await Apphud.presentProduct('product_id_1'); // 替换为实际的产品ID
              },
              child: Text('购买产品1'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 显示订阅界面
                await Apphud.presentSubscription('subscription_id_1'); // 替换为实际的订阅ID
              },
              child: Text('订阅服务1'),
            ),
          ],
        ),
      ),
    );
  }
}

处理购买结果

在初始化Apphud时,我们添加了一个事件监听器。你可以在这个监听器中处理购买结果,例如更新用户界面或解锁内容:

Apphud.init(
  publicKey: '你的公钥', // 从Apphud控制面板获取的公钥
  listener: (event) {
    if (event is ApphudPurchaseSuccessEvent) {
      // 购买成功事件处理
      print('购买成功: ${event.product.identifier}');
      // 例如,解锁特定功能或内容
    } else if (event is ApphudPurchaseFailedEvent) {
      // 购买失败事件处理
      print('购买失败: ${event.error.localizedDescription}');
    } else if (event is ApphudRestorePurchasesSuccessEvent) {
      // 恢复购买成功事件处理
      print('恢复购买成功');
    } else if (event is ApphudRestorePurchasesFailedEvent) {
      // 恢复购买失败事件处理
      print('恢复购买失败: ${event.error.localizedDescription}');
    }
    // 处理其他事件...
  },
);

恢复购买

你可以提供一个按钮来让用户恢复之前的购买:

ElevatedButton(
  onPressed: () async {
    // 恢复购买
    await Apphud.restorePurchases();
  },
  child: Text('恢复购买'),
)

这段代码展示了如何使用apphud_plus插件在Flutter应用中实现应用内购买和订阅管理的基本流程。请确保替换示例代码中的产品ID和订阅ID为你的实际值,并根据需要调整事件处理逻辑。

回到顶部