Mac OS LION 10.7应用程序内购买

时间:2012-04-11 21:05:38

标签: xcode in-app-purchase osx-lion storekit

我正在测试Mac OS Lion上提供的应用内购买新功能,我被困在收据验证部分,我的代码总是在此部分失败,好像我没有连接到沙箱或应用程序收据永远不要将收据作为“退出(173)发送给我;”应该有效。

这些是我的步骤:

1 - 为应用程序注册显式的App ID。 ([会员中心] [1])。

2 - 使用状态为“准备上传”的App ID在iTunes上添加应用程序。

3 - 添加应用购买产品。

5 - 创建测试用户 6 - 创建,下载和安装Mac签名证书,该证书使用已启用App ID的应用程序内购买7开发配置文件。 ([会员中心] [1])。

7 - 将配置文件添加到Xcode Observer。

8 - 在Xcode的My Target信息窗格的Bundle Identifier字段中输入App ID的Bundle Identifier部分。

9 - 使用我的证书签署代码。

注意:我在Finder上测试应用程序而不是Xcode Debuger。

这是应用程序代码:

部首:

#import <Cocoa/Cocoa.h>
#import <StoreKit/StoreKit.h>
@interface AppDelegate : NSObject <NSApplicationDelegate,SKProductsRequestDelegate,SKPaymentTransactionObserver>
{
    NSWindow *window;
    IBOutlet NSTextField *label;
    IBOutlet NSButton *checkox;
}

@property (assign) IBOutlet NSWindow *window;
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error;
- (void)applicationDidFinishLaunching:(NSNotification *)notification;
-(void)requestUpgradeProductsData;
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response;
-(IBAction)checkBoxState:(id)sender;
@end

代码:

 #import "AppDelegate.h"

 @implementation AppDelegate

 @synthesize window = _window;

-(void)applicationWillFinishLaunching:(NSNotification *)notification
{
    NSLog(@"applicationDidFinishLaunching");
    NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL];
    if (![[NSFileManager defaultManager] fileExistsAtPath:[receiptURL path]])
    {
        NSLog(@"no receipt - exit the app with code 173");
        exit(173);
    }
}

-(void)requestUpgradeProductsData
{
    if([SKPaymentQueue canMakePayments])
    {
        SKProductsRequest *request =[[SKProductsRequest alloc]initWithProductIdentifiers:[NSSet setWithObjects:@"com.comany.MyApp.DLC1",@"com.comany.MyApp.DLC2",nil]];
        request.delegate = self;
        [request start];
    }
}

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    int count = response.products.count;
    if(count!=0)
    {
        NSLog(@"COUNT IS NOT ZERO");
    }
    else 
    {
        [label setStringValue:@"NO PRODUCT"];
    }
}

-(IBAction)checkBoxState:(id)sender
{
    [self requestUpgradeProductsData]; 
}
-(void) request:(SKRequest *)request didFailWithError:(NSError *)error
{
    NSLog(error);
}
@end

- 我的代码总是退出“退出(173);”,如果我删除此检查,我将所有产品都作为无效标识符。 - 当我用3d party证书应用程序商店签署我的代码时要求提供登录信息,但是当我用开发证书签署我的代码时,app store什么也没做。

感谢。

https://developer.apple.com/membercenter/index.action

1 个答案:

答案 0 :(得分:1)

在Finder中启动应用程序,但这并不意味着您出于某种原因在xcode外部启动。

  1. 选择产品 - &gt;从菜单归档
  2. 选择您的应用,然后选择分发
  3. 选择“导出为应用程序”
  4. 现在,当您启动导出的应用程序时,应用程序将强制退出并在您登录后询问您的测试用户帐户。该应用程序将自动为您重新启动。
  5. 现在你有一个接收器并能够测试购买。