Почему предыдущие покупки запускают слушателя покупки в приложении во время инициализации в Flutter (iOS)?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Почему предыдущие покупки запускают слушателя покупки в приложении во время инициализации в Flutter (iOS)?

Сообщение Anonymous »

Flutter iOS: прослушиватель покупок в приложении, отражающий старые покупки при инициализации
Привет всем!
Я интегрирую покупки в приложении в свое приложение Flutter с помощью пакета in_app_purchase . Я успешно настроил все как для Google Play Store, так и для Apple App Store в тестовой среде.
Текущая настройка
Покупки работают нормально на обеих платформах. Я могу совершить покупку по подписке, и это правильно отображается в Google Play и в песочнице iOS.
Я создал контроллер Getx, в котором инициализирую прослушиватель покупок и информацию о магазине. Ниже приведен соответствующий код:

Код: Выделить всё

 Listener Initialization in onInit:
late InAppPurchasePlatform _inAppPurchasePlatform;

@override
Future onInit() async {
_inAppPurchasePlatform = InAppPurchasePlatform.instance;

final Stream purchaseUpdated =
_inAppPurchasePlatform.purchaseStream;

_subscription0 =
purchaseUpdated.listen((List purchaseDetailsList) {
_handlePurchaseUpdates(purchaseDetailsList);

}, onDone: () {
_subscription0.cancel();
print("purchase listener onDone :");
}, onError: (Object error) {
print("purchase listener erro :" + error.toString());
});

initStoreInfo();

super.onInit();
}
Реализация initStoreInfo:

Код: Выделить всё

   Future initStoreInfo() async {
print("initStoreInfo called:");

try {
final bool isAvailable = await _inAppPurchasePlatform.isAvailable();
if (!isAvailable) {
error.value = 'Store is unavailable. Please try again later.';
return;
}

print("Store is available.");
final List fetchedPlans = await fetchIAPPlanModel();
plans.addAll(fetchedPlans);

_kProductIds.addAll(fetchedPlans
.map((plan) => plan.productId ?? '')
.where((id) => id.isNotEmpty));

final ProductDetailsResponse productDetailResponse =
await _inAppPurchasePlatform
.queryProductDetails(_kProductIds.toSet());

if (productDetailResponse.error != null) {
error.value = productDetailResponse.error!.message!;
return;
}

if (productDetailResponse.productDetails.isEmpty) {
error.value = 'No products available at the moment.';
return;
}

// print(
//     "Product Details Fetched: ${productDetailResponse.productDetails.map((e) =>
e.rawPrice).toList()}");

_linkPlansWithProductDetails(productDetailResponse.productDetails);

if (GetPlatform.isAndroid) {
// Set user choice billing
final InAppPurchaseAndroidPlatformAddition addition =
InAppPurchasePlatformAddition.instance!
as InAppPurchaseAndroidPlatformAddition;
unawaited(
addition.setBillingChoice(BillingChoiceMode.userChoiceBilling));
} else if (Platform.isIOS) {
//write code for ios
}
} catch (e) {
print("Error initializing store: $e");
error.value = "Error initializing store: $e";
isLoading.value = false;
return;
}
}
Проблема
В iOS, как только приложение запускается и инициализируется контроллер Getx, также инициализируется прослушиватель покупок в приложении (purchaseStream). Однако прослушиватель немедленно предоставляет список PurchaseDetailsList, содержащий предыдущие покупки, даже если новый платеж не был совершен.
Например, при запуске он отражает следующий статус:
PurchaseStatus.purchased
Такое поведение проблематично, поскольку я не могу отличить старые покупки (из предыдущих сеансов) от новых покупок.
Что я пробовал
Я запускаю всплывающее окно биллинга через кнопку после запуска, которое работает нормально. Но эта проблема возникает до совершения какой-либо новой покупки.
Мой вопрос
Почему прослушиватель PurchaseStream возвращает предыдущие покупки на iOS во время инициализации?
Как отличить старые покупки от новых?
Существует ли рекомендуемый подход для обработки таких сценариев, гарантирующий, что старые покупки не будут повторно обрабатываться?
Любая помощь или альтернативные идеи реализации будут очень признательны!

Подробнее здесь: https://stackoverflow.com/questions/793 ... initializa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»