2011-11-08 95 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