2011-11-08 34 views
2

私はSKPaymentトランザクションをユーザーのデフォルトまたはデバイスに保存したいと思っています。また、トランザクションデータを後で(まだ完了していない)サーバーに保存して、ユーザーが必要/必要/可能。SKPaymentトランザクションを保存または保存する方法は?

私が午前問題は、私は、ユーザーのデフォルトに保存しようとするが、それは私に告げる保持していることである:

* - [NSUserDefaultsのsetObject:forKey:]:「非プロパティの値を挿入しようと{ トランザクション= ""; } 'クラスの' __NSCFDictionary '。

私が使用するコードは次のとおりです。

// Save 
    NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    [dict setObject:transaction forKey:@"transaction"];  
    [[NSUserDefaults standardUserDefaults] setObject:dict forKey:@"TransactionReceipt"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    // Read  
    NSMutableDictionary *savedDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyTransactionReceipt"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    NSLog(@"Saved stored transaction = %@", savedDict); 

私はまた、トランザクションオブジェクト自体を保存するのではなく、辞書に保管しようとしたが、これは常に与え、それが

を訴えるエラーを与えます私もNSを使用してみました

「非挿入プロパティの値を挿入しようと...」

KeyedArchiverが、私はSKPaymentTransactionの読み書きを処理するためにそれをコード化する方法がわかりませんでした。

これについての助けがあれば幸いです。

ありがとうございます。

答えて

6

私は問題を、ドキュメントディレクトリ内のplistにトランザクションデータを格納することで解決しました。

これは、私の要件にはるかに簡単で、信頼性が大幅に向上しました。

同じことをしたい場合は、基本コードが続きます。

// WRITING   
// Save to documents directory 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *receiptStorageFile = [documentsDirectory stringByAppendingPathComponent:@"receipts.plist"]; 

NSLog(@"Reciept Storage File = %@", receiptStorageFile); 

NSMutableArray *receiptStorage = [[NSMutableArray alloc] initWithContentsOfFile:receiptStorageFile]; 
if(!receiptStorage) { 
    receiptStorage = [[NSMutableArray alloc] init]; 
} 

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
[dict setObject:transaction.transactionIdentifier forKey:@"transactionIdentifier"]; 
[dict setObject:transaction.transactionDate forKey:@"transactionDate"]; 
[dict setObject:transaction.transactionReceipt forKey:@"transactionReceipt"]; 

// Write 
[receiptStorage addObject:dict]; 
[receiptStorage writeToFile:receiptStorageFile atomically:YES]; 
[receiptStorage release]; 


// READING 

// Get app documents directory 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
NSString *documentsDirectory = [paths objectAtIndex:0];    
NSLog(@"DocumentsDirectory = %@", documentsDirectory); 

// Load from documents directory    
NSArray *receipts = [[[NSArray alloc] initWithContentsOfFile:[documentsDirectory stringByAppendingPathComponent:@"receipts.plist"]] autorelease]; 
// Found a receipt on disk 
if ([receipts count]>0) { 
    // Do something, read the dictionary, etc. 
} // end if 
関連する問題