startLoading()
元のリクエストを送信する前に、内部で別の http 呼び出しを作成しようとしています。コードは以下のようなものです:
+canInitWithRequest(){
if(self.request.valueForKey("handledKey") != nil){
return false;
}
return true;
}
-startLoading(){
__block NSString * realURLString = self.request.URL.absoluteString;
//send separate http call for validation
NSMutableURLRequest validationRequest = [NSMutableURLRequest initWithURL:[URL initWithString:OUR_VALIDATION_SERVER_URL]];
{code to fill info into validationRequest, etc.}
semaphore = dispatch_semaphore_create(0); // need to sync to make sure we use the expected/real url
[NSURLProtocol setValue:YES forkey:"handledKey" inRequest: validationRequest];
[NSURLSession sendAsyncRequest:validationRequest ...completionHandler(response, data, error){
realURLString = xxxx;
print(current thread info);// line 1
dispatch_semaphore_signal(sema);
}];
print(current thread info);// line 2
dispatch_semaphore_wait(sema);
//continue original request with real url
NSMutableURLRequest realRequest = NSMutableURLRequest(realURLString);
[NSURLProtocol setValue:YES forkey:"handledKey" inRequest: realRequest];
self.connection = [NSURLSession withRequst:realRequest delegate:self];
}
}
通常のコンテンツの webView で使用される場合、非常に同じコードが機能します(htm, css, etc
。) [ケース 1] またはm3u8/mpg
[ケース 2] (プレーヤーは webView に自動的に埋め込まれます);
ただし、同じ [ケース 3] を再生するために AVPlayer を直接使用するとm3u8
、メソッドの後で検証呼び出しが約 1 分間スタックします (エラーを調べる場合は要求タイムアウト) canInitWithRequest()
。その後、次のリクエストは失敗します。
最初はスレッドの問題だと思いました。しかし、1 行目と 2 行目では異なるスレッドが表示されました。
AVPlayer は、http 要求を処理するために webView とは異なるメカニズムを使用したと思われます。[ケース 2] では、おそらく webView が AVPlayer をオーバーライドしただけです。しかし、よくわかりません。
誰かがより多くの洞察を与えることができますか?
ありがとう!