我在使用RevenueCat(react-native-purchases)实现React Native应用程序中的IAP时遇到了同样的问题。
我的解决方案:
#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate, SKPaymentTransactionObserver>
@property (nonatomic, strong) UIWindow *window;
@end
#import <StoreKit/StoreKit.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
...
}
(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,所以在问题解决后我注释了上述代码。
这只是一个解决方法,但希望对您有用。
基本上,如果您还没有设置SKPaymentTransactionObserver
(您可能已经设置了一个),则需要进行设置。然后在paymentQueue:updatedTransactions:
(文档)内循环遍历队列中的所有交易,并对每个交易调用:
Swift:
SKPaymentQueue.default().finishTransaction(transaction)
Obj-C:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
我不得不删除事务队列循环中已有的代码,因为它似乎触发了凭据对话框,并导致其他交易无法完成。
使用这些临时更改运行应用程序已经在我看来解决了问题,因此看起来事务队列只是出现了故障。