首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户在应用程序购买中取消。如何结束事务

用户在应用程序购买中取消。如何结束事务
EN

Stack Overflow用户
提问于 2010-12-22 07:54:22
回答 2查看 2.3K关注 0票数 3

我对iAP有一个小问题。我的代码大部分都在工作。只是当用户取消购买时,设备不会认为它结束了,而是保留了它。因此,如果你再次尝试购买,你会买两个坏的product...which,因为他们只想要一个。我一定是遗漏了一些代码。我将附加一个控制台日志,以便您可以看到发生了什么。

代码语言:javascript
复制
2010-12-21 15:47:29.364[204:307] Parental-controls are disabled (I launch the iAP)
2010-12-21 15:47:33.816[204:307] Win (There are products)
2010-12-21 15:47:37.043[204:307] Buying... (I pressed buy)
2010-12-21 15:47:40.661[204:307] FailedTransaction (Essentially I canceled)
2010-12-21 15:47:40.674[204:307] DefaultAction (which is to dismiss the modal view)
2010-12-21 15:47:42.738[204:307] Parental-controls are disabled (reopen the iAP view)
2010-12-21 15:47:44.440[204:307] Win
2010-12-21 15:47:46.939[204:307] Buying...
2010-12-21 15:47:46.945[204:307] Buying...
2010-12-21 15:47:48.414[204:307] FailedTransaction
2010-12-21 15:47:48.427[204:307] DefaultAction
2010-12-21 15:47:48.437[204:307] FailedTransaction
2010-12-21 15:47:48.449[204:307] DefaultAction
2010-12-21 15:47:50.622[204:307] Parental-controls are disabled
2010-12-21 15:47:51.314[204:307] Win
2010-12-21 15:47:51.883[204:307] Buying...(see how it compounds?)
2010-12-21 15:47:51.889[204:307] Buying...
2010-12-21 15:47:51.896[204:307] Buying...
2010-12-21 15:48:10.764[204:307] Posted5
2010-12-21 15:48:10.782[204:307] Yipeee!
2010-12-21 15:48:10.810[204:307] Posted5 (It gave the users 15 credits!)
2010-12-21 15:48:10.869[204:307] Yipeee!
2010-12-21 15:48:10.897 204:307] Posted5
2010-12-21 15:48:10.912[204:307] Yipeee!

下面是我正在运行的代码:

代码语言:javascript
复制
#import "PurchaserViewController.h"

@implementation PurchaserViewController


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"yayadaadul.com/checkcredits.php"]]];

    if ([SKPaymentQueue canMakePayments]) {
        NSLog(@"Parental-controls are disabled");

        SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"com.company.name.song"]];
        productsRequest.delegate = self;
        [productsRequest start];
    } else {
        NSLog(@"Parental-controls are enabled");
    }
}

- (IBAction)purchase {


    SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"com.changedwe.worksinxcode.song"];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

- (IBAction)stop {
    [player stop];
}

- (IBAction)play {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *file = [NSString stringWithFormat:@"%@/Song.mp3", documentsDirectory];

    player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:file] error:nil];
    [player play];
}

- (void)downloadFromURL:(NSURL *)url {
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *file = [NSString stringWithFormat:@"%@/Song.mp3", documentsDirectory];

    [data writeToFile:file atomically:YES];
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    SKProduct *validProduct = nil;
    int count = [response.products count];
    if (count > 0) {
        validProduct = [response.products objectAtIndex:0];
        NSLog(@"Win");

    } else if (!validProduct) {
        NSLog(@"No products available");


    }
}
-(IBAction)home {
    [self dismissModalViewControllerAnimated:YES];

}


- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"Buying...");
                break;
                break;

            case SKPaymentTransactionStatePurchased:
                [self downloadFromURL:[NSURL URLWithString:@""]];

                NSString *post =[NSString stringWithFormat:@"username=lol&cval=5"];

                NSString *hostStr = @"http://mysite.com/subdom/ccredit.php?";
                hostStr = [hostStr stringByAppendingString:post];
                NSLog(@"Posted5");


                NSLog(@"Yipeee!");
                [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://Action to Post.php?"]]];



                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                break;

            case SKPaymentTransactionStateRestored:
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                NSLog(@"Restored");

                break;

            case SKPaymentTransactionStateFailed:
                NSLog(@"FailedTransaction");
            //  [self finishTransaction:transaction wasSuccessful:NO];

                if (transaction.error.code != SKErrorPaymentCancelled) {
                    NSLog(@"An error encounterd");
                }

                //You need to clear their purchases here


                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                NSLog(@"DefaultAction");


                [self dismissModalViewControllerAnimated:YES];

                break;
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-12 04:29:03

看起来每次执行purchase操作时,您都会不断地将自己添加为事务观察者。按下它一次,一切正常。再次按下它,您的观察者委托方法将被调用两次,两次都是针对第二个事务。

票数 2
EN

Stack Overflow用户

发布于 2011-07-12 04:24:17

是。您需要实现SKRequest的成功和失败委托方法。请参阅文档。http://developer.apple.com/library/ios/#documentation/StoreKit/Reference/SKRequestDelegate/Reference/Reference.html#//apple_ref/doc/uid/TP40008416

代码语言:javascript
复制
- (void)requestDidFinish:(SKRequest *)request
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4505059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档