私はこれがかなり一般的な問題であることを知っていますが、私は文字通りインターネットを精査し、何十もの解決策を試しましたが、これまでのところ役に立ちませんでした...私はこれで私の知恵の終わりにいます: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 をプロパティに配置して値を保持し、値への外部アクセス用に 2 つの「クラス変数」を設定しています。
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 デリゲート メソッドが呼び出されていないという結論に達しました。メソッド内に配置したブレークポイントに到達しておらず、変数値も設定されていません。発生するのは、RequestWalterLevelPack() 内で、self.request と @synthetize に対するアクションの間で多くのジャンプが発生することだけです。
ファンキーな部分は、このコードが実際に機能していたことです。productRequest 内のすべての Nlog が出力されました。ブレークポイントは問題なくヒットしましたが、それ以上ヒットしませんでした。私が行った唯一の注目すべき変更は、「クラス変数」を追加し、いくつかのテストを行って、前後に名前を変更したことです。
気づかずに何かをブレーキしましたか?誰かが私を助けることができますか?
Xcode 4.2 を実行しています。ターゲットの iOS バージョンは 5.0、開発デバイスは iphone 3GS です。