Как сохранить или сохранить транзакцию SKPayment? - PullRequest
2 голосов
/ 08 ноября 2011

Я хотел бы сохранить транзакцию 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);

Я также пытался сохранить сам объект транзакции, а не сохранять его в словаре, но это всегда выдает ошибку, когда он жалуется на

"Попытка вставить значение свойства без вставки ..."

Я также пытался использовать NSKeyedArchiver, но я не знал, как его кодировать, чтобы обрабатывать чтение и запись транзакции SKPaymentTransaction.

Любая помощь по этому вопросу была бы очень признательна.

Спасибо.

1 Ответ

6 голосов
/ 08 ноября 2011

Я решил проблему, сохранив данные транзакции в списке в каталоге документов.

Это было намного проще и намного надежнее для моих требований.

Ниже приведен базовый код дляжелающие сделать то же самое.

// 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
...