PAYATHON 2026

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。

备注:内容仅供参考。