Ich habe ein Problem, bei dem eine Videoressource in meinem UIWebView
nicht geladen wird. Dies ist nur ein Problem auf einem tatsächlichen Gerät - alles funktioniert perfekt auf dem Simulator.
Hinweis: Ich habe das bereits überprüft und das Problem hat damit zu tun, den gleichen Inhalt mehrmals zu laden. NSURLProtocol wird nicht aufgefordert, nach der Antwort von yes auf canInitWithRequest zu laden
Die aktuelle Seite wird in meiner benutzerdefinierten NSURLProtocol
fein geladen, es gibt YES
von canInitWithRequest
(mehrmals) zurück und dann wird startLoading
nach etwa dem 4. oder 5. Mal aufgerufen. Es lädt dann meine CSS-Datei in ähnlicher Weise. Dann sehe ich, dass die Anfrage für mein Videoobjekt YES
von canInitWithRequest
zurückgibt, aber nichts passiert damit. startLoading
wird nie für die Anforderung meiner Videoressource aufgerufen. Hier ist das vereinfachte Protokoll von meinem Gerät, wenn ich die Seite lade:
Wenn ich dieselbe Seite aus dem Simulator geladen habe, auf der dieselbe iOS-Version auf dem gleichen Gerätetyp ausgeführt wird, zeigen die Protokolle an, dass die Ressource aus irgendeinem Grund tatsächlich geladen wird:
%Vor%Die Seite wird mit einem Video verlassen, das nie abgespielt wird - nur ein weißes Feld, wo es sein sollte und die Schaltfläche "Video abspielen" darüber. Die Seite sieht so aus, als ob sie ständig etwas lädt (Aktivitätsanzeige in der Statusleiste dreht sich), aber nichts passiert, und die Netzwerkaktivität im Debug-Navigator von Xcode ist flach.
tl; dr Weiß jemand, warum das Laden dieser Ressource niemals auf meinem iPhone versucht wird? Offensichtlich weiß der Simulator, dass er geladen werden muss.
EDIT: Hier ist der leicht redigierte relevante Code von meinem NSURLProtocol
%Vor% Meine beste Vermutung ist, dass der Videoplayer, der in UIWebView
verwendet wird, seinen Inhalt nicht lädt, indem er Foundation-Dienste ( NSURLSession/NSURLRequest
usw.) verwendet, die durch NSURProtocol
führen. Wahrscheinlich macht der Videoplayer Anfragen mit dem untergeordneten CFNetwork
api.
Die Implementierung unterscheidet sich wahrscheinlich von Simulator zu Gerät.
Ich bekomme, dass Ihr Protokoll mit dem Aufruf canInitWithRequest
abgefragt wird, aber das bedeutet nicht unbedingt, dass der Player die Ressource tatsächlich mit einem NSURLSession/NSURLRequest
lädt.
Der Versuch, ein Video über ein benutzerdefiniertes Protokoll in einen MPMoviePlayerViewController zu laden, hat ein ähnliches Verhalten wie das, was Sie sehen: Wie wird ein Film mit einer URL unter Verwendung eines benutzerdefinierten NSURLProtocol wiedergegeben?
Ich habe keine definitive Antwort, aber ich habe ein paar Vorschläge, die das lösen könnten: Haben Sie über Caching nachgedacht? Wenn das UIWebView denkt, dass es bereits eine Kopie des Videos hat, ruft es nicht auf.
Wenn iOS 8 eine HTTP-Antwort mit einem Keep-Alive-Header erhält, wird diese Verbindung später wieder verwendet ( wie es sollte), aber es hält es für mehr als den Timeout-Parameter der Keep-Alive-Header . Das Video ist das Letzte, was geladen wird und wenn der Mac schneller ist als das echte Gerät, könnte es das sein. Betrachtet man den Code, würde NSURLRequest nach canInitWithRequest, aber vor startLoading nil sein, trotzdem etwas in NSLog angezeigt.
Tags und Links objective-c ios uiwebview nsurlprotocol