У меня была такая же проблема с реализацией IAP в приложении React Native с помощью RevenueCat (реагировать на собственные покупки).
Мое решение:
- Внутри AppDelegate.h, импортируйте StoreKitи добавьте SKPaymentTransactionObserver в интерфейс AppDelegate.
#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate, SKPaymentTransactionObserver>
@property (nonatomic, strong) UIWindow *window;
@end
Внутри AppDelegate.m, импортируйте StoreKit и в didFinishLaunchingWithOptions добавьте наблюдателя.
#import <StoreKit/StoreKit.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
...
}
Снова внутри AppDelegate.m добавьте требуемый метод updatedTransactions, чтобы соответствовать протоколу SKPaymentTransactionObserver.
(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
for(SKPaymentTransaction *transaction in transactions){
switch(transaction.transactionState){
case SKPaymentTransactionStatePurchasing:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
NSLog(@"Transaction state -> Purchasing");
break;
case SKPaymentTransactionStatePurchased:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
NSLog(@"Transaction state -> Purchased");
break;
case SKPaymentTransactionStateRestored:
NSLog(@"Transaction state -> Restored");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
if(transaction.error.code == SKErrorPaymentCancelled){
NSLog(@"Transaction state -> Cancelled");
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
}
Запустите приложение на своем физическом устройстве, которое представляет проблему, когда появится сообщение, нажмите Отмена.
Проверьте в XCode, что FinishTransaction вызывался внутри любогокорпусов выключателей.К счастью, он будет вызываться столько раз, сколько было незаконченных транзакций.
После этого надоедливое сообщение больше не должно появляться.В моем случае было около 15 незавершенных транзакций, и именно поэтому сообщение появлялось каждые 5 минут ... ¬¬
Я прокомментировал приведенный выше код после того, как проблема исчезла, потому что, как я уже сказал, яиспользование платформы для управления IAP.
Это всего лишь обходной путь, но надеюсь, что он сработает для вас.