MST

星途 面试题库

面试题:Objective-C 开发的 iOS 应用发布到 App Store 时,如何处理应用内购买相关的合规性

假设你用Objective-C开发了一款带有应用内购买功能的iOS应用,阐述发布到App Store时,针对应用内购买方面需要遵循哪些苹果的规则和指南,以及在代码层面如何确保合规,例如验证购买凭证等。
21.6万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

苹果应用内购买规则和指南

  1. 购买类型:仅可使用苹果提供的应用内购买API进行虚拟商品、订阅等购买,禁止使用第三方支付处理应用内购买。
  2. 定价:价格需遵循苹果设定的价格层级,不可绕过应用内购买机制提供折扣或促销,除非通过苹果认可的订阅促销功能。
  3. 用户体验:购买流程应清晰、简洁,不得误导用户购买。不得强制用户进行应用内购买以继续使用应用核心功能,除非应用属于“基于订阅的服务”类别。
  4. 内容审核:应用内购买的商品或服务内容必须符合苹果的内容审核指南,不得包含色情、暴力、非法等内容。
  5. 退款政策:应遵循苹果的退款政策,对于符合条件的用户退款请求应及时处理。

代码层面确保合规

  1. 验证购买凭证
    • 获取购买凭证:购买完成后,应用会收到一个交易对象,从中获取购买凭证。在Objective - C中,可通过以下方式获取:
SKPaymentTransaction *transaction;
NSData *receipt = transaction.transactionReceipt;
- **验证凭证**:有两种验证方式,沙盒环境验证和生产环境验证。将凭证发送到苹果的验证服务器。
    - **沙盒环境验证**:
NSString *sandboxURLString = @"https://sandbox.itunes.apple.com/verifyReceipt";
NSMutableURLRequest *sandboxRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:sandboxURLString]];
sandboxRequest.HTTPMethod = @"POST";
NSDictionary *requestContents = @{@"receipt-data": [receipt base64EncodedStringWithOptions:0]};
sandboxRequest.HTTPBody = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:nil];
NSURLSessionDataTask *sandboxTask = [[NSURLSession sharedSession] dataTaskWithRequest:sandboxRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (data) {
        NSError *jsonError;
        NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
        if (!jsonError) {
            // 处理验证结果
        }
    }
}];
[sandboxTask resume];
    - **生产环境验证**:只需将验证URL替换为生产环境URL:`https://buy.itunes.apple.com/verifyReceipt`,验证逻辑类似。

2. 处理交易状态: - 监听交易状态变化,在SKPaymentTransactionObserver协议的实现方法中处理不同状态。例如:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:
                // 完成交易,提供商品或服务
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                // 处理交易失败
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                // 处理恢复购买
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
            default:
                break;
        }
    }
}
  1. 防止重复购买:在处理购买完成逻辑时,记录已完成的购买,当有新的购买请求时,先检查是否已经购买过,避免重复提供商品或服务。可使用本地存储(如NSUserDefaults或数据库)记录购买信息。