iOS 应用内购买订阅从 SKProduct 获得免费试用期长度

标签 ios in-app-purchase storekit in-app-subscription skproduct

我正在处理带有订阅的应用内购买。 很快,您可以像这样从 SKProduct 获取价格和价格区域设置:

weeklyProduct.price.doubleValue  
weeklyProduct.priceLocale.currencySymbol

其中 weeklyProduct 是 SKProduct。

是否可以获得免费试用期?例如,我为产品指定了两周的免费试用期。我可以从 SKProduct 得到这个吗?

最佳答案

我已经使用 DateComponentsFormatter 解决了这个问题,这为您节省了大量时间来本地化不同的语言以及处理复数等等。 这可能看起来像很多代码,但我希望它能在未来节省我的时间。

import Foundation

class PeriodFormatter {
    static var componentFormatter: DateComponentsFormatter {
        let formatter = DateComponentsFormatter()
        formatter.maximumUnitCount = 1
        formatter.unitsStyle = .full
        formatter.zeroFormattingBehavior = .dropAll
        return formatter
    }

    static func format(unit: NSCalendar.Unit, numberOfUnits: Int) -> String? {
        var dateComponents = DateComponents()
        dateComponents.calendar = Calendar.current
        componentFormatter.allowedUnits = [unit]
        switch unit {
        case .day:
            dateComponents.setValue(numberOfUnits, for: .day)
        case .weekOfMonth:
            dateComponents.setValue(numberOfUnits, for: .weekOfMonth)
        case .month:
            dateComponents.setValue(numberOfUnits, for: .month)
        case .year:
            dateComponents.setValue(numberOfUnits, for: .year)
        default:
            return nil
        }

        return componentFormatter.string(from: dateComponents)
    }
}

需要将SKProduct周期单位转换为NSCalendarUnit

import StoreKit

@available(iOS 11.2, *)
extension SKProduct.PeriodUnit {
    func toCalendarUnit() -> NSCalendar.Unit {
        switch self {
        case .day:
            return .day
        case .month:
            return .month
        case .week:
            return .weekOfMonth
        case .year:
            return .year
        @unknown default:
            debugPrint("Unknown period unit")
        }
        return .day
    }
}

您可以像这样从 SubscriptionPeriod 中调用它:

import StoreKit

@available(iOS 11.2, *)
extension SKProductSubscriptionPeriod {
    func localizedPeriod() -> String? {
        return PeriodFormatter.format(unit: unit.toCalendarUnit(), numberOfUnits: numberOfUnits)
    }
}

您可以像这样依次从 SKProductDiscount 调用它。请注意,我暂时没有实现其他付款方式。

import StoreKit

@available(iOS 11.2, *)
extension SKProductDiscount {
    func localizedDiscount() -> String? {
        switch paymentMode {
        case PaymentMode.freeTrial:
            return "Free trial for \(subscriptionPeriod.localizedPeriod() ?? "a period")"
        default:
            return nil
        }
    }
}

关于iOS 应用内购买订阅从 SKProduct 获得免费试用期长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45825091/

相关文章:

iOS:如何为客户订阅自动续订订阅

ios - DrawRect 覆盖 View 的属性

ios - UIDatePicker 不响应 setDate

iOS 应用内购买 : executing code after App Store's "Buy" confirmation button is tapped but before user is charged

ios - 在我的iOS应用中恢复应用内购买方式

ios - 如何恢复非续订的 Apple 订阅

ios - SKReceiptRefreshRequest 在带有 .storekit 配置文件的 Xcode 12.2 中总是失败

ios - 苹果拒绝了新版本的应用程序

ios - 执行展开转场后新数据未更新

iphone - 何时使用 restoreCompletedTransactions 进行应用内购买?