8

我遇到了一个问题,我的视频资源UIWebView没有加载。这只是实际设备上的一个问题 - 一切都在模拟器上完美运行。

注意:我已经检查过了,这里的问题与多次加载相同的内容有关。 在对 canInitWithRequest 的 YES 响应后不要求加载 NSURLProtocol

实际页面在我的自定义中加载得NSURLProtocol很好,它YEScanInitWithRequest(几次)返回,然后startLoading在大约第 4 次或第 5 次之后被调用。然后它以类似的方式加载我的 css 文件。然后我看到对我的视频对象的请求YES从返回canInitWithRequest,但没有任何反应。startLoading从来没有要求我的视频资源的请求。这是我加载页面时设备上的简化日志:

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

当我从在完全相同的设备类型上运行相同 iOS 版本的模拟器加载完全相同的页面时,日志显示资源实际上出于某种原因开始加载:

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?

该页面留下了一个永远不会播放的视频 - 只是一个白框,它应该是和它上面的“播放视频”按钮。该页面看起来像是在不断地加载某些东西(状态栏中的活动指示器正在旋转),但没有发生任何事情,并且 Xcode 的调试导航器中的网络活动是扁平的。

tl; dr
有谁知道为什么我的 iPhone 上从未尝试加载此资源?显然模拟器知道它需要加载。


编辑:这是来自我的 NSURLProtocol 的略微编辑的相关代码

@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;
4

2 回答 2

0

我最好的猜测是,其中使用的视频播放器没有使用通过管道传输的 Foundation 服务(等)UIWebView加载其内容。视频播放器可能正在使用较低级别的api 发出请求。NSURLSession/NSURLRequestNSURProtocolCFNetwork

实现可能因模拟器而异。

我知道您的协议已通过canInitWithRequest调用轮询,但这并不一定意味着播放器将实际使用NSURLSession/NSURLRequest.

尝试通过自定义协议将视频加载到 MPMoviePlayerViewController 与您所看到的行为类似: 如何使用自定义 NSURLProtocol 播放带有 URL 的电影?

于 2015-10-27T17:10:15.803 回答
0

我没有明确的答案,但我有一些建议可以解决这个问题:你考虑过缓存吗?如果 UIWebView 认为它已经有视频的副本,它不会调用.

当 iOS 8 接收到带有 Keep-Alive 标头的 HTTP 响应时,它会保留此连接以供以后重用(应该如此),但它会将其保留时间超过 Keep-Alive 标头的 timeout 参数。视频是最后加载的东西,如果 Mac 比真实设备快,它可能就是它。查看您的代码,如果 NSURLRequest 在 canInitWithRequest 之后但在 startLoading 之前为零,您仍然会在 NSLog 中看到一些内容。

  1. 模拟器可能正在使用 OSX AVFoundation 来播放视频。这意味着框架不同,iOS 上支持的编解码器更少。
  2. ios 设备在文件名方面区分大小写,而模拟器则不区分大小写。
  3. 假设iOS-Specific Considerations在模拟器和真实设备之间是不同的,如果这是 UIWebView 中的第二个视频,它肯定不应该在 iOS 上播放,但可以在模拟器上播放。
于 2015-10-26T20:36:05.360 回答