首先在应用购买交易中工作不正常ios

时间:2015-01-26 14:27:48

标签: ios unity3d in-app-purchase storekit

我正在尝试在我的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

0 个答案:

没有答案