【问题标题】:In-App Purchase crash应用内购买崩溃
【发布时间】:2011-06-08 13:06:23
【问题描述】:

我正在尝试将应用内购买添加到我的 iPhone 应用中。但是当我运行我的应用程序或尝试购买商品时,我的应用程序崩溃并显示下一个错误:

警告:无法读取 /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.3 (8J2)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib 的符号(找不到文件)。 (gdb)

我将StoreKit 代码放在NSObject 类中,请看下面的代码。

StorePurchase.h:

#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>

@interface StorePurchase : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver> {

}

- (void)loadStore;
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
- (void)purchase;
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response;

@end

StorePurchase.m:

#import "StorePurchase.h"

@implementation StorePurchase

- (void)loadStore {

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

        SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"testding2"]];
        request.delegate = self;
        [request start];

    }
    else {
        NSLog(@"Parental-controls are enabled");
    }

}

- (void)purchase {

    SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"testding2"];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

    SKProduct *validProduct = nil;
    int count = [response.products count];
    if (count > 0) {
        validProduct = [response.products objectAtIndex:0];
        NSLog(@"Products found, joepie!!!");
    } else if (!validProduct) {
        NSLog(@"No products available");
    }

}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

    for (SKPaymentTransaction *transaction in transactions) {

        switch (transaction.transactionState) {

            case SKPaymentTransactionStatePurchasing:

                break;

            case SKPaymentTransactionStatePurchased:

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                break;

            case SKPaymentTransactionStateRestored:
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                break;

            case SKPaymentTransactionStateFailed:
                if (transaction.error.code != SKErrorPaymentCancelled) {
                    NSLog(@"An error encounterd");
                }
                else {
                    NSLog(@"Cancelled!");
                }

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                break;

        }

    }

}

@end

我这样称呼方法“loadStore”:

StorePurchase *classStorePurchase = [[StorePurchase alloc] init];

[classStorePurchase loadStore];

我希望有人可以帮助我解决这个问题...

【问题讨论】:

    标签: iphone objective-c xcode in-app-purchase


    【解决方案1】:

    您是否添加了 StoreKit 框架参考?

    【讨论】:

    • 是的,在 StorePurchase.h 文件中。当我尝试购买一件物品时,我会弹出购买它,但是当我取消并再次尝试时,它大多会崩溃......
    • 如果你在 Objective-C 异常上打开 Break 它应该显示它正在崩溃的行...运行 -> 在 Objective-C 异常上停止。让我知道哪条线路崩溃了......
    • 到此为止: if ([SKPaymentQueue canMakePayments]) {
    • 有人可以帮助我吗?
    • 我找到了解决方案!最后不要释放带有 store 方法的类!
    【解决方案2】:

    可以避开一般的 UIAlertView

    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    

    并把代码放在

    之间
     if ([SKPaymentQueue canMakePayments]) {
      ...
       ...
        ..
       [tmp show];
     }
    

    直接在您用于管理每个项目的过程中。

    关注这个

      - (BOOL)canMakePurchases
     {
    return [SKPaymentQueue canMakePayments];
     }
      - (void)purchaseMyProduct:(SKProduct*)product{
    if ([self canMakePurchases]) {
        SKPayment *payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
    else{
        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
        @"Purchases are disabled in your device" message:nil delegate:
        self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
        [alertView show];
    }
    }
    -(IBAction)purchase:(id)sender{
    [self purchaseMyProduct:[validProducts objectAtIndex:0]];
    purchaseButton.enabled = NO; 
     }
    

    最好的问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多