一般的移动端的开发接口都是固定的,比如一个连接http://www.baidu,com/vide.///请求过来的数据是json或者是xml格式文件 但是也有是webViewd的接口这样的话我们不免会一头雾水,如何下手获取我们想要的接口呢 ,下面一个例子说明一下HTML中获取M3u8连接
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class URLRetreive;
@protocol URLRetreiveDelegate <NSObject>//自定义协议
- (void)retreiveDidFinshedWithURLString:(NSString *)urlString;//获取连接方法
- (void)retreiveDidFailedWithError:(NSError *)error;//出错方法
@end
@interface URLRetreive : NSObject
@property (nonatomic, assign) id<URLRetreiveDelegate> delegate;//设置代理属性
@property (nonatomic, strong) NSString *videoOriginalUrlString;//视频的原始地址
@property (nonatomic, strong) NSString *errorMessage;
+ (id)retreive;//单例方法
- (void)start;//开始解析
#import "URLRetreive.h"
@interface URLRetreive ()<UIWebViewDelegate>
@property (nonatomic, strong) UIWebView *webContent;//加载网页源码,并解析
- (void)_loadWebContent;//加载网页内容方法
- (void)_retreiveURL;//解析网页
@end
@implementation URLRetreive
+ (id)retreive{
static URLRetreive *retreive = nil;
if (retreive == nil) {
retreive = [[URLRetreive alloc] init];
}
return retreive;
}
- (void)start{
[self _loadWebContent];
self.errorMessage = nil;
}
- (void)_loadWebContent{
self.webContent = [[UIWebView alloc] init];
self.webContent.delegate = self;
NSURL *url = [NSURL URLWithString:self.videoOriginalUrlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
[self.webContent loadData:data MIMEType:@"text/html" textEncodingName:@"gbk" baseURL:url];
}];
}
- (void)_retreiveURL{
NSString *m3u8Url = [self.webContent stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"video\").src"];
//判断是否是真实的m3u8地址
NSRange range = [m3u8Url rangeOfString:@"m3u8"];
if (range.length != 0) {
if (self.delegate && [self.delegate respondsToSelector:@selector(retreiveDidFinshedWithURLString:)]) {
[self.delegate retreiveDidFinshedWithURLString:m3u8Url];
}
}
//如果视频正在审核,无法观看,需要主动提示给用户
NSString *errorMsg = [self.webContent stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"msg\").innerHTML"];
if (errorMsg.length != 0) {
@synchronized(self.errorMessage){
if (!self.errorMessage) {
self.errorMessage = [errorMsg stringByReplacingOccurrencesOfString:@"<br>" withString:@"\r\n"];
NSLog(@"错误信息 = %@", self.errorMessage);
NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:0 userInfo:@{@"errorMessage": self.errorMessage}];
if (self.delegate && [self.delegate respondsToSelector:@selector(retreiveDidFailedWithError:)]) {
[self.delegate retreiveDidFailedWithError:error];
}
}
}
}
}
#pragma mark UIWebview Delegate Methods -
- (void)webViewDidFinishLoad:(UIWebView *)webView{
//网页加载完成,开始解析地址
[self _retreiveURL];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
if (self.delegate && [self.delegate respondsToSelector:@selector(retreiveDidFailedWithError:)]) {
[self.delegate retreiveDidFailedWithError:error];
}
}
@end
使用
<pre name="code" class="objc"> URLRetreive *urret = [URLRetreive retreive];
urret.videoOriginalUrlString = @"http://v.youku.com/v_show/id_XOTU4MDAwODI0_ev_1.html";
urret.delegate = self;
[urret start];
实现代理方法
- (void)retreiveDidFinshedWithURLString:(NSString *)urlString {
NSLog(@"22222");
NSLog(@"%@", urlString);
}
- (void)retreiveDidFailedWithError:(NSError *)error {
NSLog(@"%@", error);
}