0

我知道这一定是一个相当普遍的问题,但我确实在互联网上搜索并尝试了数十种解决方案,到目前为止都无济于事......我对此束手无策:P

所以,我正在 iOS 上实现 InApp 购买,我遇到了最奇怪的问题。我没有任何大惊小怪地完成了 SKProduct 检索的所有设置和早期测试,但后来整个事情停止了工作,我不知道为什么。

我遵循了几个教程,所以这段代码一定很熟悉。首先是 InAppPurchaseManager.h:

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

#define kInAppPurchaseManagerProductsFetchedNotification @"kInAppPurchaseManagerProductsFetchedNotification"


@interface InAppPurchaseManager : NSObject <SKProductsRequestDelegate>
{

} 

-(void) requestWalterLevelPackData;


+(SKProduct *) WalterLevelPack;
+(NSArray *) productCatalog;


@property (strong,nonatomic) SKProductsRequest *request;


@end

到目前为止没有什么太奇怪的。我将 SKProductRequest 放在一个属性上以保留该值并设置两个“类变量”以供外部访问值。

前进到 InAppPurchaseManager.mm 文件:

#import "InAppPurchaseManager.h"

SKProduct* _walterLevelPack=nil;
NSArray* _productCatalog=nil;

@implementation InAppPurchaseManager

@synthesize request;

+(NSArray *) productCatalog
{
    return _productCatalog;
}

+(SKProduct *) WalterLevelPack
{
    return _walterLevelPack;
}


-(void)requestWalterLevelPackData
{

    NSSet *productIdentifiers = [NSSet setWithObject:@"MR_WALTER_LEVEL_PACK01" ];

    self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    self.request.delegate = self;
    [self.request start];

}


#pragma -
#pragma SKProductsRequestDelegate methods


- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
    printf("got an error");
    NSLog(@"request failed: %@,  %@", request, error);

   [request release];

}

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    printf("delegate called");


    [_productCatalog release];

    _productCatalog = [response.products retain];

    [_walterLevelPack release];

    _walterLevelPack=[[_productCatalog firstObject] retain];

   //_walterLevelPack=[[self.products count] == 1 ? [[self.products firstObject] retain] : nil retain];


        NSLog(@"Product title: %@" , _walterLevelPack.localizedTitle);
        NSLog(@"Product description: %@" , _walterLevelPack.localizedDescription);
        NSLog(@"Product price: %@" , _walterLevelPack.price);
        NSLog(@"Product id: %@" , _walterLevelPack.productIdentifier);


    for (NSString *invalidProductId in response.invalidProductIdentifiers)
    {
        NSLog(@"Invalid product id: %@" , invalidProductId);
    }

    [request release];

    [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];


}


- (void)dealloc
{

    request.delegate = nil;
    [request cancel];
    request = nil;
    [super dealloc];
}


@end

SKProduct* StoreItem=nil;
NSArray* productCatalog=nil;


extern "C"
{

    NSString * RequestLevelPackData()
    {

        InAppPurchaseManager* purchaseManager=[[InAppPurchaseManager alloc] init];

        [purchaseManager requestWalterLevelPackData];


        productCatalog=[InAppPurchaseManager productCatalog];


        if(productCatalog==nil)
        {
            printf("empty!");
        }

        StoreItem=[InAppPurchaseManager WalterLevelPack];


        printf("%s", [StoreItem.localizedTitle UTF8String]);
        printf("%s", [StoreItem.localizedDescription UTF8String]);
        // printf("%s", [StoreItem.price UTF8String]);
        printf("%s", [StoreItem.productIdentifier UTF8String]);


        NSString *ProductData=@"Empty";


        return ProductData;
    }
}

在这里,我初始化我的“类变量”,设置 productsRequest 委托并启动整个事情。在“Ext C”部分,我创建了一个 InAppPurchaseManager 类的实例并调用“requestWalterLevelPackData()”函数。之后,我尝试访问我的“类变量”以查看它们是否具有值。

预期的行为将是:

-NSLog 在 productsRequest 委托中打印和 printf 以显示在控制台上 -Class 变量将具有值。

我所拥有的是:

- 控制台上没有打印 - 类变量为空

经过一些痛苦的断点和检查后,我得出的结论是 productsRequest 委托方法没有被调用。我在方法中放置的断点没有到达,也没有设置变量值。所发生的一切都是在通过 self.request 和 @synthetize 的操作之间的 RequestWalterLevelPack() 内部进行的大量跳转。

现在有趣的是,这段代码实际上曾经可以工作。我打印出了 productRequest 中的所有 Nlog,断点会很好地命中,然后......不再。我所做的唯一显着变化是一些来回更改名称,添加“类变量”和一些测试。

我在没有注意到的情况下刹车了吗?有人可以帮我吗?

我正在运行 Xcode 4.2,目标 iOS 版本是 5.0,开发设备是 iphone 3GS。

4

1 回答 1

0

Store Kit 的故障排除可能很棘手。如果您没有更改代码,我会很想考虑环境。配置文件有问题吗?您是在设备上而不是模拟器上测试吗?您是否使用了测试商店/沙盒帐户(而不是无意中使用您的正确帐户登录。)现在我写这个,我记得我有这种“沉默”的情况,使用新创建的测试帐户是解决问题的关键它。

于 2012-08-07T17:30:56.920 回答