我的应用有1个月的自动续订订阅。当用户单击“购买订阅”按钮时,我将购买日期保存为共享的首选项。 然后,在1个月后,我需要检查此订阅是否仍然有效。 那我该怎么实现呢?
答案 0 :(得分:0)
有几种方法可以执行此操作,但是我不会在移动设备上执行此操作。
在您要求的设备上
安装Flutter Cache Manager,在启动时将maxAgeCacheObject:持续时间(天:30)设置为缓存键值'Subscription'为true。在每次启动时,检查该键是否仍存在于缓存中。如果是,那么它仍然有效,否则它已经过期。
使用FirebaseFunction的建议解决方案
我建议设置一个后端来管理所有这一切。这不是移动设备的任务。您可以在Firebase中使用Cloud Function,在其中传递唯一的设备ID,它会返回订阅是否仍然有效。无服务器功能应对此起作用。伪步骤:
答案 1 :(得分:0)
最好的方法是使用安全的后端服务器来接收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");
}
}
将其导入需要检查订阅状态并在Constructor中使用的位置。例如:
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中将为状态-正确或错误。 (请注意,您必须将flutter_inapp_purchase添加到您的项目中。)
答案 2 :(得分:0)
是的,对于漏洞,有一种方法可以解决用户手动更改时间的问题,只是为了欺骗应用程序,我想到的解决方案是让DateTime以这种方式来自服务器,无论用户是否更改日期和时间与否,您最终会得到正确的时间范围。我希望这会有所帮助。
至于检查订阅是否已过期,只需按照@awaik 给出的步骤进行操作,此外,您可以向您的 api 发出请求,以存储订阅购买的日期时间以及您预计订阅到期的时间。我建议您将购买日期和预期日期保存在您的服务器而不是用户设备上,因为清除应用程序的缓存或数据目录会导致保存的数据丢失。祝你好运。