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