2015-10-12 21 views
8

Tôi đang gặp sự cố khi tài nguyên video trong số UIWebView của tôi không tải. Đây chỉ là vấn đề trên thiết bị thực tế - mọi thứ hoạt động hoàn hảo trên trình mô phỏng.NSURLProtocol - startLoading không được gọi sau khi canInitWithRequest trả về CÓ cho tài nguyên trang

Lưu ý: Tôi đã kiểm tra điều này và vấn đề liên quan đến việc tải cùng một nội dung nhiều lần. NSURLProtocol isn't asked to load after YES response to canInitWithRequest

Các tải trang thực tế fine- trong tùy chỉnh của tôi NSURLProtocol, nó sẽ trả YES từ canInitWithRequest (nhiều lần) và sau đó startLoading được gọi sau khi về thứ 4 hoặc thứ 5 thời gian. Sau đó nó tải tệp css của tôi theo cách tương tự. Sau đó, tôi thấy rằng yêu cầu đối tượng video của tôi trả về YES từ canInitWithRequest, nhưng không có gì xảy ra với nó. startLoading không bao giờ được gọi cho yêu cầu của tài nguyên video của tôi. Dưới đây là nhật ký đơn giản từ điện thoại của tôi khi tôi tải trang:

canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
START LOADING: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://cssResource 
START LOADING: https://cssResource 
canInitWithRequest: https://MyVideoResource 

Khi tôi nạp chính xác cùng một trang từ mô phỏng chạy phiên bản iOS cùng vào loại thiết bị tương tự chính xác, các bản ghi cho thấy tài nguyên thực sự bắt đầu tải ở đây đối với một số lý do:

canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
START LOADING: https://WebpageURL 
canInitWithRequest: https://WebpageURL 
canInitWithRequest: https://cssResource 
START LOADING: https://cssResource 
canInitWithRequest: https://MyVideoResource 
canInitWithRequest: https://MyVideoResource 
START LOADING: https://MyVideoResource -- WHY NOT ON DEVICE? 

các trang còn lại với một video mà không bao giờ plays- chỉ là một hộp màu trắng mà nó phải và nút "Video play" trên nó. Trang có vẻ như liên tục tải một thứ gì đó (chỉ báo hoạt động trên thanh trạng thái đang quay) nhưng không có gì xảy ra và hoạt động mạng trong trình điều hướng gỡ lỗi của Xcode được căn chỉnh.

tl; dr
Có ai biết tại sao tải tài nguyên này không bao giờ được thử trên iPhone của tôi không? Rõ ràng các mô phỏng biết rằng nó cần phải được nạp.


EDIT: Đây là mã có liên quan một chút biên tập từ NSURLProtocol tôi

@implementation CHHTTPURLProtocol 
{ 
    NSURLConnection *connection; 
    NSHTTPURLResponse *httpResponse; 
    NSData *responseData; 
} 

+ (BOOL)canInitWithRequest:(NSURLRequest *)request 
{ 
    if (/* key exists on request */) 
     return NO; 
    else if (/* not http or https */) 
     return NO; 

    NSLog(@"canInitWithRequest: %@", request.URL.absoluteString); 

    return YES; 
} 

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request 
{ 
    return request; 
} 

- (void)startLoading 
{ 
    NSMutableURLRequest *request = [self.request mutableCopy]; 
    NSLog(@"START LOADING: %@", request.URL.absoluteString); 
    if (authenticate) authenticate(request); 
    /* add key to request */ 
    connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
} 

- (void)stopLoading 
{ 
    [connection cancel]; 
    connection = nil; 
} 

/* Other methods like connection:didReceiveData: and connectionDidFinishLoding: */ 

+ (void)authenticateWithBlock:(AuthenticationBlock)block 
{ 
    authenticate = block; 
} 

static AuthenticationBlock authenticate; 
+0

vài câu hỏi: Simulator và thiết bị chạy cùng một phiên bản iOS? Mạng có giống nhau trên điện thoại và máy mac của bạn nơi bạn chạy trình giả lập không? Mã nguồn bạn sử dụng để tải video? – Lefteris

+0

@Lefteris Cả mô phỏng và thiết bị đều chạy 8.4. Cả hai đều được kết nối với cùng một mạng wifi và đang tải chính xác tài nguyên HTML. Bài đăng đã được cập nhật với mã NSURLProtocol có liên quan. – Stonz2

+0

tại sao bạn không trả lại CÓ trên tất cả canInitWithRequest? hoặc ít nhất in ra yêu cầu trong canInitWithRequest để tìm ra sự khác biệt? – Allen

Trả lời

0

Tôi không có một câu trả lời rõ ràng nhưng tôi có một vài gợi ý có thể giải quyết việc này: Có bạn được coi là bộ nhớ đệm? If the UIWebView thinks it already has a copy of the video, it won't call.

when iOS 8 receive an HTTP response with a Keep-Alive header, it keeps this connection to re-use later (as it should), but it keeps it for more than the timeout parameter of the Keep-Alive header. Video là thứ cuối cùng cần tải và nếu Mac nhanh hơn thiết bị thực, có thể là video đó. Nhìn vào mã của bạn, nếu NSURLRequest là nil sau canInitWithRequest nhưng trước khi startLoading, bạn vẫn sẽ thấy một cái gì đó trong NSLog.

  1. Trình mô phỏng có thể đang sử dụng OSX AVFoundation để phát video. Điều này có nghĩa là frameworks are differentfewer codecs được hỗ trợ trên iOS.
  2. The ios device is case sensitive when it comes to file names whilst the simulator is not.
  3. Giả sử iOS-Specific Considerations khác nhau giữa mô phỏng và thiết bị thực tế, nếu điều này là một đoạn video thứ hai trong UIWebView, nó chắc chắn không nên chơi trên iOS nhưng có thể chơi trên giả lập.
+0

Điểm 1- Tôi không nghĩ rằng hệ điều hành thậm chí còn biết loại tệp nào ở đầu kia của URL vì chưa cố gắng tải tệp đó (không có tiêu đề phản hồi). Điểm 2- nó không phải là một tập tin được lưu trữ trên thiết bị, nó là một URL. Điểm 3- nó là video duy nhất trên trang. – Stonz2

0

đoán tốt nhất của tôi là người chơi video được sử dụng trong UIWebView không tải nội dung của nó sử dụng dịch vụ Foundation (NSURLSession/NSURLRequest, vv) mà ống thông qua NSURProtocol. Có khả năng trình phát video đang thực hiện yêu cầu bằng cách sử dụng api CFNetwork cấp thấp hơn.

Khả năng triển khai có thể khác với trình mô phỏng cho thiết bị.

Tôi nhận được rằng giao thức của bạn được thăm dò với cuộc gọi canInitWithRequest, nhưng điều này không nhất thiết có nghĩa là người chơi sẽ thực sự tải tài nguyên bằng cách sử dụng NSURLSession/NSURLRequest.

Cố gắng tải một đoạn video thông qua một giao thức tùy chỉnh vào MPMoviePlayerViewController có hành vi tương tự như những gì bạn đang nhìn thấy: How to play movie with a URL using a custom NSURLProtocol?

Các vấn đề liên quan