Как связать самодостаточный контент с транзакцией?
Я пытаюсь добавить в приложение функцию покупки в приложении и хочу загрузить содержимое, которое размещаю на своем собственном сервере. RMStore предоставляет API для этого, однако я не мог понять, как это сделать.
Документация гласит:
RMStore делегирует загрузку размещенного на хосте контента через дополнительный
contentDownloader
делегировать. Вы можете предоставить свою собственную реализацию, используяRMStoreContentDownloader
протокол:
- (void)downloadContentForTransaction:(SKPaymentTransaction*)transaction
success:(void (^)())successBlock
progress:(void (^)(float progress))progressBlock
failure:(void (^)(NSError *error))failureBlock;
Вызов
successBlock
если загрузка прошла успешно,failureBlock
если это не так иprogressBlock
уведомить о ходе загрузки. RMStore будет считать, что транзакция завершилась или потерпела неудачу только после того, как делегат загрузчика контента успешно или неудачно загрузил свой контент.
И вот протокол (из RMStore.h):
@protocol RMStoreContentDownloader <NSObject>
/**
Downloads the self-hosted content associated to the given transaction and calls the given success or failure block accordingly. Can also call the given progress block to notify progress.
@param transaction The transaction whose associated content will be downloaded.
@param successBlock Called if the download was successful. Must be called in the main queue.
@param progressBlock Called to notify progress. Provides a number between 0.0 and 1.0, inclusive, where 0.0 means no data has been downloaded and 1.0 means all the data has been downloaded. Must be called in the main queue.
@param failureBlock Called if the download failed. Must be called in the main queue.
@discussion Hosted content from Apple’s server (@c SKDownload) is handled automatically by RMStore.
*/
- (void)downloadContentForTransaction:(SKPaymentTransaction*)transaction
success:(void (^)())successBlock
progress:(void (^)(float progress))progressBlock
failure:(void (^)(NSError *error))failureBlock;
@end
Проще говоря, загружает размещенный самостоятельно контент, связанный с данной транзакцией. Как связать хостинг с транзакцией?
2 ответа
Вот что я сделал. Очевидно, вам нужно добавить RMStore.h
и протокол RMStoreContentDownloader
в классе, где вы запускаете этот метод. Это работает, хотя я не понял, как это управляется progressBlock
(может быть, моя загрузка слишком коротка?)...
- (void)downloadContentForTransaction:(SKPaymentTransaction*)transaction
success:(void (^)())successBlock
progress:(void (^)(float progress))progressBlock
failure:(void (^)(NSError *error))failureBlock
{
//the product purchased
NSString *productID = transaction.payment.productIdentifier;
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
//HERE IS WHERE TO INSERT THE URL
NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
if (error == nil)
NSLog(@"File downloaded to: %@", filePath);
successBlock();
else
NSLog(@"Error in download: %@", error.localizedDescription);
failureBlock();
}];
[downloadTask resume];
[manager setDownloadTaskDidWriteDataBlock:^(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite)
{
float percentDone = (((float)((int)totalBytesWritten) / (float)((int)totalBytesExpectedToWrite))*100);
progressBlock(percentDone);
}];
}
Тогда метод будет вызван RMStore
в нужный момент!
Надеюсь, поможет!
Содержит ли контент, который вы пытаетесь предоставить через покупку в приложении, уникальный для каждой транзакции? Если он уникален для каждой транзакции, вы должны передать идентификатор транзакции на свой сервер и загрузить контент, созданный только для этого идентификатора транзакции. В противном случае для каждой транзакции загружайте контент без передачи идентификатора транзакции. В обоих случаях вы должны вызывать successBlock или failBlock в конце процесса загрузки. При желании вы можете вызывать progressBlock каждый раз, когда хотите обновить прогресс.