WKWebView iOS 8 के तहत स्थानीय फ़ाइलों को लोड नहीं कर रहा है


123

पिछले iOS 8 बीटा के लिए, (बंडल में) एक स्थानीय वेब एप्लिकेशन लोड और यह दोनों के लिए ठीक काम करता है UIWebViewऔर WKWebView, और मैं भी नए से कोई वेब खेल पोर्ट WKWebViewएपीआई।

var url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("car", ofType:"html"))

webView = WKWebView(frame:view.frame)
webView!.loadRequest(NSURLRequest(URL:url))

view.addSubview(webView)

लेकिन बीटा 4 में, मुझे सिर्फ एक रिक्त सफेद स्क्रीन मिली ( UIWebViewअभी भी काम), ऐसा लगता है कि कुछ भी लोड या निष्पादित नहीं किया गया है। मुझे लॉग में एक त्रुटि दिखाई दी:

के लिए सैंडबॉक्स एक्सटेंशन नहीं बनाया जा सका /

मुझे सही दिशा देने के लिए कोई मदद? धन्यवाद!


इसके अलावा दृश्य में पदानुक्रम में पदानुक्रम में webView को जोड़ने का प्रयास करें, और viewWillAppear में अनुरोध लोड करें। मेरा WKWebView अभी भी काम कर रहा है, लेकिन मेरे पास यह कैसे है। अगर वे एक दृश्य पदानुक्रम में नहीं हैं, तो शायद WebView के पास अनुरोधों को लोड न करने के लिए एक अनुकूलन है?
rvijay007

हो गया (view.addView viewDidLoad और loadRequest in viewWillAppear), और मुझे वही सफेद स्क्रीन और समान त्रुटि संदेश मिला।
लिम थोये बीन

9
यह केवल डिवाइस पर होता है क्योंकि सिम्युलेटर ठीक काम करता है। मैं वैसे ही Objc का उपयोग कर रहा हूँ।
ग्यूडोम्बो

1
यह XCode 6 - बीटा 7 में एक मुद्दा बना हुआ है। मेरा अस्थायी समाधान स्थानीय फ़ाइलों की सेवा के लिए github.com/swisspol/GCDWebServer का उपयोग करना था ।
गुइडो एमबी

2
किसी ने iOS 8.0.1 के तहत इसका परीक्षण किया?
लिम थोये शॉन

जवाबों:


106

उन्होंने अंत में बग को हल कर दिया! अब हम उपयोग कर सकते हैं -[WKWebView loadFileURL:allowingReadAccessToURL:]। जाहिरा तौर पर फिक्स WWDC 2015 के वीडियो 504 में सफ़ारी व्यू कंट्रोलर का परिचय देते हुए कुछ सेकंड के लायक था

https://developer.apple.com/videos/wwdc/2015/?id=504

IOS8 ~ iOS10 के लिए (स्विफ्ट 3)

जैसा कि डैन फेबुलिश का जवाब है कि यह WKWebView का एक बग है, जो स्पष्ट रूप से जल्द ही किसी भी समय हल नहीं किया जा रहा है और जैसा कि उन्होंने कहा कि काम के आसपास है :)

मैं सिर्फ इसलिए जवाब दे रहा हूं क्योंकि मैं काम को इधर-उधर दिखाना चाहता था। Https://github.com/shazron/WKWebViewFIleUrlTest में दिखाया गया IMO कोड असंबंधित विवरणों से भरा है, ज्यादातर लोग शायद इसमें रुचि नहीं रखते हैं।

काम के आसपास कोड की 20 लाइनें है, त्रुटि से निपटने और टिप्पणियों में शामिल हैं, सर्वर की कोई आवश्यकता नहीं है :)

func fileURLForBuggyWKWebView8(fileURL: URL) throws -> URL {
    // Some safety checks
    if !fileURL.isFileURL {
        throw NSError(
            domain: "BuggyWKWebViewDomain",
            code: 1001,
            userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("URL must be a file URL.", comment:"")])
    }
    try! fileURL.checkResourceIsReachable()

    // Create "/temp/www" directory
    let fm = FileManager.default
    let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("www")
    try! fm.createDirectory(at: tmpDirURL, withIntermediateDirectories: true, attributes: nil)

    // Now copy given file to the temp directory
    let dstURL = tmpDirURL.appendingPathComponent(fileURL.lastPathComponent)
    let _ = try? fm.removeItem(at: dstURL)
    try! fm.copyItem(at: fileURL, to: dstURL)

    // Files in "/temp/www" load flawlesly :)
    return dstURL
}

और के रूप में इस्तेमाल किया जा सकता है:

override func viewDidLoad() {
    super.viewDidLoad()
    var fileURL = URL(fileURLWithPath: Bundle.main.path(forResource:"file", ofType: "pdf")!)

    if #available(iOS 9.0, *) {
        // iOS9 and above. One year later things are OK.
        webView.loadFileURL(fileURL, allowingReadAccessTo: fileURL)
    } else {
        // iOS8. Things can (sometimes) be workaround-ed
        //   Brave people can do just this
        //   fileURL = try! pathForBuggyWKWebView8(fileURL: fileURL)
        //   webView.load(URLRequest(url: fileURL))
        do {
            fileURL = try fileURLForBuggyWKWebView8(fileURL: fileURL)
            webView.load(URLRequest(url: fileURL))
        } catch let error as NSError {
            print("Error: " + error.debugDescription)
        }
    }
}

2
इसके लिए कुछ संशोधन पूरे फ़ोल्डर, छवियों और सभी को कॉपी करने के लिए। let orgFolder = NSBundle.mainBundle().resourcePath! + "/www"; var newFilePath = pathForBuggyWKWebView(orgFolder) self.loadingWebView!.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(newFilePath!+"/Loading.html")!))
पिवफ

1
Pivaf के समाधान ने मेरे लिए थोड़ा बेहतर काम किया, ध्यान दें कि यह "self.webView" होना चाहिए न कि "self.loadingWebView" ऊपर दिए गए उदाहरण को देखते हुए
पैट्रिक Fabrizius

2
धन्यवाद @ nacho4d tldr; / tmp फ़ोल्डर समाधान 8.0 पर नहीं बल्कि 8.0.2 पर काम करेगा। मुझे अपने परीक्षण उपकरण पर काम करने के लिए इस समाधान को प्राप्त करने में परेशानी हो रही थी और अंततः इसे आज़माने के लिए शाज़्रोन के रेपो पर क्लोन किया। यह भी काम नहीं किया। यह बताता है कि शेज़्रोन का समाधान आईओएस के संस्करण पर काम नहीं करता है मेरा डिवाइस iPhone 6 प्लस पर 8.0 (12A366) चल रहा था। मैंने इसे आईओएस 8.0.2 पर चलने वाले डिवाइस (आईपैड मिनी) पर आजमाया और यह ठीक काम करता है।
jvoll

1
इसे होने देना चाहिए _ = कोशिश? fm.removeItemAtURL (dstURL) let के बजाय _ = कोशिश करें? fileMgr.removeItemAtURL (dstURL)
DàChún

3
केवल साधारण वेबसाइटों के लिए। यदि आप कोणीय के माध्यम से अजाक्स या स्थानीय विचारों को लोड कर रहे हैं, तो उम्मीद करें कि "क्रॉस मूल अनुरोध केवल HTTP के लिए समर्थित हैं"। आपका एकमात्र दोष स्थानीय वेबसर्वर दृष्टिकोण है जो मुझे पसंद नहीं है क्योंकि यह स्थानीय नेटवर्क पर दिखाई देता है। इस पोस्ट में नोटिंग की जरूरत है, कुछ घंटे लोक बचाएं।
जेन्सन-बटन-इवेंट

83

WKWebView फ़ाइल से सामग्री लोड नहीं कर सकता: URL इसकी loadRequest:विधि के माध्यम से । http://www.openradar.me/18039024

आप के माध्यम से सामग्री लोड कर सकते हैं loadHTMLString:, लेकिन अगर आपका आधार फ़ाइल है: URL, तो यह अभी भी काम नहीं करेगा।

आईओएस 9 एक नए API कि तुम क्या चाहते हो जाएगा है, [WKWebView loadFileURL:allowingReadAccessToURL:]

IOS 8 के लिए एक वर्कअराउंड है , यहां उद्देश्य-सी में shazron द्वारा प्रदर्शित https://github.com/shazron/WKWebViewFIleUrlTest फाइलों/tmp/www को कॉपी करने और उन्हें वहां से लोड करने के लिए है

यदि आप स्विफ्ट में काम कर रहे हैं, तो आप इसके बजाय nachos4d का नमूना आज़मा सकते हैं । (यह भी shazron के नमूने की तुलना में बहुत छोटा है, इसलिए यदि आप shazron के कोड से परेशान हैं, तो इसके बजाय इसे आज़माएं।)


1
एक वर्कअराउंड (यहां बताया गया है: devforums.apple.com/message/1051027 ) सामग्री को tmp में ले जाना और उसे वहां से एक्सेस करना है। मेरा त्वरित परीक्षण इंगित करता है कि यह काम करता है ...
माइक एम

6
8.1 में तय नहीं है।
मैट

1
फ़ाइलों को / tmp में ले जाना मेरे लिए काम करता है। लेकिन ... मेरे भगवान, यह परीक्षण के माध्यम से कैसे मिला?
ग्रेग मैलिक

1
वह नमूना सिर्फ डेमो के लिए TOO MUCH कोड है। पढ़ने के लिए फ़ाइल अंदर होनी चाहिए /tmp/www/। का प्रयोग करें NSTemporaryDirectory()और NSFileManagerबनाने के लिए wwwनिर्देशिका (डिफ़ॉल्ट रूप से ऐसी कोई निर्देशिका है क्योंकि वहाँ)। फिर अपनी फाइल को वहां कॉपी करें और अब इस फाइल को पढ़ें :)
nacho4d

2
8.3 और यह अभी भी तय नहीं है ...?
निंजानेर

8

IOS 9 पर [WKWebView loadFileURL: allowReadAccessToURL:] का उपयोग करने का एक उदाहरण ।

जब आप वेब फ़ोल्डर को किसी प्रोजेक्ट पर ले जा रहे हों, तो "फ़ोल्डर संदर्भ बनाएँ" चुनें

यहाँ छवि विवरण दर्ज करें

फिर कोड का उपयोग करें जो कुछ इस तरह है (स्विफ्ट 2):

if let filePath = NSBundle.mainBundle().resourcePath?.stringByAppendingString("/WebApp/index.html"){
  let url = NSURL(fileURLWithPath: filePath)
  if let webAppPath = NSBundle.mainBundle().resourcePath?.stringByAppendingString("/WebApp") {
    let webAppUrl = NSURL(fileURLWithPath: webAppPath, isDirectory: true)
    webView.loadFileURL(url, allowingReadAccessToURL: webAppUrl)
  }
}

Html फाइल में इस तरह filepaths का उपयोग करें

<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">

इस तरह नहीं

<link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet">

निर्देशिका का एक उदाहरण जो एक xcode परियोजना में ले जाया गया है।

यहाँ छवि विवरण दर्ज करें


6

अस्थायी वर्कअराउंड: मैं GCDWebServer का उपयोग कर रहा हूं , जैसा कि GuidoMB द्वारा सुझाया गया है।

मैं पहली बार अपने बंडल किए गए "www /" फ़ोल्डर का पथ ढूंढता हूं (जिसमें "index.html" शामिल है):

NSString *docRoot = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"].stringByDeletingLastPathComponent;

... तो इसे इस तरह शुरू करें:

_webServer = [[GCDWebServer alloc] init];
[_webServer addGETHandlerForBasePath:@"/" directoryPath:docRoot indexFilename:@"index.html" cacheAge:3600 allowRangeRequests:YES];
[_webServer startWithPort:port bonjourName:nil];

इसे रोकने के लिए:

[_webServer stop];
_webServer = nil;

प्रदर्शन ठीक दिखता है, यहां तक ​​कि एक iPad 2 पर भी।


ऐप के बैकग्राउंड में जाने के बाद मुझे एक क्रैश का पता चला, इसलिए मैंने इसे बंद कर दिया applicationDidEnterBackground:और applicationWillTerminate:; मैं इसे चालू application:didFinishLaunching...और पुनः आरंभ करता / करती हूं applicationWillEnterForeground:


1
एक "सर्वर" का उपयोग करना संभवतः किसी भी प्रदर्शन लाभ को खा जाता है जो WKWebViewप्रदान करता है UIWebView। जब तक यह तय नहीं हो जाता तब तक पुराने एपीआई के साथ चिपका रह सकता है।
किरण

@ एक-पेज ऐप के साथ नहीं।
ईथन

मैंने GCDWebServer को अपने ऐप के आंतरिक बिल्ड में भी काम करने के लिए दिया है। और अगर आपके ऐप में बहुत सारी जावास्क्रिप्ट है, तो सर्वर पूरी तरह से इसके लायक है। लेकिन ऐसे अन्य मुद्दे हैं जो मुझे अभी WKWebView का उपयोग करने से रोकते हैं, इसलिए मैं iOS 9 में सुधार की उम्मीद कर रहा हूं
टॉम हैमिंग

और इसे WebView पर कैसे दिखाएं? मुझे वास्तव में समझ नहीं आया कि GCDWebServer क्या है?
चिपबेक 10

1
"फ़ाइल: // ....." को वेबव्यू इंगित करने के बजाय, आप इसे "http: // localhost: <port> / ..." इंगित करते हैं।
ईथनब

5
[configuration.preferences setValue:@"TRUE" forKey:@"allowFileAccessFromFileURLs"];

इससे मेरे लिए iOS 8.0+ dev.apple.com की समस्या हल हो गई

यह भी सिर्फ ठीक काम करने के लिए लगता है ...

NSString* FILE_PATH = [[[NSBundle mainBundle] resourcePath]
                       stringByAppendingPathComponent:@"htmlapp/FILE"];
[self.webView
    loadFileURL: [NSURL fileURLWithPath:FILE_PATH]
    allowingReadAccessToURL: [NSURL fileURLWithPath:FILE_PATH]
];

FILE के बजाय आप DIR भी डाल सकते हैं।
nullqube

यह बहुत बढ़िया खोज है। मुझे नहीं पता कि यह उच्च मतदान क्यों नहीं है।
प्लाविसी

इस पोस्ट में अधिक जानकारी है (वेबकिट स्रोत के लिंक सहित): stackoverflow.com/questions/36013645/…
plivesey

configuration.preferences सेटवैल्यू iOS 9.3 पर दुर्घटना देगा
Vignesh Kumar

मैं iOS 13 SDK का उपयोग कर रहा हूं, लेकिन iOS 8 के साथ संगतता रखने की कोशिश कर रहा हूं, और allowFileAccessFromFileURLsएप्रोच क्रैश हो रहा है NSUnknownKeyException
अर्लोमेडिया

4

डैन फेबुलिच द्वारा बताए गए समाधानों के अलावा, एक्सवेबव्यू एक और समाधान है। [WKWebView loadFileURL: allowingReadAccessToURL:] है विस्तार के माध्यम से कार्यान्वित


1
मैंने इस समस्या के लिए अन्य कार्य-स्थलों को देखने के बाद XWebView का उपयोग करने का निर्णय लिया। XWebView स्विफ्ट में लागू किया गया एक फ्रेमवर्क है, लेकिन मुझे अपने iOS 8 ऑब्जेक्टिव-सी ऐप में इसका उपयोग करने में कोई समस्या नहीं थी।
च्मनयार्ड

4

मैं अभी तक टिप्पणी नहीं कर सकता, इसलिए मैं इसे एक अलग उत्तर के रूप में पोस्ट कर रहा हूं।

यह nacho4d के समाधान का एक उद्देश्य-सी संस्करण है । अब तक का सबसे अच्छा वर्कअराउंड मैंने देखा है।

- (NSString *)pathForWKWebViewSandboxBugWithOriginalPath:(NSString *)filePath
{
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *tempPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"www"];
    NSError *error = nil;

    if (![manager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:&error]) {
        NSLog(@"Could not create www directory. Error: %@", error);

        return nil;
    }

    NSString *destPath = [tempPath stringByAppendingPathComponent:filePath.lastPathComponent];

    if (![manager fileExistsAtPath:destPath]) {
        if (![manager copyItemAtPath:filePath toPath:destPath error:&error]) {
            NSLog(@"Couldn't copy file to /tmp/www. Error: %@", error);

            return nil;
        }
    }

    return destPath;
}

1
मैं सिम्युलेटर में iOS 8 पर काम करने के लिए इसे प्राप्त नहीं कर सकता। मैं / tmp / www में एक png लगाना चाहता हूं और फिर अपने html में img टैग का उपयोग करूंगा। मुझे img टैग src के लिए क्या उपयोग करना चाहिए?
user3246173

ठीक वैसा ही था जैसा मुझे चाहिए था। धन्यवाद!
Tinkerbell

3

उस स्थिति में जब आप एक बड़ी HTML स्ट्रिंग के बीच में एक स्थानीय छवि प्रदर्शित करने का प्रयास कर रहे हैं: <img src="file://..."> , यह अभी भी डिवाइस पर तो मैं NSData में छवि फ़ाइल लोड और साथ src स्ट्रिंग की जगह इसे प्रदर्शित करने में सक्षम था प्रकट नहीं होता है डेटा ही। नमूना कोड WKWebView में लोड करने के लिए HTML स्ट्रिंग का निर्माण करने में मदद करने के लिए, जहां परिणाम वह है जो src = "के उद्धरणों के अंदर क्या बदल देगा

स्विफ्ट:

let pathURL = NSURL.fileURLWithPath(attachmentFilePath)
guard let path = pathURL.path else {
    return // throw error
}
guard let data = NSFileManager.defaultManager().contentsAtPath(path) else {
    return // throw error
}

let image = UIImage.init(data: data)
let base64String = data.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
result += "data:image/" + attachmentType + "base64," + base64String

var widthHeightString = "\""
if let image = image {
    widthHeightString += " width=\"\(image.size.width)\" height=\"\(image.size.height)\""
}

result += widthHeightString

उद्देश्य सी:

NSURL *pathURL = [NSURL fileURLWithPath:attachmentFilePath];
NSString *path = [pathURL path];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];

UIImage *image = [UIImage imageWithData:data];
NSString *base64String = [data base64EncodedStringWithOptions:0];
[result appendString:@"data:image/"];
[result appendString:attachmentType]; // jpg, gif etc.
[result appendString:@";base64,"];
[result appendString:base64String];

NSString *widthHeightString = @"\"";
if (image) {
    widthHeightString = [NSString stringWithFormat:@"\" width=\"%f\" height=\"%f\"", image.size.width, image.size.height];
}
[result appendString:widthHeightString];

स्विफ्ट संस्करण में, बेस 64 से पहले अर्धविराम जोड़ें। result += "data:image/" + attachmentType + ";base64," + base64String
शाहिल

धन्यवाद, यह केवल एक चीज है जो मेरे लिए काम करती है, क्योंकि मैं डिवाइस पर एक अस्थायी फ़ोल्डर में एक .gif फ़ाइल डाउनलोड करता हूं, और फिर उस फ़ाइल को HTMLstring के भीतर के WKWebViewरूप में लोड करता <img>हूं।
मिस्टर ज़ीस्टम

1

मैं नीचे का उपयोग कर रहा हूँ। कुछ अतिरिक्त चीजें हैं जिन पर मैं काम कर रहा हूं, लेकिन आप देख सकते हैं कि मैंने कहां से लोड किया है। आशा है कि यह बग को ठीक करने में मदद करेगा।

import UIKit
import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {

    var theWebView: WKWebView?

    override func viewDidLoad() {
        super.viewDidLoad()

        var path = NSBundle.mainBundle().pathForResource("index", ofType: "html", inDirectory:"www" )
        var url = NSURL(fileURLWithPath:path)
        var request = NSURLRequest(URL:url)
        var theConfiguration = WKWebViewConfiguration()

        theConfiguration.userContentController.addScriptMessageHandler(self, name: "interOp")

        theWebView = WKWebView(frame:self.view.frame, configuration: theConfiguration)

        let text2 = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)

        theWebView!.loadHTMLString(text2, baseURL: nil)

        //theWebView!.loadRequest(request)

        self.view.addSubview(theWebView)


    }

    func appWillEnterForeground() {

    }

    func appDidEnterBackground() {

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func userContentController(userContentController: WKUserContentController!, didReceiveScriptMessage message: WKScriptMessage!){
        println("got message: \(message.body)")

    }

}

3
यह केवल HTML फ़ाइलों के लिए काम करता है, लेकिन अन्य संसाधनों के लिए नहीं लगता है।
लिम थोये बीन

1

IOS8 के तहत इस समस्या को हल करने के लिए किसे:

यदि आपका पृष्ठ जटिल नहीं है, तो आप पृष्ठ को एकल पृष्ठ अनुप्रयोग के रूप में बनाना चुन सकते हैं।

दूसरे शब्दों में, HTML फ़ाइल में सभी संसाधनों को एम्बेड करने के लिए।

करने के लिए: 1. अपने जेएस / सीएसएस फ़ाइल की सामग्री को क्रमशः HTML फ़ाइल में / टैग में कॉपी करें; 2. तदनुसार अपनी छवि फ़ाइलों को svg में बदलें। 3. उदाहरण के लिए, [webView loadHTMLString: baseURL:] का उपयोग करके पहले की तरह पृष्ठ लोड करें

यह एक svg छवि को स्टाइल करने के लिए थोड़ा अलग था, लेकिन यह आपको इतना ब्लॉक नहीं करना चाहिए।

ऐसा लगता था कि पेज रेंडर का प्रदर्शन थोड़ा कम हो गया था, लेकिन यह योग्य था कि iOS8 / 9/10 के तहत इतना सरल वर्कअराउंड काम किया जाए।


0

GCDWebServer की समान पंक्ति में, मैं SImpleHttpServer ( http://www.andyjamesdavies.com/blog/javascript/simple-http-server-on-mac-os-x-in-seconds ) का उपयोग कर रहा हूं और फिर स्थानीयहोल्डर के साथ लोड करना चाहता हूं। यूआरएल। इस दृष्टिकोण के साथ आपको किसी भी पुस्तकालय को जोड़ने की आवश्यकता नहीं है, लेकिन वेबसाइट की फाइलें बंडल में नहीं होंगी, इसलिए यह वितरित करने योग्य नहीं होगा। उसके कारण, यह डीबग मामलों के लिए अधिक उपयुक्त होगा।


0

मैं OS X पर PHP के वेब सर्वर का उपयोग करने में कामयाब रहा हूं। अस्थायी / www निर्देशिका की प्रतिलिपि बनाना मेरे लिए काम नहीं आया। Python SimpleHTTPServer ने MIME प्रकार, शायद सैंडबॉक्सिंग समस्या को पढ़ने के बारे में शिकायत की।

यहाँ एक सर्वर का उपयोग किया गया है php -S:

let portNumber = 8080

let task = NSTask()
task.launchPath = "/usr/bin/php"
task.arguments = ["-S", "localhost:\(portNumber)", "-t", directoryURL.path!]
// Hide the output from the PHP server
task.standardOutput = NSPipe()
task.standardError = NSPipe()

task.launch()

0

@ nacho4d समाधान अच्छा है। मैं इसे थोड़ा बदलना चाहता हूं लेकिन मुझे नहीं पता कि इसे अपनी पोस्ट में कैसे बदलना है। इसलिए मैंने इसे यहाँ रखा है मुझे आशा है कि आप बुरा नहीं मानेंगे। धन्यवाद।

यदि आपके पास एक www फ़ोल्डर है, तो कई अन्य फाइलें जैसे png, css, js इत्यादि हैं, तब आपको सभी फ़ाइलों को tmp / www फ़ोल्डर में कॉपी करना होगा। उदाहरण के लिए, आपके पास इस तरह एक www फ़ोल्डर है: यहाँ छवि विवरण दर्ज करें

फिर स्विफ्ट 2.0 में:

override func viewDidLoad() {
    super.viewDidLoad()

    let path = NSBundle.mainBundle().resourcePath! + "/www";
    var fileURL = NSURL(fileURLWithPath: path)
    if #available(iOS 9.0, *) {
        let path = NSBundle.mainBundle().pathForResource("index", ofType: "html", inDirectory: "www")
        let url = NSURL(fileURLWithPath: path!)
        self.webView!.loadRequest(NSURLRequest(URL: url))
    } else {
        do {
            fileURL = try fileURLForBuggyWKWebView8(fileURL)
            let url = NSURL(fileURLWithPath: fileURL.path! + "/index.html")
            self.webView!.loadRequest( NSURLRequest(URL: url))
        } catch let error as NSError {
            print("Error: \(error.debugDescription)")
        }
    }
}

फंक्शन fileURLForBuggyWKWebView8 को @ nacho4d से कॉपी किया गया है:

func fileURLForBuggyWKWebView8(fileURL: NSURL) throws -> NSURL {
    // Some safety checks
    var error:NSError? = nil;
    if (!fileURL.fileURL || !fileURL.checkResourceIsReachableAndReturnError(&error)) {
        throw error ?? NSError(
            domain: "BuggyWKWebViewDomain",
            code: 1001,
            userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("URL must be a file URL.", comment:"")])
    }

    // Create "/temp/www" directory
    let fm = NSFileManager.defaultManager()
    let tmpDirURL = NSURL.fileURLWithPath(NSTemporaryDirectory())
    try! fm.createDirectoryAtURL(tmpDirURL, withIntermediateDirectories: true, attributes: nil)

    // Now copy given file to the temp directory
    let dstURL = tmpDirURL.URLByAppendingPathComponent(fileURL.lastPathComponent!)
    let _ = try? fm.removeItemAtURL(dstURL)
    try! fm.copyItemAtURL(fileURL, toURL: dstURL)

    // Files in "/temp/www" load flawlesly :)
    return dstURL
}

-1

प्रयोग करके देखें

[webView loadHTMLString:htmlFileContent baseURL:baseURL];

लगता है यह अभी भी काम कर रहा है। फिर भी।


धन्यवाद मैं इसे आज़माऊंगा।
लिम थोये बीन

3
यह केवल HTML फ़ाइल के लिए काम करता है न कि संसाधन, सही?
लिम थोये बीन

1
दुर्भाग्य से हाँ, केवल HTML फ़ाइल लोड हो रही है। चलो आशा करते हैं कि यह सिर्फ एक बग है, और स्थानीय फ़ाइलों को लोड करने के लिए नया प्रतिबंध नहीं है। मैं WebKit स्रोतों में इस बग को खोजने का प्रयास कर रहा हूं।
ओलेक्सी III

1
मैं एक ही समस्या में चला गया हूँ - HTML फ़ाइलें भरी हुई हैं, लेकिन छवियाँ और अन्य संसाधन जो स्थानीय फ़ाइल सिस्टम पर हैं लोड नहीं हैं। कंसोल में, WebKit "स्थानीय संसाधन लोड करने की अनुमति नहीं है" एक त्रुटि फेंक रहा है। मैंने इसके लिए एक बग दर्ज किया, रडार # 17835098
मिंझारो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.