我正在尝试在我的Unity3d-IOS项目中添加app purhase。我使用Storekit。我正确地将应用程序购买添加到itunes帐户,我的代码也可以(在应用程序购买逻辑和代码中我的以前的项目工作正常)。但是,目前,我的应用内购买效果非常好,除了首次购买交易外
在应用程序购买的第一个中,系统在付款之前给我购买(在我点击确认之前)或交易没有进入正确的SKPaymentTransactionState以便我向Unity发送消息并获取我的购买(即使我付款并且itunes给我“成功购买”对话框,它也没有调用正确的购买方式)。
除了首次在应用内购买尝试中,所有应用内购买都是成功的并且效果很好。正如我所说,我在以前的项目中使用了相同的逻辑(完全可以)。
我可以错过什么?有人可以帮忙吗?
*正如您可能猜到的,我使用沙盒测试帐户。
这是我的代码:
//
// IAPController.m
// Unity-iPhone
//
// Created by dilara on 23/01/15.
//
//
#import "IAPController.h"
@interface IAPController ()
@end
@implementation IAPController
@synthesize productIdentifier;
@synthesize unityAppController;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"in viewDidLoad!!!!!!!!!!");
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(id)init
{
self.iapViewController = unityAppController.rootViewController;
return self;
}
-(void)dealloc
{
[super dealloc];
}
-(void)requestProductwithProductID:(NSString *)productID //called by unity
{
productIdentifier = productID;
NSLog(@"in custom method (requestProductwithProductID), self.productIdentifier is %@ %s %@", productIdentifier, "param productID is ", productID);
if([SKPaymentQueue canMakePayments])
{
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productIdentifier]];
request.delegate = self;
[request start];
}
else
NSLog(@"no product found");
}
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSLog(@"in productRequest of SKProductRequestDelegate");
NSArray *products = response.products;
if(products.count != 0)
{
NSLog(@"in if of productRequest method");
self.product = products[0];
productIdentifier = self.product.productIdentifier;
SKPayment *payment = [SKPayment paymentWithProduct:self.product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
else
{
NSLog(@"in else of productRequest method, product not found");
}
products = response.invalidProductIdentifiers;
for(SKProduct *product in products)
{
NSLog(@"Product not found: %@", product);
}
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"in paymentQueueMethod of SKPaymentTransactionObserver");
NSLog(@"initial count of transactions %d", transactions.count);
for(SKPaymentTransaction *transaction in transactions)
{
NSLog(@"transaction is %@", transaction.payment.productIdentifier);
NSLog(@"transaction id is %@", transaction.payment.productIdentifier);
NSLog(@"original transaction id is %@", transaction.originalTransaction.payment.productIdentifier);
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchasing:
NSLog(@"purchasing");
break;
case SKPaymentTransactionStatePurchased:
NSLog(@"purchased");
UnitySendMessage("Panel_Store", "buyItem", [self.productIdentifier cStringUsingEncoding:NSUTF8StringEncoding]);
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
case SKPaymentTransactionStateRestored:
NSLog(@"restored");
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
case SKPaymentTransactionStateFailed:
NSLog(@"failed");
if(transaction.error.code != SKErrorPaymentCancelled)
{
NSLog(@"An error encountered %@", transaction.error.description);
}
else
{
NSLog(@"Cancel button is clicked! %@", transaction.error.description);
}
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
case SKPaymentTransactionStateDeferred:
NSLog(@"waiting for approval");
break;
}
}
NSLog(@"count of transactions %d", transactions.count);
}
-(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
{
NSLog(@"in removedTransactions method of SKPaymentTransactionObserver");
}
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
NSLog(@"in restoreCompletedTransactionFailedWithError method of SKPaymentTransactionObserver");
NSLog(@"error in restoreCompletedTransactionFailedWithError is %@", error.description);
}
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@"in paymentQueueRestoreCompletedTransactionsFinished method of SKPaymentTransactionObserver");
}
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
NSLog(@"in requestDidFailWith method of SKRequestDelegate error is %@", error.description);
}
-(void)requestDidFinish:(SKRequest *)request
{
NSLog(@"in requestDidFinish method of SKRequestDelegate");
}
@end