1. 程式人生 > >如何從html格式檔案中獲取M3u8的介面

如何從html格式檔案中獲取M3u8的介面

一般的移動端的開發介面都是固定的,比如一個連線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);
}