NSURLProtocol - startLoading wird nicht aufgerufen, nachdem canInitWithRequest YES für die Seitenressource zurückgegeben hat

8

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:

%Vor%

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%     
Stonz2 12.10.2015, 20:05
quelle

2 Antworten

0

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?

    
TomSwift 27.10.2015 17:10
quelle
0

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.

  1. Der Simulator verwendet möglicherweise OSX AVFoundation, um das Video abzuspielen. Dies bedeutet, dass die Frameworks unterschiedlich sind und Unter iOS werden weniger Codecs unterstützt.
  2. Das ios-Gerät unterscheidet Groß- / Kleinschreibung, wenn es um Dateinamen geht, während der Simulator nicht funktioniert.
  3. Angenommen, iOS-spezifische Überlegungen unterscheiden sich zwischen Simulator und echtem Gerät, wenn es sich um ein zweites Video im UIWebView handelt, sollte es definitiv nicht auf iOS spielen, sondern auf dem Simulator spielen.
Roy Falk 26.10.2015 20:36
quelle