Pull to refresh

Comments 7

Спасибо, полезно глянуть на основные принципы, собранные в одном месте, что-то руки не доходили.
private func requestProducts(completion: @escaping (RequestProductsResult) -> Void) {
        productsRequestCallback = completion

        productRequest?.cancel()

        let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers)
        productRequest.delegate = self
        productRequest.start()

        self.productRequest = productRequest
    }
}


Есть предложение.

Если уж пишите tutorial, писать его на максимально корректных примерах, потому что те, то будет этому tutorial доверять, будут брать код отсюда как есть.

Во все не вникал, но вот, например, этот пример отлично демонстрирует как написать не надежный код, который будет ломаться если случится ситуация, когда второй вызов requestProducts случится до того, как отработает первый.

Можно было бы сказать, что эта ситуация не рассматривалась вовсе и пусть думают сами, но ведь вызов
productRequest?.cancel()
присутствует, что говорит о том, что данная функция позволяет вызывать ее несколько раз подряд.

Так вот проблема здесь в том, что completion (который в доке часто обызвают в completionHandler, но то спорный момент) просто сохраняется, заменяя собой предыдущий, но не вызывая предыдущий.

Если писать код хорошо, нужно либо не допускать таких ситуаций, либо бросать ошибку в предыдущий completion до того, как он затрется, либо просто их накапливать.

В текущей же реализации код, который вызвал requestProducts ранее, просто не получит ответа через completion и окажется в вечном ожидании.
Спасибо за замечение, 100% верное! Хотели показать более простую реализацию, но в итоге дописали, чтобы копипаста была надежной)
Очень интересная статья. А как всё это использовать в приложении на фреймворке SwiftUI и с consumable-покупками? Извините что такие вопросы задаю. Пробую Ваш пример применить — вылетают ошибки. Да и UIKit не изучал. Разработку начал изучать со SwiftUI.

Спасибо за статью.
Я только не совсем понял - вводная цена всегда будет активироваться для нового юзера при покупке? А если юзер хочет сразу без Trial - то нужно завести вторую подписку?

А если пользователь уже когда-то ставил - Trial не активируется сам по себе?

Introductory pricing всегда активируется по умолчанию, в отличие от Promotional Offers вы не можете контролировать кому показывать, а кому не показывать. То есть, если вы хотите показывать без триала, то надо сделать вторую покупку либо у первой отключить триал.

Если у пользователя был триал, а потом он опять активировал подписку, триал не сработает, так как он уже был израсходован (это все в рамках одной подписки).
Sign up to leave a comment.