iOS资产URL混淆

时间:2013-09-09 21:19:46

标签: ios uiwebview alassetslibrary

我有一个如下所示的网址:

assets-library//asset/asset.MOV?id=51CED0CF-223D-4606-81BB-241381BCF2E8&ext=MOV

我正在使用以下代码在UIWebview中播放它:

    NSString *localVideoHTML = @"\
    <html><head>\
    <style type=\"text/css\">\
    body {\
    background-color: transparent;\
    color: white;\
    }\
    </style>\
    </head><body style=\"margin:0\">\
    <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-mp4\" \
    width=\"%0.0f\" height=\"%0.0f\"></embed>\
    </body></html>";
    NSString *html = [NSString stringWithFormat:localVideoHTML, videoId, self.frame.size.width, self.frame.size.height];

视频播放完美;我尝试了几个这些URL并没有问题。但是,我希望能够确认它在播放之前尚未从设备中删除。我使用以下代码执行此操作:

NSURL *url = [NSURL URLWithString:videoID];
NSError *err;
BOOL isReachable = [url checkResourceIsReachableAndReturnError:&err];

这似乎适用于某些网址,但不适用于其他网址。所以,在这一点上,我很困惑我是否可以事先确定URL是否指向现有文件(文件可能已从设备中删除,因为URL存储在Core中重复使用的数据库)。我从阅读SO和其他地方的意义上看到,看起来像我发布的URL的URL无法可靠地使用;但是,我已经能够毫不费力地一直播放如上所示的电影。

所以,我的问题是:

a)鉴于我能够使用看起来像上面的URL运行的所有测试,我假设它会与任何这样的URL一起玩错误吗?

b)在加载到webview之前是否有一种简单的方法来测试URL的“可达性”,所以如果它不是有效的URL,我可以在我的代码中处理这个问题吗?

先谢谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

好的,这已经解决,万一它会帮助其他人,这里就是。

要测试视频在播放时是否仍在设备上,请使用以下代码:

- (void) verifyURLReachable:(NSString *) videoID
{
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library assetForURL:[NSURL URLWithString:videoID]
     resultBlock:^(ALAsset *asset)
     {
         if (!asset)
         {
             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Video is Not Available on Device"
                                                             message:@"The requested video is no longer available on this iPad device. This video will be automatically removed from the current goal."
                                                            delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
             alert.tag = alertViewURLUnreachable;
             [alert show];
         }
    }
    failureBlock:^(NSError *error)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Access to Photos is Required"
                                                        message:@"To play videos that are stored on your device you must allow access to your photo and video library. This setting is made in your device setttings under 'Privacy'."
                                                       delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        alert.tag = alertViewUserDeniedAccess;
        [alert show];
    }];
}

它需要资产网址并对库进行检查;如果视频可用,则if(!asset)返回true并显示警报视图(委托将其交还给视图控制器完成,但它可以在此处执行任何操作。故障块可以捕获这种情况用户拒绝访问设备上的照片的地方。

如原始问题所述,上面给出的html可以很好地显示视频。所以,我首先检查URL是否存在,如果我存在,我继续播放它。无论视频是youtube还是存储在设备上的视频,都使用相同的UIWebView子类;基本上只有HTML和videoID不同(videoID包含youtub的youtube id和本地的资产URL。

感谢您对此的回复。