2013-11-27 145 views
1

我在恢復Mac購買時遇到問題。 我已經設置了iTunes連接應用,應用內購買,測試用戶。我可以買物品。如果我多次購買相同的非消耗品,系統會說它已經購買,我將免費獲得。但是恢復的問題。無法在Mac上恢復購買

下面是代碼:

AppDelegate.h

#import <Cocoa/Cocoa.h> 
#import <StoreKit/StoreKit.h> 

@interface AppDelegate : NSObject <NSApplicationDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver> 
{ 
NSArray *m_productIdentifiers; 
NSArray* m_products; 
} 
-(IBAction)Press1:(id)sender; 
-(IBAction)Press2:(id)sender; 
@property (assign) IBOutlet NSWindow *window; 
@end 

AppDelegate.m

#import "AppDelegate.h" 

@implementation AppDelegate 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
NSString *receiptPath = [[[NSBundle mainBundle] appStoreReceiptURL] path]; 
if (![[NSFileManager defaultManager] fileExistsAtPath:receiptPath]) 
{ 
    exit(173); 
} 

NSURL *url = [[NSBundle mainBundle] URLForResource:@"products" 
            withExtension:@"plist"]; 
m_productIdentifiers = [NSArray arrayWithContentsOfURL:url]; 

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
} 

-(IBAction)Press1:(id)sender 
{ 
[self validateProductIdentifiers:m_productIdentifiers]; 
return; 
} 

-(IBAction)Press2:(id)sender 
{ 
[self restorePurchases]; 
} 


- (void)validateProductIdentifiers:(NSArray *)productIdentifiers 
{ 
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] 
             initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]]; 
productsRequest.delegate = self; 
[productsRequest start]; 
} 


- (void)productsRequest:(SKProductsRequest *)request 
didReceiveResponse:(SKProductsResponse *)response 
{ 
m_products = response.products; 

for (NSString *dentifier in response.products) 
{ 
    NSLog(@"%@",dentifier); 
} 
} 

- (void)requestDidFinish:(SKRequest *)request 
{ 
NSLog(@"requestDidFinish"); 
return; 
} 

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error 
{ 
NSLog(@"request"); 
return; 
} 

- (void)restorePurchases 
{ 
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
for (SKPaymentTransaction * transaction in transactions) { 
    switch (transaction.transactionState) 
    { 
     case SKPaymentTransactionStatePurchased: 
      [self completeTransaction:transaction]; 
      break; 
     case SKPaymentTransactionStateFailed: 
      [self failedTransaction:transaction]; 
      break; 
     case SKPaymentTransactionStateRestored: 
      [self restoreTransaction:transaction]; 
     default: 
      break; 
    } 
}; 
} 

- (void)completeTransaction:(SKPaymentTransaction *)transaction { 
NSLog(@"completeTransaction..."); 

NSLog(@"completeTransaction... %@",transaction.payment.productIdentifier); 
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 

- (void)restoreTransaction:(SKPaymentTransaction *)transaction { 
NSLog(@"restoreTransaction..."); 

NSLog(@"restoreTransaction... %@",transaction.payment.productIdentifier); 
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 

- (void)failedTransaction:(SKPaymentTransaction *)transaction { 

NSLog(@"failedTransaction..."); 
if (transaction.error.code != SKErrorPaymentCancelled) 
{ 
    NSLog(@"Transaction error: %@", transaction.error.localizedDescription); 
} 

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
{ 
NSLog(@"restoreCompletedTransactionsFailedWithError: %@", error); 
} 

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
NSLog(@"paymentQueueRestoreCompletedTransactionsFinished"); 
} 
@end 

按1偉大的工作。我檢索我所有的產品ID。但在激活Press2(Restoring)系統詢問密碼後,調用功能- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error

控制檯說:

11/27/13 4:19:00.022 PM storeagent: promptResponse: <CKSignInPromptResponse:0x7fdefca0b950 returnCode:1> 
11/27/13 4:19:00.552 PM storeagent: LoadCompletedMicroPaymentsOperation: Could not install receipt after fetching completed purchases - Error Domain=ISErrorDomain Code=2 "No receipt." UserInfo=0x7fdefca183f0 {NSLocalizedDescription=No receipt., NSLocalizedFailureReason=receiptAsString was nil} 
11/27/13 4:19:00.554 PM ***mac: restoreCompletedTransactionsFailedWithError: Error Domain=SKErrorDomain Code=0 "Unknown Error." UserInfo=0x1001e7190 {NSLocalizedDescription=Unknown Error.} 

我已經簽署了與應用分發證書(第三方Mac開發者應用:* **)。 沙箱模式被禁用,但我不認爲它是問題的根源。 我沒有在構建中包含embedded.provisionprofile,但我認爲我現在不需要它。

  • 的Xcode 4.6.3 +的Mac OS 10.7.4
  • 的Xcode 5.0 +的Mac OS 10.8.4

回答

0

所以,我終於找到了解決辦法。問題出在測試用戶身上。也許,因爲它們是在我們沒有Mac開發者程序(僅限ios)時創建的,但是在創建新的測試用戶之後,問題消失了。