zar*_*don 2 transactions save nsuserdefaults storekit ios
我想将SKPayment交易存储在用户默认值或设备上,我还想将交易数据存储在我的服务器上以后(尚未完成),以便用户可以在需要时恢复订阅/必要/可能.
我遇到的问题是我尝试保存到用户默认值,但它一直告诉我:
* - [NSUserDefaults setObject:forKey:]:尝试插入非属性值'{transaction =""; ''类'__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);
Run Code Online (Sandbox Code Playgroud)
我也尝试保存Transaction对象本身,而不是将其存储在字典中,但这总是会给出错误,它会抱怨它
"尝试插入非插入属性值..."
我也尝试过使用NSKeyedArchiver,但我不知道如何编写它来处理SKPaymentTransaction的读写.
任何有关这方面的帮助将非常感激.
谢谢.
我已经通过将事务数据存储在文档目录中的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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2267 次 |
| 最近记录: |