Настройка семейного доступа для покупок в приложении в iOS

#ios #storekit

#iOS #storekit

Вопрос:

Apple только что выпустила Family Sharing для покупок в приложении, я пытаюсь добавить это в свои приложения с помощью автоматически возобновляемых подписок, но безуспешно.

Из видео WWDC2020 они говорят, что все должно работать как по волшебству без изменений кода, но не для меня, я думаю. Даже после восстановления покупки на устройстве члена семьи ничего не происходит.

Нужна ли мне какая-либо дополнительная настройка только для того, чтобы заставить его работать?

У меня есть логика восстановления / покупки, реализованная в приложении следующим образом:

 public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        switch transaction.transactionState {
            case .purchased:
                complete(transaction: transaction)
                break
            case .failed:
                fail(transaction: transaction)
                break
            case .restored:
                restore(transaction: transaction)
                break
            case .deferred:
                break
            case .purchasing:
                break
        }
    }
}

private func complete(transaction: SKPaymentTransaction) {
    print("complete...")
    deliverPurchaseNotificationFor(identifier: transaction.payment.productIdentifier)
    SKPaymentQueue.default().finishTransaction(transaction)
    promotedPayment = nil
}

private func restore(transaction: SKPaymentTransaction) {
    guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }
    print("restore... (productIdentifier)")
    deliverPurchaseNotificationFor(identifier: productIdentifier)
    SKPaymentQueue.default().finishTransaction(transaction)
}

private func fail(transaction: SKPaymentTransaction) {
    print("fail...")
    if let transactionError = transaction.error as NSError? {
        if transactionError.code != SKError.paymentCancelled.rawValue {

            let failedString = "Transaction Error: (String(describing: transaction.error?.localizedDescription ?? ""))"
            print(failedString)

            NotificationCenter.default.post(name: NSNotification.Name(rawValue: IAPHelper.failedNotification), object: failedString)
        }
    }

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: IAPHelper.failedNotification), object: nil)
    SKPaymentQueue.default().finishTransaction(transaction)
    promotedPayment = nil
}

private func deliverPurchaseNotificationFor(identifier: String?) {
    guard let identifier = identifier else { return }

    purchasedProductIdentifiers.insert(identifier)
    UserDefaults.standard.set(true, forKey: identifier)
    UserDefaults.standard.synchronize()
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: IAPHelper.purchaseNotification), object: identifier)
}