- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想将 SKPayment 交易存储在用户默认设置或设备上,我还想在以后(尚未完成)将交易数据存储在我的服务器上,以便用户可以恢复订阅如果需要/必要/可能的话。
我遇到的问题是我尝试保存到用户默认值,但它一直告诉我:
* -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '{ transaction = ""; }' of class '__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);
我还尝试保存事务对象本身而不是将其存储在字典中,但这总是给出错误,它会提示
"Attempt to insert non-insert property value ..."
我也尝试过使用 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
关于ios - 如何保存或存储 SKPayment 交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8050646/
我遇到了严重的问题,我正在处理应用内购买,当我第一次尝试购买时,它工作正常,第二次我的completeTransaction 调用了两次..我不知道为什么会遇到这个问题。 收到收据后,我调用我的验证方
我有一个问题,即使我打电话[[SKPaymentQueue defaultQueue] finishTransaction: 交易];付款不会从默认队列中删除。 我在默认支付队列上安装了 paymen
应用内购买在我的应用中正常运行。我什至使用自己的服务器来验证交易收据。 但是,我似乎遇到了 SKPaymentQueue TransactionObserver 和/或 DefaultQueue 的问
我正在为 iPhone 应用程序进行应用内购买。 我想在 UILabel 中以用户本地货币显示价格。为此,我需要变量中的价格和货币。 如何使用 SKPayment 获取包含货币的价格? (如果 SKP
我还没有在我的应用程序中完成交易,所以当我尝试使用这个 ID 购买应用程序内时,我收到了这条消息: this in app purchase has already been bought it wi
我想将 SKPayment 交易存储在用户默认设置或设备上,我还想在以后(尚未完成)将交易数据存储在我的服务器上,以便用户可以恢复订阅如果需要/必要/可能的话。 我遇到的问题是我尝试保存到用户默认值,
我们可以分配 skpayment applicationusername 吗? 应用内购买完成后,我在 SKPayment 中得到一个空的 applicationUsername。 如何为 SKPay
关于 SKPayment.applicationUsername,它说 here ... This is used to help the store detect irregular activit
应用内购买的所有教程都使用 SKPayments 类的弃用方法“paymentWithProductIdentifier”。还有其他选择吗? 最佳答案 是的,使用+paymentWithProduct
我正在构建一个带有 IAP(自动续订订阅)的应用程序。工作流程似乎工作正常,IPA 已创建(在 iTunes 连接中),沙盒用户也已登录。IAP 产品 ID 也正确,但我收到错误(来自 SKPayme
如果我需要添加一个事务观察器,以及是否需要删除事务观察器,以及这一切在哪里以及是什么,我都在苦苦挣扎...... 我继承的代码包括带有观察者的应用程序委托(delegate)...AppDelegat
给定一个 SKPaymentTransaction 有没有办法得到 SKProduct? 我正在尝试实现一个通用的 SKPaymentTransactionObserver,它将允许我的应用程序收到发
我是一名优秀的程序员,十分优秀!