iOS webView或WKWebView 本地 多格式文檔預(yù)覽

iOS端做文檔預(yù)覽,其實(shí)iOS在早期設(shè)計(jì)的時(shí)候,就已經(jīng)考慮到了預(yù)覽的功能,所以在iOS系統(tǒng)的早期,就有<QuickLook>框架支持我們實(shí)現(xiàn)該功能 ,并且逐漸有了QLPreviewController(并不是一個(gè)視圖控制器,而是繼承NSObject的一個(gè)對(duì)象)和UIDocumentInteractionController這兩個(gè)類可以支持我們實(shí)現(xiàn)預(yù)覽,但是這兩個(gè)類默認(rèn)是支持分享功能的,不符合我們的app的要求(我們要求文檔有權(quán)限管理),所以這兩個(gè)都被pass了,在這個(gè)過(guò)程中,我們發(fā)現(xiàn)webView或者WKWebView也可以實(shí)現(xiàn)文件預(yù)覽,而且文件預(yù)覽或者展示UI易于操作,所以我們選擇了使用 網(wǎng)頁(yè)瀏覽器來(lái)完成這個(gè)功能.

首先說(shuō)一下webView吧,由于iOS8系統(tǒng)時(shí),iOS已經(jīng)發(fā)布了新版的WKWebView,性能更好,更省內(nèi)存,所以我們后來(lái)用的是WKWebView,這里先簡(jiǎn)單講一下webiView,webView用起來(lái)很簡(jiǎn)單:

image.png

這個(gè)是WebView加載文檔的簡(jiǎn)單應(yīng)用,本地沙盒目錄下的也一樣,這個(gè)不是重點(diǎn),我們的重點(diǎn)在WKWebView上,因?yàn)閕OS8 以下的用戶(有蘋果官網(wǎng)統(tǒng)計(jì)的數(shù)據(jù),17年 june月的的時(shí)候,iOS 9以下的只占3%了,), 我們這個(gè)暫時(shí)舍棄了,但是如果大家兼容,也是可以的.
統(tǒng)計(jì)數(shù)據(jù)的鏈接 : https://developer.apple.com/support/app-store/

下面我們來(lái)講WKWebView ,WKWebView在開(kāi)發(fā)的時(shí)候,要分兩種類型.iOS8和iOS8以上版本的客戶端,需要單獨(dú)處理
因?yàn)閃KWebView有一個(gè)loadFileUrl的方法,是在iOS9之后才出現(xiàn)的,iOS8這個(gè)方法不能用,那能不能直接使用loadRequest方法呢,實(shí)踐證明,loadRequest在WKWebView不太管用(也可能是我沒(méi)有摸索到,但是我是多次嘗試,都沒(méi)成功,但是loadFile在iOS9之上,是妥妥的管用的)


image.png

所以,為了處理這個(gè)問(wèn)題,我們這樣處理的
iOS8 以上的設(shè)備:
iOS8以上的設(shè)備,可以直接使用loadFileURL的加載和展示,沒(méi)有什么重要的可以講的,現(xiàn)在針對(duì)的是iOS8 怎么使用WKWebView呢?
通過(guò)翻墻查資料,發(fā)現(xiàn)了一個(gè)牛人的實(shí)現(xiàn)原理,先上代碼,

image.png

//將文件移動(dòng)到tmp目錄  瀏覽完再移動(dòng)回去
- (NSURL *)fileURLForBuggyWKWebView8:(NSURL *)fileURL {
    NSError *error = nil;
    if (!fileURL.fileURL || ![fileURL checkResourceIsReachableAndReturnError:&error]) {
        return nil;
    }
    // Create "/temp/www" directory
    NSURL *temDirURL = QDTempDirectoryURL;
    if (![QDFileManager fileExistsAtPath:[temDirURL path]]) {
        [QDFileManager createDirectoryAtURL:temDirURL withIntermediateDirectories:YES attributes:nil error:&error];
    }
    NSURL *dstURL = [temDirURL URLByAppendingPathComponent:fileURL.lastPathComponent];
    // Now copy given file to the temp directory
    [QDFileManager moveItemAtURL:fileURL toURL:dstURL error:&error];
    if (error) {
        NSLog(@"后調(diào)整失敗 ");
    }
    self.tempfilePath = dstURL;

//    [fileManager copyItemAtURL:fileURL toURL:dstURL error:&error];
    // Files in "/temp/www" load flawlesly :)
    return dstURL;
}

之前的牛人是將文件copy(我的代碼是移動(dòng)的,我認(rèn)為移動(dòng)應(yīng)該會(huì)比copy更快吧,因?yàn)槲覀兊奈臋n有的時(shí)候是接近1g的視頻文件,)到 沙盒目錄下的 "/temp/www" 文件夾,然后再通過(guò)LoadRequest來(lái)實(shí)現(xiàn),發(fā)現(xiàn)WKWebView居然生效了,這樣的話 ,我理解的是/temp/www默認(rèn)應(yīng)該是存儲(chǔ)的WKWebView的網(wǎng)絡(luò)緩存,然后當(dāng)加載這個(gè)的時(shí)候,系統(tǒng)認(rèn)為是網(wǎng)頁(yè)請(qǐng)求的時(shí)候在優(yōu)先加載緩存,所有就可以讀取了這個(gè)文檔.然后這個(gè)文件就解決了.
ps : 你如果和我一樣 是使用的移動(dòng)文檔的話,要記得處理這幾個(gè)情況

  1. 用戶瀏覽的時(shí)候,移動(dòng)過(guò)去,瀏覽結(jié)束,記得將文檔移動(dòng)回去
image.png

2.當(dāng)用戶瀏覽的時(shí)候 項(xiàng)目出現(xiàn)了崩潰 或者被用戶強(qiáng)退 或者用戶退出后臺(tái)被系統(tǒng)殺死怎么辦?
要將文檔移動(dòng)到沙盒目錄的時(shí)候,對(duì)文件做個(gè)標(biāo)示(比如文件名加個(gè)后綴,展示給用戶的時(shí)候記得過(guò)濾一下),然后在應(yīng)用啟動(dòng)的時(shí)候,在appDelegate的啟動(dòng)方法中,去'temp/www'的目錄下做一個(gè)判斷,判斷是否存在這種前綴的文檔,如果存在,移回原來(lái)的目錄,就ok了,

image.png

此外.如果你們的產(chǎn)品和我們一樣,對(duì)文檔有權(quán)限要求,比如,不允許選擇,復(fù)制,粘貼,等操作,我們可以通過(guò)js注入WKWebView的方法讓禁止用戶交互,代碼如下

 //禁止長(zhǎng)按彈出 UIMenuController 相關(guān)
    //禁止選擇 css 配置相關(guān)
    NSString*css = @"body{-webkit-user-select:none;-webkit-user-drag:none;}";
    //css 選中樣式取消
    NSMutableString*javascript = [NSMutableString string];
    [javascript appendString:@"var style = document.createElement('style');"];
    [javascript appendString:@"style.type = 'text/css';"];
    [javascript appendFormat:@"var cssContent = document.createTextNode('%@');", css];
    [javascript appendString:@"style.appendChild(cssContent);"];
    [javascript appendString:@"document.body.appendChild(style);"];
    [javascript appendString:@"document.documentElement.style.webkitUserSelect='none';"];//禁止選擇
    [javascript appendString:@"document.documentElement.style.webkitTouchCallout='none';"];//禁止長(zhǎng)按
    //javascript 注入
    WKUserScript *noneSelectScript = [[WKUserScript alloc] initWithSource:javascript
                                                            injectionTime:WKUserScriptInjectionTimeAtDocumentEnd
                                                         forMainFrameOnly:YES];
    WKUserContentController*userContentController = [[WKUserContentController alloc] init];
    [userContentController addUserScript:noneSelectScript];
    WKWebViewConfiguration*configuration = [[WKWebViewConfiguration alloc] init];
    configuration.userContentController = userContentController;
    //控件加載
    [self.webView.configuration.userContentController addUserScript:noneSelectScript];


    [self.view addSubview:self.webView];
    

    [self.webView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.left.right.bottom.equalTo(self.view);
    }];

以上是我的個(gè)人見(jiàn)解,有問(wèn)題請(qǐng)大家指出,謝謝大家.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辣往,一起剝皮案震驚了整個(gè)濱河市兔院,隨后出現(xiàn)的幾起案子殖卑,更是在濱河造成了極大的恐慌,老刑警劉巖坊萝,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孵稽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡十偶,警方通過(guò)查閱死者的電腦和手機(jī)菩鲜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惦积,“玉大人接校,你說(shuō)我怎么就攤上這事∈ū溃” “怎么了蛛勉?”我有些...
    開(kāi)封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)睦柴。 經(jīng)常有香客問(wèn)我诽凌,道長(zhǎng),這世上最難降的妖魔是什么坦敌? 我笑而不...
    開(kāi)封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任侣诵,我火速辦了婚禮痢法,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杜顺。我一直安慰自己财搁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布哑舒。 她就那樣靜靜地躺著妇拯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洗鸵。 梳的紋絲不亂的頭發(fā)上越锈,一...
    開(kāi)封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音膘滨,去河邊找鬼甘凭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛火邓,可吹牛的內(nèi)容都是我干的丹弱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铲咨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼躲胳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起纤勒,我...
    開(kāi)封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤坯苹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后摇天,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粹湃,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年泉坐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了为鳄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腕让,死狀恐怖孤钦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纯丸,我是刑警寧澤偏形,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站液南,受9級(jí)特大地震影響壳猜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滑凉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一统扳、第九天 我趴在偏房一處隱蔽的房頂上張望喘帚。 院中可真熱鬧,春花似錦咒钟、人聲如沸吹由。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倾鲫。三九已至,卻和暖如春萍嬉,著一層夾襖步出監(jiān)牢的瞬間乌昔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工壤追, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磕道,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓行冰,卻偏偏與公主長(zhǎng)得像溺蕉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悼做,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • WkWebView是IOS8中引入的新組件疯特,蘋果將UIWebViewDelegate 與 UIWebView 重構(gòu)...
    i_belive閱讀 5,034評(píng)論 1 25
  • WKWebView 新特性 加載 web 頁(yè)面 加載本地資源 - loadHTMLString:baseURL:同...
    獨(dú)木舟的木閱讀 22,173評(píng)論 2 43
  • 一、WebView WebView就是一個(gè)內(nèi)嵌瀏覽器控件肛走,在iOS中主要有兩種WebView:UIWebView和...
    iOS祎閱讀 1,083評(píng)論 0 2
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)漓雅、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 雖然要做真實(shí)的自己但是自己一定要有方向和目標(biāo)羹与。
    臨淄茂業(yè)DDM王麗萍閱讀 129評(píng)論 0 0