Как мне справиться с неудачной загрузкой SKDownload? - PullRequest
0 голосов
/ 01 февраля 2019

При обработке SKDownload обновлений я не уверен, как реагировать на состояние .failed.

Я видел руководство, опубликованное на форуме разработчиков Apple , но это подразумевает, что я должен дождаться выхода пользователя и перезапустить приложение, чтобы возобновить загрузку.

Позже, когда пользователь перезапускает приложение и метод addTransactionObserver вызывается во время запуска, наблюдатель транзакции обнаружит не завершенную транзакцию и уведомит приложение через метод делегата updatedTransactions.Приложение может снова повторить попытку загрузки размещенного содержимого.

Противоречие с тем, что в этом руководстве я получил указание сделать обратное и завершить транзакцию, чтобы позволить пользователюповторите попытку загрузки, восстановив покупку.

Существует несколько способов улучшить взаимодействие с пользователем, даже если загрузка не удалась ... ... Мы можем завершить транзакцию, и пользователь сможет использоватькнопка восстановления для загрузки файлов.

Если мы дадим пользователю параметры, транзакция не должна быть завершена, пока мы не уверены, что мы больше ее не используем (например, если вы планируете возобновить загрузку позже,не завершайте транзакцию).

Это означает, что я могу возобновить неудачную загрузку.Это возможно?

Мой paymentQueue: updatedDownloads метод приведен ниже:

public func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) {
    downloads.forEach ({ (download) -> Void in
        switch download.state {
        case .active:
            // Update the UI to allow user to pause/cancel download
        case .cancelled:
            // Update UI to show download cancelled
            queue.finishTransaction(download.transaction)
        case .failed:
            let description = download.error?.localizedDescription
            //  <-------------------- retry the download? What should I do here?
        case .finished:
            // Update the UI to reflect download complete
            queue.finishTransaction(download.transaction)
        case .paused:
            // Update the UI to allow user to resume download
        case .waiting:
            // Begin download immediately, on advice of: https://stackoverflow.com/a/23602553/3718806
            queue.start([download])
        }
    })
}

Я ожидаю, что мои пользователи смогут повторить неудачную загрузку, не перезапуская приложение.

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

В случае, если это кому-нибудь поможет, я решил:

  1. Завершите транзакцию, поскольку именно это Apple рекомендует , и у нас, похоже, нет выбора*
  2. Отображение сообщения об ошибке для пользователя, поскольку всегда будет один
  3. Замените кнопку «Купить» кнопкой «Повторная загрузка».(т. е. притвориться, что пользователь успешно загрузил содержимое, а затем удалил его)
  4. Когда нажата кнопка «повторная загрузка», попытайтесь приобрести ее снова, и пусть storekit автоматически откажется дважды взимать плату с пользователя и предложит разрешитьони снова загружают контент.

Код ниже:

public func paymentQueue(_ queue: SKPaymentQueue, updatedDownloads downloads: [SKDownload]) {
    downloads.forEach ({ (download) -> Void in
        switch download.state {
        ...
        case .failed:
            queue.finishTransaction(download.transaction)
            let description = download.error!.localizedDescription
            // show error to user
            // change 'buy' button text to read 'redownload'
        ...
        }
    })
}

// later, when 'redownload' is tapped to buy the same SKProduct
    let payment = SKPayment(product: product)
    SKPaymentQueue.default().add(payment)

Примечания:

*, поскольку нет способа возобновить неудачную загрузку (насколько я могу)Скажите, кто-то, пожалуйста, поправьте меня, если я ошибаюсь).

SKPaymentQueue.default().add(SKPayment(product: skProduct)) безопасен, потому что StoreKit представит использование с предупреждением «Вы уже приобрели это. Вы хотите получить его снова длябесплатно? », именно это я и хочу.Когда пользователь примет это, он начнет загрузку снова.

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

0 голосов
/ 01 февраля 2019
for download in downloads {  

    switch download.downloadState {  

    case .active:  
        // deal with active  

        break  
    case .failed:  
    // inform the user the download failed  

    // should I close the transaction here? ie:  
    SKPaymentQueue.default().finishTransaction(download.transaction)  

    break  
  // cut code...  
    }  

} // end each download  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...