La descarga de iAP Hosted Content se acumula en SKDownloadStateWaiting para algunos usuarios

Casi lo que dice el título. El código funciona bien para todos mis dispositivos de desarrollo en el entorno de sandbox y para la mayoría de mis usuarios. Sin embargo, hay algunos usuarios que informan que el process de descarga no se mueve más allá del estado de espera (SKDownloadStateWaiting), incluso cuando se deja pasar la noche. Algunos logran que la descarga se inicie después de algunos bashs (cerrando la aplicación por completo y pasando por la function de restauración), por lo que parece ser completamente aleatorio.

Aquí está el código que estoy usando para administrar la descarga:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedDownloads:(NSArray *)downloads { SKDownload *download = [downloads objectAtIndex:0]; SKPaymentTransaction *transaction = download.transaction; // Keep track of download status switch (download.downloadState) { case SKDownloadStateActive: // Present time remaining and percentage break; case SKDownloadStateWaiting: // Present "Waiting..." label break; case SKDownloadStateFinished: [self purchaseNonconsumbleAtURL:download.contentURL forProductIdentifier:productIdentifier]; [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; break; case SKDownloadStateFailed: [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; break; case SKDownloadStateCancelled: [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; break; default: break; } } 

Cualquier ayuda sería muy apreciada.

Puede intentar iniciar una descarga que esté en SKDownloadStateWaiting llamando al

 [[SKPaymentQueue defaultQueue] startDownloads:[NSArray arrayWithObject:download]]; 

Mi aplicación siempre obtendría descargas que estaban en un estado permanente "en espera" cuando intentaban reanudar las transactions anteriores. Edité la function paymentQueue updatedDownloads para que cada vez que se llama con una descarga que está en estado de espera, pasará esa descarga a startDownloads, y esto pareció solucionar el problema.

Vale la pena comprobar si sus usuarios tienen una configuration de 12 horas (AM / PM) o 24 horas en sus dispositivos, especialmente si está realizando la validation de recibos localmente y asegurando que ciertos campos de date estén presentes / válidos (p. Ej., Fecha de compra). Tuve problemas con los recibos que no se validaron con usuarios que tienen una configuration de 12 horas. Para que esto sea aún más un caso marginal, la validation de recibos para usuarios de 12 horas solo fallará si la compra se realizó por la tarde en GMT. Esto es ciertamente algo que vale la pena probar en sandbox .

Si utiliza DateFormatter / NSDateFormatter en su validation de recibo, asegúrese de establecer la configuration regional en una que use 24 horas (por ej., en_GB ) para asegurarse de que usa un formatting de 24 horas.

Por ejemplo, en Swift 3, la propiedad de formateador de time del validador de recibo sería algo como esto:

 private let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.locale = Locale(identifier: "en_GB") formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'" return formatter }()