RMStore 0.7.1

RMStore 0.7.1

测试已测试
Lang语言 Obj-CObjective C
许可证 Apache 2
发布上次发布2014年12月

Hermes Pique 维护。



RMStore 0.7.1

Build Status

A lightweight iOS library for In-App Purchases.

RMStore 向 StoreKit 添加了 blocksnotifications,以及 receipt verificationcontent downloadstransaction 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

带有 blocks 的 StoreKit

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");
}];

刷新收据(仅限 iOS 7+)

[[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;
}

下载通知(仅限 iOS 6+)

适用于 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;
}

刷新收据通知(仅限iOS 7以上)

- (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。如果验证无法完成(例如,由于连接问题),则必须使用代码RMStoreErrorCodeUnableToCompleteVerificationerror,以防止RMStore完成事务。

您还需要根据上述指示,在启动时设置receiptVerificator代理。

下载内容

RMStore会自动下载由Apple托管的内容,并提供自托管内容的代理。

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

除非适用法律要求或书面同意,否则在本许可证下分发的软件按照“按原样”的基础分发,不存在任何明示或暗示的保证或条件。有关许可证的具体语言,请参阅许可证,以了解关于授权和限制的具体规定。