Flutter 如何跳转到 PlayStore/AppStore 订阅管理页面
结论
in_app_purchase 无法直接取消用户订阅。Flutter 应用需要通过 url_launcher 打开系统商店的订阅管理页面:
- Android:打开 Google Play 订阅管理页面,并可通过
productId和packageName定位具体订阅。 - iOS:打开 App Store 订阅管理页面,由用户从列表中选择要管理的订阅。
添加依赖
dependencies:
url_launcher: ^6.0.0
具体版本应根据项目使用的 Flutter SDK 选择。添加依赖后,执行:
flutter pub get
实现代码
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
Future<void> openSubscriptionManagement({
required String productId,
required String androidPackageName,
}) async {
late final Uri uri;
if (Platform.isAndroid) {
uri = Uri.https(
'play.google.com',
'/store/account/subscriptions',
{
'sku': productId,
'package': androidPackageName,
},
);
} else if (Platform.isIOS) {
uri = Uri.parse('https://apps.apple.com/account/subscriptions');
} else {
throw UnsupportedError(
'Subscription management is only supported on Android and iOS.',
);
}
final opened = await launchUrl(
uri,
mode: LaunchMode.externalApplication,
);
if (!opened) {
throw Exception('Could not open subscription management page.');
}
}
调用示例:
FilledButton(
onPressed: () async {
try {
await openSubscriptionManagement(
productId: 'premium_monthly',
androidPackageName: 'com.example.myapp',
);
} catch (error) {
if (!context.mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('无法打开订阅管理页面,请前往应用商店手动管理订阅。'),
),
);
}
},
child: const Text('管理订阅'),
)
Android 地址说明
Google Play 中具体订阅的管理地址格式如下:
https://play.google.com/store/account/subscriptions?sku=PRODUCT_ID&package=PACKAGE_NAME
参数含义:
PRODUCT_ID是 Google Play Console 中配置的订阅商品 ID。PACKAGE_NAME是 Android 应用的包名,例如com.example.myapp。- 用户需要登录购买该订阅时使用的 Google 账号。
如果无法确定具体商品,可以直接打开订阅列表:
final uri = Uri.parse(
'https://play.google.com/store/account/subscriptions',
);
iOS 地址说明
iOS 可以打开 Apple 提供的订阅管理入口:
https://apps.apple.com/account/subscriptions
这个页面通常会跳转到 App Store 或系统的订阅管理界面。它与 Google Play 的入口不同,一般无法通过商品 ID 直接定位某项订阅,用户需要在列表中自行选择。
注意事项
取消订阅不等于立即失效
用户取消订阅后,通常仍能继续使用相关权益,直到当前计费周期结束。因此,用户从订阅管理页面返回应用时,不要立即将其标记为非订阅状态。
应用应重新查询购买状态,并以收据校验或服务端记录的订阅状态为准。in_app_purchase 主要用于发起购买和获取购买信息,订阅生命周期仍需配合可靠的校验逻辑。
处理未安装商店或打开失败
部分 Android 设备没有安装 Google Play,系统也可能无法处理对应链接。应用应处理 launchUrl 返回 false 或抛出异常的情况,并提示用户手动前往应用商店的订阅页面。
不要硬编码错误的商品信息
Android 链接中的 sku 必须是用户实际购买的订阅商品 ID,package 也必须与 Play Console 中的应用包名完全一致。如果应用包含多个订阅商品,可以根据当前有效的购买记录传入相应的 productId,也可以直接打开通用订阅列表。
Web 和桌面平台需要单独处理
通过 dart:io 的 Platform 判断平台,适用于 Android、iOS 等原生平台,但不适用于 Flutter Web。如果同一套代码还要支持 Web,应使用条件导入或单独的平台适配层,避免在 Web 构建中直接引用 dart:io。
备注:内容仅供参考。