MIT License

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

深度技术分析:XYIAPKit

项目背景与痛点

苹果内购系统一直是 iOS 生态中不可或缺的一环,但使用传统的 SKPaymentQueue 等 API 进行内购实现不仅复杂,还容易出错。显而易见的问题包括票据校验、订阅续订检测、Auto-Renewable подписок и т.д. XYIAPKit 的出现,旨在简化这个过程。它通过提供一系列封装良好的接口,使得开发者能够快速实现内购组件,同时确保了安全性和易用性。

核心技术揭秘

XYIAPKit 架构设计合理且层次分明,其核心逻辑可概括为问号:产品列表的查询与展示、购买流程的管理、购买票据的校验、订阅状态的监控,以及用户交易的持久化。框架使用了单例模式确保全局唯一性,使得内购逻辑的调用变得轻松便捷。

技术栈与设计模式

  • Swift:作为编写基础框架的主要语言,Swift 本身就提供了丰富的类型安全和表现力,这使得 XYIAPKit 在构建过程中能够更加高效,同时提供更稳定可靠的功能实现。
  • 闭包:在许多关键点上,通过闭包来传递复杂逻辑,如票据校验的所有者实现与回调。
  • 观察者模式:在订阅过期状态监测中应用,以确保客户端能够实时接收到更新和通知。

数据流解析

仔细考察框架的内部逻辑,我们可以推断出以下数据流:

graph TD A[用户发起购买请求] --> B[App Framework Manager] B --> C[数据流框架组件] C --> D{"处理类型?"} D -->|"购买请求"| E[处理购买] D -->|"状态更新"| F[处理状态更新] E --> G[创建票据] F --> H[订阅状态管理] G --> I[上传票据] H --> I I --> J[持久化交易记录] J --> K[反馈用户]

功能亮点与差异

XYIAPKit 虽然未必是唯一,但它确实提供了同类竞品中的一些独特功能点:

  • 自动续费检测:精准跟踪订阅状态,减少用户因未能及时续订而导致的误操作。
  • 票据校验功能:有效保护应用的收入安全,增强内购机制的可靠性。
  • 持久化交易记录:确保所有交易活动都有迹可循,便于财务审计和用户查询需求。
  • 简洁易用的接口设计:减少了开发者应对苹果内购复杂性的困扰,能够快速上手并有效集成。

应用场景与落地建议

适用场景

适用的场景包括但不限于:

  • 订阅型应用,如电子杂志或在线视频服务。
  • 内容丰富的游戏应用,以内购途径获得游戏道具或扩展游戏内容。

开发者在使用时需要注意的点包括需求管理和调用量控制。XYIAPKit 尽管强大,但并非适用于所有类型的业务需求,合理评估和匹配自己的应用场景是成功的关键。

风险与挑战
  • 苹果系统的瞬息万变:务必定期更新与苹果官方最新的业务逻辑保持一致,以避免不必要的技术债务。
  • 票据验证的时效性:需要实时更新票据校验逻辑,确保用户支付请求的安全。

综合评价

XYIAPKit 在解决苹果内购复杂性的问题上有突破性进展,但它也公开了一些技术难点,特别是在票据校验和订阅状态管理上。框架十分适合那些希望快速上手并有效实现内购功能的应用。不过,开发者在使用时应该有所选择,确保契合自己的产品需求。总体来说,这是一个具备高度实用性与开发效率提升潜力的框架,值得广大开发者一同探索和应用。

简要分析

热度分
778
价值分
240
活跃状态
活跃

语言占比

Objective-C
Ruby

Release

贡献者

README

XYIAPKit

CI Status Version License Platform

iOS内购编程指南

Example

To run the example project, clone the repo, and run pod install from the Example directory first.

Requirements

Installation

XYIAPKit is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'XYIAPKit'

功能

1、内购的基本功能,产品列表查询、添加购买、恢复购买

2、票据校验、自动续费订阅过期检测

3、交易记录保存

使用方法

1、查询在线商品

/**
 请求在线商品,并存储于内存中

 @param identifiers 产品id
 */
- (void)requestProducts:(NSSet*)identifiers
                success:(void (^)(NSArray *products, NSArray *invalidProductIdentifiers))successBlock
                failure:(void (^)(NSError *error))failureBlock;

#########################################################################################################

	NSSet *set = [[NSSet alloc] initWithArray:@[@"1", @"2", @"3", @"4", @"5", @"6"]];
    [[XYStore defaultStore] requestProducts:set
                                    success:^(NSArray *products, NSArray *invalidProductIdentifiers)
     {

     } failure:^(NSError *error) {

     }];

2、添加购买

    [[XYStore defaultStore] addPayment:productId
                               success:^(SKPaymentTransaction *transaction)
    {

        
    } failure:^(SKPaymentTransaction *transaction, NSError *error) {

    }];

3、恢复内购

[[XYStore defaultStore] restoreTransactionsOnSuccess:^(NSArray *transactions) {
        
        NSLog(@"restore === %@", transactions);
    } failure:^(NSError *error) {
        NSLog(@"restore error === %@", error);
    }];

4、添加票据校验

1)、外部票据校验(可以通过信任的服务器进行校验)
创建校验对象(建议创建单例对象,以便监听),遵守XYStoreReceiptVerifier协议
- (void)verifyTransaction:(SKPaymentTransaction *)transaction
                  success:(void (^)(void))successBlock
                  failure:(void (^)(NSError *))failureBlock
{
    __weak typeof(self) weakSelf = self;
    [[XYStore defaultStore] base64Receipt:^(NSString *base64Data) {
        
        [[XYStore defaultStore] fetchProduct:transaction.payment.productIdentifier
                                     success:^(SKProduct *product)
         {
         	//外部校验请求
             [weakSelf callBackApple:product
                         receiptData:base64Data
                             success:successBlock
                             failure:failureBlock];
             
         } failure:failureBlock];
        
    } failure:failureBlock];
}
在`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions `中注册票据校验
	// 在此设置内购的票据校验,防止掉单问题的发生
    [[XYStore defaultStore] registerReceiptVerifier:[XYAppReceiptVerifier shareInstance]];
2)、APP内部校验

podfile中添加`pod 'XYIAPKit/iTunesReceiptVerify', '~> 0.8.0'`
引入票据校验的sdk

在`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions `中注册票据校验
	// 在此设置内购的票据校验,防止掉单问题的发生
    [[XYStore defaultStore] registerReceiptVerifier:[XYStoreiTunesReceiptVerifier shareInstance]];
XYStoreiTunesReceiptVerifier中提供对自动续期产品的订阅过期的判断
	/**
 @ 适用自动续期订阅
 
 判断是否已订阅
 若果是非自动续费型商品,直接返回NO

 @param productId 自动续期订阅产品id
 @return YES:  NO:未订阅或者订阅过期
 */
- (BOOL)isSubscribedWithAutoRenewProduct:(NSString *)productId;
也提供 针对持续有效的产品,Apple返回的票据记录中会一直保留其票据信息,可以通过票据记录判断是否有效
/**
 针对持续有效的产品,Apple返回的票据记录中会一直保留其票据信息,可以通过票据记录判断是否有效
 支持:1、非续期订阅 2、非消耗型项目
 
 注:消耗型项目一旦完成,不会长期保留在票据信息中
 
 @param productId 产品id
 @return YES:消费有效 NO:无效
 */
- (BOOL)isValidWithPersistentProductId:(NSString *)productId;

5、添加交易记录存储 1)、存储在NSUserDefaults podfile中添加pod 'XYIAPKit/UserDefaultPersistence', :'~> 0.8.0'

在`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions `中注册票据校验
	// 在此设置内购的票据校验,防止掉单问题的发生
    [[XYStore defaultStore] registerTransactionPersistor:[XYStoreUserDefaultsPersistence shareInstance]];

2)、存储于Keychain中
	podfile中添加`pod 'XYIAPKit/KeychainPersistence', '~> 0.8.0'`

在`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions `中注册票据校验
	// 在此设置内购的票据校验,防止掉单问题的发生
    [[XYStore defaultStore] registerTransactionPersistor:[XYStoreKeychainPersistence shareInstance]];

Author

1073605877

License

XYIAPKit is available under the MIT license. See the LICENSE file for more info.

With reference to RMStore

Copyright issues, notice as soon as possible

评论

暂无评论