Skip to content

Commit 827a605

Browse files
authored
fix: ios subscription type casting (#519)
Fixed an issue where the **`subscriptionPeriodNumberIOS`** field was being returned as an integer when fetching subscription product information on iOS, which caused type casting errors in Flutter when converting it to a string. Updated the Swift code to convert this value to a string. Additionally, simplified the names of unused stream controllers in Flutter to **`_purchaseUpdatedListener`** and **`_purchaseErrorListener`**, and removed the unnecessary **`Flutter.podspec`** file.
1 parent 38f9102 commit 827a605

File tree

14 files changed

+439
-459
lines changed

14 files changed

+439
-459
lines changed

darwin/Classes/FlutterInappPurchasePlugin.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,12 @@ public class FlutterInappPurchasePlugin: NSObject, FlutterPlugin {
333333
// Add subscription info if available
334334
if let subscription = product.subscription {
335335
productInfo["subscriptionPeriodUnitIOS"] = unitToString(subscription.subscriptionPeriod.unit)
336-
productInfo["subscriptionPeriodNumberIOS"] = subscription.subscriptionPeriod.value
336+
productInfo["subscriptionPeriodNumberIOS"] = "\(subscription.subscriptionPeriod.value)"
337337

338338
if let introOffer = subscription.introductoryOffer {
339339
productInfo["introductoryPrice"] = introOffer.displayPrice
340-
productInfo["introductoryPriceNumberOfPeriodsIOS"] = introOffer.period.value
341-
productInfo["introductoryPriceSubscriptionPeriod"] = unitToString(introOffer.period.unit)
340+
productInfo["introductoryPriceNumberOfPeriodsIOS"] = "\(introOffer.period.value)"
341+
productInfo["introductoryPriceSubscriptionPeriodIOS"] = unitToString(introOffer.period.unit)
342342
}
343343
}
344344

example/ios/Flutter/Flutter.podspec

Lines changed: 0 additions & 18 deletions
This file was deleted.

ios/Classes/FlutterInappPurchasePlugin.swift

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,19 +333,29 @@ public class FlutterInappPurchasePlugin: NSObject, FlutterPlugin {
333333
// Add subscription info if available
334334
if let subscription = product.subscription {
335335
productInfo["subscriptionPeriodUnitIOS"] = unitToString(subscription.subscriptionPeriod.unit)
336-
productInfo["subscriptionPeriodNumberIOS"] = subscription.subscriptionPeriod.value
336+
productInfo["subscriptionPeriodNumberIOS"] = "\(subscription.subscriptionPeriod.value)"
337337

338338
if let introOffer = subscription.introductoryOffer {
339339
productInfo["introductoryPrice"] = introOffer.displayPrice
340-
productInfo["introductoryPriceNumberOfPeriodsIOS"] = introOffer.period.value
341-
productInfo["introductoryPriceSubscriptionPeriod"] = unitToString(introOffer.period.unit)
340+
productInfo["introductoryPriceNumberOfPeriodsIOS"] = "\(introOffer.period.value)"
341+
productInfo["introductoryPriceSubscriptionPeriodIOS"] = unitToString(introOffer.period.unit)
342342
}
343343
}
344344

345345
productList.append(productInfo)
346346
}
347347

348348
print("\(FlutterInappPurchasePlugin.TAG) Returning \(productList.count) products to Flutter")
349+
350+
// Debug: Print the actual data being sent
351+
for (index, product) in productList.enumerated() {
352+
print("\(FlutterInappPurchasePlugin.TAG) Product \(index): \(product)")
353+
if let periodNumber = product["subscriptionPeriodNumberIOS"] {
354+
print("\(FlutterInappPurchasePlugin.TAG) subscriptionPeriodNumberIOS type: \(type(of: periodNumber))")
355+
print("\(FlutterInappPurchasePlugin.TAG) subscriptionPeriodNumberIOS value: \(periodNumber)")
356+
}
357+
}
358+
349359
await MainActor.run {
350360
result(productList)
351361
}

ios/flutter_inapp_purchase/Sources/flutter_inapp_purchase/FlutterInappPurchasePlugin.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,12 @@ public class FlutterInappPurchasePlugin: NSObject, FlutterPlugin {
333333
// Add subscription info if available
334334
if let subscription = product.subscription {
335335
productInfo["subscriptionPeriodUnitIOS"] = unitToString(subscription.subscriptionPeriod.unit)
336-
productInfo["subscriptionPeriodNumberIOS"] = subscription.subscriptionPeriod.value
336+
productInfo["subscriptionPeriodNumberIOS"] = "\(subscription.subscriptionPeriod.value)"
337337

338338
if let introOffer = subscription.introductoryOffer {
339339
productInfo["introductoryPrice"] = introOffer.displayPrice
340-
productInfo["introductoryPriceNumberOfPeriodsIOS"] = introOffer.period.value
341-
productInfo["introductoryPriceSubscriptionPeriod"] = unitToString(introOffer.period.unit)
340+
productInfo["introductoryPriceNumberOfPeriodsIOS"] = "\(introOffer.period.value)"
341+
productInfo["introductoryPriceSubscriptionPeriodIOS"] = unitToString(introOffer.period.unit)
342342
}
343343
}
344344

lib/enums.dart

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,7 @@ enum SubscriptionState {
7474
}
7575

7676
/// Transaction states
77-
enum TransactionState {
78-
purchasing,
79-
purchased,
80-
failed,
81-
restored,
82-
deferred,
83-
}
77+
enum TransactionState { purchasing, purchased, failed, restored, deferred }
8478

8579
/// Platform availability types
8680
enum ProductAvailability {
@@ -91,35 +85,16 @@ enum ProductAvailability {
9185
}
9286

9387
/// In-app message types
94-
enum InAppMessageType {
95-
purchase,
96-
billing,
97-
price,
98-
generic,
99-
}
88+
enum InAppMessageType { purchase, billing, price, generic }
10089

10190
/// Refund types
102-
enum RefundType {
103-
issue,
104-
priceChange,
105-
preference,
106-
}
91+
enum RefundType { issue, priceChange, preference }
10792

10893
/// Offer types
109-
enum OfferType {
110-
introductory,
111-
promotional,
112-
code,
113-
winBack,
114-
}
94+
enum OfferType { introductory, promotional, code, winBack }
11595

11696
/// Billing client state
117-
enum BillingClientState {
118-
disconnected,
119-
connecting,
120-
connected,
121-
closed,
122-
}
97+
enum BillingClientState { disconnected, connecting, connected, closed }
12398

12499
/// Proration mode (Android)
125100
enum ProrationMode {
@@ -157,11 +132,7 @@ enum ResponseCodeAndroid {
157132
}
158133

159134
/// See also https://developer.android.com/reference/com/android/billingclient/api/Purchase.PurchaseState
160-
enum PurchaseState {
161-
pending,
162-
purchased,
163-
unspecified,
164-
}
135+
enum PurchaseState { pending, purchased, unspecified }
165136

166137
/// Android Proration Mode
167138
enum AndroidProrationMode {

lib/errors.dart

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,7 @@ class ErrorCodeUtils {
196196
}
197197

198198
/// Maps an ErrorCode enum to platform-specific code
199-
static dynamic toPlatformCode(
200-
ErrorCode errorCode,
201-
IAPPlatform platform,
202-
) {
199+
static dynamic toPlatformCode(ErrorCode errorCode, IAPPlatform platform) {
203200
if (platform == IAPPlatform.ios) {
204201
return ErrorCodeMapping.ios[errorCode] ?? 0;
205202
} else {
@@ -208,10 +205,7 @@ class ErrorCodeUtils {
208205
}
209206

210207
/// Checks if an error code is valid for the specified platform
211-
static bool isValidForPlatform(
212-
ErrorCode errorCode,
213-
IAPPlatform platform,
214-
) {
208+
static bool isValidForPlatform(ErrorCode errorCode, IAPPlatform platform) {
215209
if (platform == IAPPlatform.ios) {
216210
return ErrorCodeMapping.ios.containsKey(errorCode);
217211
} else {
@@ -229,9 +223,7 @@ class ConnectionResult {
229223
ConnectionResult.fromJSON(Map<String, dynamic> json)
230224
: msg = json['msg'] as String?;
231225

232-
Map<String, dynamic> toJson() => {
233-
'msg': msg ?? '',
234-
};
226+
Map<String, dynamic> toJson() => {'msg': msg ?? ''};
235227

236228
@override
237229
String toString() {

lib/events.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,7 @@ class ConnectionStateEvent {
4141
final bool isConnected;
4242
final String? message;
4343

44-
ConnectionStateEvent({
45-
required this.isConnected,
46-
this.message,
47-
});
44+
ConnectionStateEvent({required this.isConnected, this.message});
4845
}
4946

5047
/// Event listener subscription

0 commit comments

Comments
 (0)