import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:in_app_purchase/in_app_purchase.dart'; import 'package:in_app_purchase_android/billing_client_wrappers.dart'; import 'package:in_app_purchase_android/in_app_purchase_android.dart'; import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart'; //工具类 class KtUtils { ///获取时区 static String getTimeZoneOffset(DateTime dateTime) { Duration offset = dateTime.timeZoneOffset; String sign = offset.isNegative ? '-' : '+'; int hours = offset.inHours.abs(); int minutes = (offset.inMinutes.abs() % 60); return 'GMT$sign${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}'; } static bool isEmpty(dynamic value) { return value == null || (value is Map && value.isEmpty) || (value is String && value.isEmpty) || (value is Iterable && value.isEmpty); } static bool isNotEmpty(dynamic value) { return !isEmpty(value); } ///获取iOS内购优惠价格(安卓为获取原价) static String getDiscountPrice(ProductDetails? product, {bool showDiscount = false}) { String price = product?.price ?? ''; if (product == null) return price; if (Platform.isIOS) { if (product is AppStoreProductDetails) { debugPrint("skProduct优惠价格: ${product.skProduct.price}"); for (final discount in product.skProduct.discounts) { debugPrint("优惠ID: ${discount.identifier}"); debugPrint("优惠价格: ${discount.price}"); debugPrint("priceLocale: ${discount.priceLocale.currencySymbol}-${discount.priceLocale.currencyCode}"); debugPrint("优惠周期: ${discount.subscriptionPeriod.numberOfUnits}"); debugPrint("支付模式: ${discount.paymentMode}"); // freeTrial, payAsYouGo, payUpFront if (isNotEmpty(discount.price)) price = discount.priceLocale.currencySymbol + discount.price; break; } } } else if (Platform.isAndroid) { if (product is GooglePlayProductDetails) { for (SubscriptionOfferDetailsWrapper? offer in product.productDetails.subscriptionOfferDetails ?? []) { debugPrint('Base plan ID: ${offer?.basePlanId}'); debugPrint('Offer ID: ${offer?.offerId}'); if (offer?.pricingPhases.isEmpty ?? true) continue; for (PricingPhaseWrapper phase in offer!.pricingPhases) { debugPrint('价格: ${phase.formattedPrice}'); debugPrint('周期: ${phase.billingPeriod}'); debugPrint('周期内收费次数: ${phase.recurrenceMode}'); if (isNotEmpty(phase.formattedPrice)) { price = phase.formattedPrice; if (showDiscount) return price; } } } } } return price; } static Map filterVipType(String? type) { if (isEmpty(type)) { return {}; } List> vipTypes = [ {'type': 'week', 'name': 'Weekly', 'shortName': 'week'}, {'type': 'month', 'name': 'Monthly', 'shortName': 'month'}, {'type': 'three_months', 'name': 'Quarterly', 'shortName': 'quarter'}, {'type': 'yearly', 'name': 'Yearly', 'shortName': 'year'}, {'type': 'year', 'name': 'Yearly', 'shortName': 'year'}, ]; final filterType = vipTypes.where((item) => item['type'] == type).cast?>().firstOrNull; if (filterType != null) { return filterType; } return {}; } }