面试题答案
一键面试苹果应用内购买规则和指南
- 购买类型:仅可使用苹果提供的应用内购买API进行虚拟商品、订阅等购买,禁止使用第三方支付处理应用内购买。
- 定价:价格需遵循苹果设定的价格层级,不可绕过应用内购买机制提供折扣或促销,除非通过苹果认可的订阅促销功能。
- 用户体验:购买流程应清晰、简洁,不得误导用户购买。不得强制用户进行应用内购买以继续使用应用核心功能,除非应用属于“基于订阅的服务”类别。
- 内容审核:应用内购买的商品或服务内容必须符合苹果的内容审核指南,不得包含色情、暴力、非法等内容。
- 退款政策:应遵循苹果的退款政策,对于符合条件的用户退款请求应及时处理。
代码层面确保合规
- 验证购买凭证:
- 获取购买凭证:购买完成后,应用会收到一个交易对象,从中获取购买凭证。在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;
}
}
}
- 防止重复购买:在处理购买完成逻辑时,记录已完成的购买,当有新的购买请求时,先检查是否已经购买过,避免重复提供商品或服务。可使用本地存储(如
NSUserDefaults
或数据库)记录购买信息。