我知道这一定是一个相当普遍的问题,但我真的在互联网上搜索并尝试了几十种解决方案,到目前为止都无济于事......我已经尽力了: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。
答案 0 :(得分:0)
Store Kit可能很难排除故障。如果你没有改变代码,我很想考虑环境。配置文件是否存在问题?你在设备上测试而不是模拟器吗?您是否正在使用测试商店/沙盒帐户(而不是无意中使用正确的帐户登录。)现在我写这个,我记得有一个案例,我有这个“沉默”,并使用新创建的测试帐户是解决问题的关键它