Ich verwende , um einen benutzerdefinierten Videoplayer in einer iOS-Anwendung zu implementieren. Um Video aus dem Netz zu spielen zuteilen ich einen Spieler:Wie informiert AVPlayer/AVPlayerItem meine Anwendung über nicht erreichbare Netzwerkfehler?
[[AVPlayer alloc] initWithURL:_URL];
ein Asset erstellen:
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.URL
options:@{AVURLAssetPreferPreciseDurationAndTimingKey : @(YES)}];
Last der playable
Schlüssel asynchron:
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];
}
});
}];
Das Problem ist, dass, wenn die Vorrichtung keine Internetverbindung oder hoher Paketverlust, die completionHandler
wird nie aufgerufen (auch nach dem Warten auf Minuten) und so habe ich keine Ahnung, wann eine Nachricht an den Benutzer, die laden g Das Video ist fehlgeschlagen.
Meine Fragen sind:
- bin ich etwas fehlt/gibt es einen besseren Weg, dies zu umgehen?
- sollte ich meine eigene Timeout-Logik rollen oder sollte ich einfach nie
loadValuesAsynchronouslyForKeys:
wennReachability
glaubt, dass das Netzwerk nicht erreichbar ist. - Was sind die besten Praktiken in Bezug auf und Netzwerkfehler?