Sto utilizzando AVPlayer
per implementare un lettore video personalizzato in un'applicazione iOS. Per riprodurre il video dalla rete ho assegnare un giocatore:In che modo AVPlayer/AVPlayerItem informa la mia applicazione in merito a un errore di rete irraggiungibile?
[[AVPlayer alloc] initWithURL:_URL];
Creare una risorsa:
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL
options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}];
caricare la chiave playable
in modo asincrono:
NSArray *keys = @[@"playable"];
[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
for (NSString *key in keys) {
NSError *error;
AVKeyValueStatus status = [asset statusOfValueForKey:key error:&error];
if (status == AVKeyValueStatusFailed) {
NSLog(@"Failed to load asset key %@ error %@", key, [error localizedDescription]);
[self fail];
return;
}
}
if (asset.isPlayable) {
[self.player replaceCurrentItemWithPlayerItem:self.playerItem];
}
else {
[self fail];
}
});
}];
Il problema è che quando il dispositivo è dotato di nessuna connessione Internet o perdita di pacchetti elevata, il completionHandler
non viene mai chiamato (anche dopo aver atteso per minuti) e quindi non ho idea di quando mostrare un messaggio all'utente che carica g il video non è riuscito.
Le mie domande sono:
- mi sto perdendo qualcosa/c'è un modo migliore per gestire questa situazione?
- In caso di rollout della mia logica di timeout o dovrei semplicemente non
loadValuesAsynchronouslyForKeys:
quandoReachability
ritiene che la rete non sia raggiungibile. - Quali sono le migliori pratiche relative a
AVPlayer
e guasti di rete?