==== 2020 年 3 月 11 日更新
您好,我可以看到这篇文章仍然被那些正在寻找如何在 Flutter 中使用订阅的方法的人阅读。
在 2019 年,我制作了两个安装了数千次的应用程序,用户可以在这两个平台上购买可续订的订阅。
直到 2020 年 2 月,我才使用来自 Flutter 团队 https://pub.dev/packages/in_app_purchase 的这个包,但是 - 在 iOS 中无法获取有关用户退订的信息。这不是插件问题,而是该过程的 iOS 方法。出于安全原因,我们应该实现自己的后端(顺便说一下,Google 也建议这样做,但仍然保留直接从应用检查状态的方式)。
所以,经过一些研究,我发现制作后端和插件的人是免费的,直到您当月的收入少于 10 000 美元。
https://www.revenuecat.com/
https://pub.dev/packages/purchases_flutter
我已经在我的应用程序中实现了这个插件,它就像一个魅力。有一些很好的方法可以让您在应用程序的任何位置获取订阅状态。我将做一个例子和文章,但不确定时间。
====
从 15.07.2019 开始更新。只是为了节省时间。下面的答案是针对过时的付款插件给出的。之后 Flutter 团队制作了插件
https://pub.dev/packages/in_app_purchase
我建议使用它。
=====
最好的方法是使用安全的后端服务器来接收Real-time Developer Notifications。
但是,可以直接在应用程序中检查状态。
因此,当用户尝试访问某些付费功能时,您可以检查他的订阅是否处于活动状态。下面是例子:
使用类在某处创建文件
import 'dart:io' show Platform;
import 'package:flutter/services.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'dart:async';
class SubcsriptionStatus {
static Future<bool> subscriptionStatus(
String sku,
[Duration duration = const Duration(days: 30),
Duration grace = const Duration(days: 0)]) async {
if (Platform.isIOS) {
var history = await FlutterInappPurchase.getPurchaseHistory();
for (var purchase in history) {
Duration difference =
DateTime.now().difference(purchase.transactionDate);
if (difference.inMinutes <= (duration + grace).inMinutes &&
purchase.productId == sku) return true;
}
return false;
} else if (Platform.isAndroid) {
var purchases = await FlutterInappPurchase.getAvailablePurchases();
for (var purchase in purchases) {
if (purchase.productId == sku) return true;
}
return false;
}
throw PlatformException(
code: Platform.operatingSystem, message: "platform not supported");
}
}
在需要检查订阅状态的地方导入并在构造函数中使用。例如:
class _SubscriptionState extends State<Subscription> {
bool userSubscribed;
_SubscriptionState() {
SubcsriptionStatus.subscriptionStatus(iapId, const Duration(days: 30), const
Duration(days: 0)).then((val) => setState(() {
userSubscribed = val;
}));
}
}
在变量 userSubscribed 中将是状态 - true 或 false。
(请注意,您必须将flutter_inapp_purchase 添加到您的项目中)。