没有调用SKProductsRequest委托

时间:2012-08-04 17:52:19

标签: iphone objective-c ios in-app-purchase storekit

我知道这一定是一个相当普遍的问题,但我真的在互联网上搜索并尝试了几十种解决方案,到目前为止都无济于事......我已经尽力了: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以显示在控制台上 - 类变量将具有值。

我所拥有的是:

- 不在控制台上打印 - 类变量为空

经过一些痛苦的破坏和检查后,我得出的结论是没有调用productsRequest委托方法。我没有到达方法中的断点,也没有设置变量值。所有发生的事情都是在self.request和@synthetize之间的行动中跳过RequestWalterLevelPack()。

现在这个时髦的部分是这个代码实际上用来工作。我把productRequest里面的所有Nlog都打印出来,断点会碰到nicelly然后......不再。我做的唯一显着的变化是一些来回变换名称,添加“类变量”和一些测试。

我是否在没有注意到的情况下制动了什么?有人可以帮助我吗?

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

1 个答案:

答案 0 :(得分:0)

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