A lightweight iOS library for In-App Purchases.
RMStore 向 StoreKit 添加了 blocks 和 notifications,以及 receipt verification、content downloads 和 transaction persistence。所有这些都在一个类中,没有外部依赖。购买产品就像
[[RMStore defaultStore] addPayment:productID success:^(SKPaymentTransaction *transaction) {
NSLog(@"Purchased!");
} failure:^(SKPaymentTransaction *transaction, NSError *error) {
NSLog(@"Something went wrong");
}];
使用 CocoaPods
pod 'RMStore', '~> 0.7'
或者如果您手动进行,请从 RMStore 目录添加文件。
有关更多选项,请查看 wiki。
RMStore 向所有异步 StoreKit 操作添加了 blocks。
NSSet *products = [NSSet setWithArray:@[@"fabulousIdol", @"rootBeer", @"rubberChicken"]];
[[RMStore defaultStore] requestProducts:products success:^(NSArray *products, NSArray *invalidProductIdentifiers) {
NSLog(@"Products loaded");
} failure:^(NSError *error) {
NSLog(@"Something went wrong");
}];
[[RMStore defaultStore] addPayment:@"waxLips" success:^(SKPaymentTransaction *transaction) {
NSLog(@"Product purchased");
} failure:^(SKPaymentTransaction *transaction, NSError *error) {
NSLog(@"Something went wrong");
}];
[[RMStore defaultStore] restoreTransactionsOnSuccess:^(NSArray *transactions){
NSLog(@"Transactions restored");
} failure:^(NSError *error) {
NSLog(@"Something went wrong");
}];
[[RMStore defaultStore] refreshReceiptOnSuccess:^{
NSLog(@"Receipt refreshed");
} failure:^(NSError *error) {
NSLog(@"Something went wrong");
}];
RMStore 发送 StoreKit 相关事件的提醒,并扩展 NSNotification
以提供相关信息。要接收它们,请实现 RMStoreObserver
协议的所需方法并将观察者添加到 RMStore
。
[[RMStore defaultStore] addStoreObserver:self];
...
[[RMStore defaultStore] removeStoreObserver:self];
- (void)storeProductsRequestFailed:(NSNotification*)notification
{
NSError *error = notification.rm_storeError;
}
- (void)storeProductsRequestFinished:(NSNotification*)notification
{
NSArray *products = notification.rm_products;
NSArray *invalidProductIdentifiers = notification.rm_invalidProductIdentififers;
}
在请求付款或每次恢复交易后,都会发送付款交易通知。
- (void)storePaymentTransactionFinished:(NSNotification*)notification
{
NSString *productIdentifier = notification.rm_productIdentifier;
SKPaymentTransaction *transaction = notification.rm_transaction;
}
- (void)storePaymentTransactionFailed:(NSNotification*)notification
{
NSError *error = notification.rm_storeError;
NSString *productIdentifier = notification.rm_productIdentifier;
SKPaymentTransaction *transaction = notification.rm_transaction;
}
// iOS 8+ only
- (void)storePaymentTransactionDeferred:(NSNotification*)notification
{
NSString *productIdentifier = notification.rm_productIdentifier;
SKPaymentTransaction *transaction = notification.rm_transaction;
}
- (void)storeRestoreTransactionsFailed:(NSNotification*)notification;
{
NSError *error = notification.rm_storeError;
}
- (void)storeRestoreTransactionsFinished:(NSNotification*)notification
{
NSArray *transactions = notification.rm_transactions;
}
适用于 Apple 主办和自托管的下载
- (void)storeDownloadFailed:(NSNotification*)notification
{
SKDownload *download = notification.rm_storeDownload; // Apple-hosted only
NSString *productIdentifier = notification.rm_productIdentifier;
SKPaymentTransaction *transaction = notification.rm_transaction;
NSError *error = notification.rm_storeError;
}
- (void)storeDownloadFinished:(NSNotification*)notification;
{
SKDownload *download = notification.rm_storeDownload; // Apple-hosted only
NSString *productIdentifier = notification.rm_productIdentifier;
SKPaymentTransaction *transaction = notification.rm_transaction;
}
- (void)storeDownloadUpdated:(NSNotification*)notification
{
SKDownload *download = notification.rm_storeDownload; // Apple-hosted only
NSString *productIdentifier = notification.rm_productIdentifier;
SKPaymentTransaction *transaction = notification.rm_transaction;
float progress = notification.rm_downloadProgress;
}
仅适用于由Apple托管下载
- (void)storeDownloadCanceled:(NSNotification*)notification
{
SKDownload *download = notification.rm_storeDownload;
NSString *productIdentifier = notification.rm_productIdentifier;
SKPaymentTransaction *transaction = notification.rm_transaction;
}
- (void)storeDownloadPaused:(NSNotification*)notification
{
SKDownload *download = notification.rm_storeDownload;
NSString *productIdentifier = notification.rm_productIdentifier;
SKPaymentTransaction *transaction = notification.rm_transaction;
}
- (void)storeRefreshReceiptFailed:(NSNotification*)notification;
{
NSError *error = notification.rm_storeError;
}
- (void)storeRefreshReceiptFinished:(NSNotification*)notification { }
RMStore默认不执行收据验证,但提供参考实现。您可以实现自己的自定义验证或使用库提供的参考验证器。
以下概述了两种选项。更多信息,请查看wiki。
RMStore通过RMStoreAppReceiptVerificator
(用于iOS 7或更高版本)和RMStoreTransactionReceiptVerificator
(用于iOS 6或更低版本)提供收据验证。要使用其中任何一个,请将RMStore/Optional中的对应文件添加到您的项目中,并在启动时设置验证器代理(receiptVerificator
)。例如
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
_receiptVerificator = iOS7OrHigher ? [[RMStoreAppReceiptVerificator alloc] init] : [[RMStoreTransactionReceiptVerificator alloc] init];
[RMStore defaultStore].receiptVerificator = _receiptVerificator;
// Your code
return YES;
}
如果安全性是关注点,您可能想要避免使用开源验证逻辑,并提供自己的自定义验证器。
RMStore将收据验证委托给您,您可以使用RMStoreReceiptVerificator
协议提供自己的实现
- (void)verifyTransaction:(SKPaymentTransaction*)transaction
success:(void (^)())successBlock
failure:(void (^)(NSError *error))failureBlock;
如果收据通过验证,请调用successBlock
;如果未通过,请调用failureBlock
。如果验证无法完成(例如,由于连接问题),则必须使用代码RMStoreErrorCodeUnableToCompleteVerification
的error
,以防止RMStore完成事务。
您还需要根据上述指示,在启动时设置receiptVerificator
代理。
RMStore会自动下载由Apple托管的内容,并提供自托管内容的代理。
当购买或恢复产品时,由Apple托管的内容(代码SKDownload
)将自动下载。RMStore将通过调用storeDownloadUpdate:
和最终调用storeDownloadFinished:
来通过通知观察者下载进度。此外,RMStore还会在下载暂停、取消或失败时通知。
RMStore只有在处理完所有的下载之后才会通知交易完成或失败。如果使用块,它们也会在之后被调用。恢复交易也适用同样的原则。
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将交易持久化委托给人,并提供两个可选的参考实现,用于在密钥链中或在NSUserDefaults
中存储交易。您可以实现自己的交易、使用库提供的参考实现,或者在非消耗品和自动续订订阅的情况下,直接从收据中获取交易。
更多信息,请查看wiki。
RMStore 需要 iOS 5.0 或更高版本和 ARC。
RMStore 处于初期开发阶段,其公共 API 不可视为稳定。未来的增强将包括:
版权所有 2013-2014 Robot Media SL
遵循 Apache 许可协议第 2.0 版(“协议”);除非您遵守该许可证或书面同意,否则不得使用此文件。您可以在以下网址获取许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则在本许可证下分发的软件按照“按原样”的基础分发,不存在任何明示或暗示的保证或条件。有关许可证的具体语言,请参阅许可证,以了解关于授权和限制的具体规定。