Мы опубликовали приложение Flutter для iOS и Android, предлагающего неспособные для дополнительного контента. Мы используем пакет in_app_purchase, предоставленный Flutter. Однако, хотя у большинства пользователей также нет проблем в производстве, у некоторых есть проблемы с выкупом промо -кодов. В некоторых случаях пользователи должны были выкупить второй промо-код, чтобы успешно восстановить покупки в приложении. В некоторых случаях пользователи не могут восстановить свои покупки даже после выкупа нескольких промо -кодов. < /P>
реализация: < /h1>
Вот соответствующий код, который показывает методы initstate () нашего виджета IApstore, а также методы Br />
и методы RestorePurchases ().class IAPStore extends StatefulWidget {
const IAPStore({super.key});
@override
IAPStoreState createState() => IAPStoreState();
}
class IAPStoreState extends State {
late InAppPurchase inAppPurchase;
Map products = {};
@override
void initState() {
super.initState();
inAppPurchase = InAppPurchase.instance;
inAppPurchase.purchaseStream.listen(
purchaseListener,
onError: (error) {
print('Purchase stream error: $error');
showErrorDialog();
},
cancelOnError: true,
);
queryProductInformation().then((value) {
if (value == null) {
print('value in queryProductInformation is null!');
updateProcessing(false);
return;
}
setState(() {
for (var details in value.productDetails) {
products[details.id] = details;
}
});
updateProcessing(false);
});
}
Future restorePurchases() async {
updateProcessing(true);
await inAppPurchase.restorePurchases();
}
void purchaseListener(List
purchaseDetailsList) async {
print(
'Called purchaseListener (purchaseDetailsList: ${purchaseDetailsList.length})');
if (purchaseDetailsList.isEmpty) {
print('Purchase details list is empty!');
updateProcessing(false);
return;
}
for (var purchaseDetails in purchaseDetailsList) {
switch (purchaseDetails.status) {
case PurchaseStatus.purchased:
print('Purchase successful: ${purchaseDetails.productID}');
completePurchase(purchaseDetails.productID);
break;
case PurchaseStatus.canceled:
print('Purchase was canceled');
updateProcessing(false);
break;
case PurchaseStatus.restored:
print('Purchase restored');
completePurchase(purchaseDetails.productID);
break;
case PurchaseStatus.pending:
print('Purchase pending');
break;
case PurchaseStatus.error:
print('Purchase error');
showErrorDialog();
break;
}
print('Calling completePurchase...');
await inAppPurchase.completePurchase(purchaseDetails);
}
}
< /code>
Нам удалось воспроизвести этот случай на одном из наших устройств iOS. На этом устройстве не могут быть восстановлены в приложении, даже после выкупа нескольких промо-кодов. Кроме того, восстановление этих покупок на другом устройстве iOS с тем же зарегистрированным Apple-ID работает нормально. Итак, мы сравнили журналы с этих двух устройств:
log 1 - восстановление успешно работает
14:48:17.032895+0200 Runner flutter: Found id: de.BUNDLEID.01, title: TITLE 1, price: €29.99
14:48:17.032922+0200 Runner flutter: Found id: de.BUNDLEID.bundle, title: TITLE Gesamtpaket, price: €59.99
14:48:17.032975+0200 Runner flutter: Found id: de.BUNDLEID.02, title: TITLE 2, price: €29.99
14:48:17.033001+0200 Runner flutter: Found id: de.BUNDLEID.extension, title: TITLE Plus, price: €9.99
14:48:20.656702+0200 storekitd [70D5C079]: Found 2 products in receipt with ID de.BUNDLEID.bundle
14:48:20.667793+0200 Runner flutter: Called purchaseListener (purchaseDetailsList: 1)
14:48:20.667838+0200 Runner flutter: Purchase restored
...
< /code>
Продукты найдены и перечислены правильно < /li>
Storekit, по -видимому, находит и возвращает продукты в квитанции с правильным идентификатором < /li>
CushaSelistener ()
< /ul>
< /ul>
< /ul>
14:23:26.150484+0200 Runner flutter: Found id: de.BUNDLEID.bundle, title: TITLE Gesamtpaket, price: €59.99
14:23:26.150513+0200 Runner flutter: Found id: de.BUNDLEID.02, title: TITLE 2, price: €29.99
14:23:26.150619+0200 Runner flutter: Found id: de.BUDNLEID.extension, title: TITLE Plus, price: €9.99
14:23:26.150657+0200 Runner flutter: Found id: de.BUNDLEID.01, title: TITLE 1, price: €29.99
14:23:27.125353+0200 dasd com.apple.icloud.searchpartyd.ProductInfoManager:C25423:[ (name: Thundering Herd Policy, policyWeight:
14:23:27.376336+0200 storekitd [Client] (Runner) Initialized with server Production bundle ID de.BUNDLEID.bundle and request bundl
14:23:27.390026+0200 storekitd AMSURRequestEncoder: (7BA6012D] Encoding request for URL: https://mzstorekit.itunes.apple.com/inApps/
14:23:27.984831+0200 storekitd [7BA6012D]: Found 2 products in receipt with ID de.BUNDLEID.bundle
14:23:27.990235+0200 Runner flutter: Called purchaseListener (purchaseDetailsList: 0)
14:23:27.990271+0200 Runner flutter: Purchase details list is empty!
...
< /code>
Продукты найдены и правильно указаны < /li>
Storekit, по -видимому, находит и возвращает продукты в квитанции с правильным идентификатором < /li>
bricaSelistener ()
Подробнее здесь: https://stackoverflow.com/questions/797 ... p-purchase
Не могу восстановить покупки на некоторых устройствах iOS с Flutter In_App_purchase ⇐ IOS
Программируем под IOS
1754516909
Anonymous
Мы опубликовали приложение Flutter для iOS и Android, предлагающего неспособные для дополнительного контента. Мы используем пакет in_app_purchase, предоставленный Flutter. Однако, хотя у большинства пользователей также нет проблем в производстве, у некоторых есть проблемы с выкупом промо -кодов. В некоторых случаях пользователи должны были выкупить второй промо-код, чтобы успешно восстановить покупки в приложении. В некоторых случаях пользователи не могут восстановить свои покупки даже после выкупа нескольких промо -кодов. < /P>
реализация: < /h1>
Вот соответствующий код, который показывает методы initstate () нашего виджета IApstore, а также методы Br />
и методы RestorePurchases ().class IAPStore extends StatefulWidget {
const IAPStore({super.key});
@override
IAPStoreState createState() => IAPStoreState();
}
class IAPStoreState extends State {
late InAppPurchase inAppPurchase;
Map products = {};
@override
void initState() {
super.initState();
inAppPurchase = InAppPurchase.instance;
inAppPurchase.purchaseStream.listen(
purchaseListener,
onError: (error) {
print('Purchase stream error: $error');
showErrorDialog();
},
cancelOnError: true,
);
queryProductInformation().then((value) {
if (value == null) {
print('value in queryProductInformation is null!');
updateProcessing(false);
return;
}
setState(() {
for (var details in value.productDetails) {
products[details.id] = details;
}
});
updateProcessing(false);
});
}
Future restorePurchases() async {
updateProcessing(true);
await inAppPurchase.restorePurchases();
}
void purchaseListener(List
purchaseDetailsList) async {
print(
'Called purchaseListener (purchaseDetailsList: ${purchaseDetailsList.length})');
if (purchaseDetailsList.isEmpty) {
print('Purchase details list is empty!');
updateProcessing(false);
return;
}
for (var purchaseDetails in purchaseDetailsList) {
switch (purchaseDetails.status) {
case PurchaseStatus.purchased:
print('Purchase successful: ${purchaseDetails.productID}');
completePurchase(purchaseDetails.productID);
break;
case PurchaseStatus.canceled:
print('Purchase was canceled');
updateProcessing(false);
break;
case PurchaseStatus.restored:
print('Purchase restored');
completePurchase(purchaseDetails.productID);
break;
case PurchaseStatus.pending:
print('Purchase pending');
break;
case PurchaseStatus.error:
print('Purchase error');
showErrorDialog();
break;
}
print('Calling completePurchase...');
await inAppPurchase.completePurchase(purchaseDetails);
}
}
< /code>
Нам удалось воспроизвести этот случай на одном из наших устройств iOS. На этом устройстве не могут быть восстановлены в приложении, даже после выкупа нескольких промо-кодов. Кроме того, восстановление этих покупок на другом устройстве iOS с тем же зарегистрированным Apple-ID работает нормально. Итак, мы сравнили журналы с этих двух устройств:
[b] log 1 - восстановление успешно работает [/b]
14:48:17.032895+0200 Runner flutter: Found id: de.BUNDLEID.01, title: TITLE 1, price: €29.99
14:48:17.032922+0200 Runner flutter: Found id: de.BUNDLEID.bundle, title: TITLE Gesamtpaket, price: €59.99
14:48:17.032975+0200 Runner flutter: Found id: de.BUNDLEID.02, title: TITLE 2, price: €29.99
14:48:17.033001+0200 Runner flutter: Found id: de.BUNDLEID.extension, title: TITLE Plus, price: €9.99
14:48:20.656702+0200 storekitd [70D5C079]: Found 2 products in receipt with ID de.BUNDLEID.bundle
14:48:20.667793+0200 Runner flutter: Called purchaseListener (purchaseDetailsList: 1)
14:48:20.667838+0200 Runner flutter: Purchase restored
...
< /code>
Продукты найдены и перечислены правильно < /li>
Storekit, по -видимому, находит и возвращает продукты в квитанции с правильным идентификатором < /li>
CushaSelistener ()
< /ul>
< /ul>
< /ul>
14:23:26.150484+0200 Runner flutter: Found id: de.BUNDLEID.bundle, title: TITLE Gesamtpaket, price: €59.99
14:23:26.150513+0200 Runner flutter: Found id: de.BUNDLEID.02, title: TITLE 2, price: €29.99
14:23:26.150619+0200 Runner flutter: Found id: de.BUDNLEID.extension, title: TITLE Plus, price: €9.99
14:23:26.150657+0200 Runner flutter: Found id: de.BUNDLEID.01, title: TITLE 1, price: €29.99
14:23:27.125353+0200 dasd com.apple.icloud.searchpartyd.ProductInfoManager:C25423:[ (name: Thundering Herd Policy, policyWeight:
14:23:27.376336+0200 storekitd [Client] (Runner) Initialized with server Production bundle ID de.BUNDLEID.bundle and request bundl
14:23:27.390026+0200 storekitd AMSURRequestEncoder: (7BA6012D] Encoding request for URL: https://mzstorekit.itunes.apple.com/inApps/
14:23:27.984831+0200 storekitd [7BA6012D]: Found 2 products in receipt with ID de.BUNDLEID.bundle
14:23:27.990235+0200 Runner flutter: Called purchaseListener (purchaseDetailsList: 0)
14:23:27.990271+0200 Runner flutter: Purchase details list is empty!
...
< /code>
Продукты найдены и правильно указаны < /li>
Storekit, по -видимому, находит и возвращает продукты в квитанции с правильным идентификатором < /li>
bricaSelistener ()
Подробнее здесь: [url]https://stackoverflow.com/questions/79711926/cant-restore-purchases-on-some-ios-devices-with-flutter-in-app-purchase[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия