Untuk beta iOS 8 sebelumnya, muat aplikasi web lokal (dalam Bundel) dan itu berfungsi dengan baik untuk keduanya UIWebView
dan WKWebView
, dan saya bahkan mem-porting game web menggunakan WKWebView
API baru .
var url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("car", ofType:"html"))
webView = WKWebView(frame:view.frame)
webView!.loadRequest(NSURLRequest(URL:url))
view.addSubview(webView)
Tapi di beta 4, saya hanya mendapat layar putih kosong ( UIWebView
masih berfungsi), sepertinya tidak ada yang dimuat atau dieksekusi. Saya melihat kesalahan di log:
Tidak dapat membuat ekstensi kotak pasir untuk /
Ada bantuan untuk membimbing saya ke arah yang benar? Terima kasih!
Jawaban:
Mereka akhirnya memecahkan bug tersebut! Sekarang kita bisa menggunakan
-[WKWebView loadFileURL:allowingReadAccessToURL:]
. Rupanya perbaikan itu bernilai beberapa detik dalam video WWDC 2015 504 Memperkenalkan Pengontrol Tampilan SafariUntuk iOS8 ~ iOS10 (Swift 3)
Seperti jawaban Dan Fabulish menyatakan ini adalah bug WKWebView
yang tampaknya tidak akan diselesaikan dalam waktu dekatdan seperti yang dia katakan adapenyelesaian:)Saya menjawab hanya karena saya ingin menunjukkan hasil kerja di sini. Kode IMO yang ditampilkan di https://github.com/shazron/WKWebViewFIleUrlTest penuh dengan detail tidak terkait yang mungkin tidak menarik bagi kebanyakan orang.
Solusinya adalah 20 baris kode, penanganan kesalahan dan komentar disertakan, tidak perlu server :)
Dan bisa digunakan sebagai:
sumber
let orgFolder = NSBundle.mainBundle().resourcePath! + "/www"; var newFilePath = pathForBuggyWKWebView(orgFolder) self.loadingWebView!.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(newFilePath!+"/Loading.html")!))
WKWebView tidak dapat memuat konten dari file: URL melalui
loadRequest:
metodenya. http://www.openradar.me/18039024Anda dapat memuat konten melalui
loadHTMLString:
, tetapi jika baseURL Anda adalah file: URL, maka itu tetap tidak akan berfungsi.iOS 9 memiliki API baru yang akan melakukan apa yang Anda inginkan ,
[WKWebView loadFileURL:allowingReadAccessToURL:]
.Ada solusi untuk iOS 8 , yang ditunjukkan oleh shazron di Objective-C di sini https://github.com/shazron/WKWebViewFIleUrlTest untuk menyalin file ke
/tmp/www
dan memuatnya dari sana .Jika Anda bekerja di Swift, Anda dapat mencoba sampel nachos4d sebagai gantinya. (Ini juga jauh lebih pendek dari sampel shazron, jadi jika Anda mengalami masalah dengan kode shazron, cobalah sebagai gantinya.)
sumber
/tmp/www/
. GunakanNSTemporaryDirectory()
danNSFileManager
untuk membuatwww
direktori (karena tidak ada direktori seperti itu secara default). Kemudian salin file Anda di sana dan sekarang baca file ini :)Contoh cara menggunakan [WKWebView loadFileURL: allowReadAccessToURL:] di iOS 9 .
Saat Anda memindahkan folder web ke sebuah proyek, pilih "Buat referensi folder"
Kemudian gunakan kode seperti ini (Swift 2):
Dalam file html gunakan jalur file seperti ini
tidak seperti ini
Contoh direktori yang dipindahkan ke proyek xcode.
sumber
Solusi sementara: Saya menggunakan GCDWebServer , seperti yang disarankan oleh GuidoMB.
Saya pertama kali menemukan jalur folder "www /" yang saya bundel (yang berisi "index.html"):
... lalu mulai seperti ini:
Untuk menghentikannya:
Performa tampak bagus, bahkan di iPad 2.
Saya melihat crash setelah aplikasi masuk ke latar belakang, jadi saya menghentikannya
applicationDidEnterBackground:
danapplicationWillTerminate:
; Saya memulai / memulai ulangapplication:didFinishLaunching...
danapplicationWillEnterForeground:
.sumber
WKWebView
diberikanUIWebView
. Sebaiknya tetap dengan API lama sampai ini diperbaiki.Ini memecahkan masalah untuk saya iOS 8.0+ dev.apple.com
juga ini tampaknya bekerja dengan baik juga ...
sumber
allowFileAccessFromFileURLs
pendekatannya macetNSUnknownKeyException
.Selain solusi yang disebutkan oleh Dan Fabulich, XWebView adalah solusi lain. [WKWebView loadFileURL: allowingReadAccessToURL:] yang dilaksanakan melalui ekstensi .
sumber
Saya belum bisa berkomentar, jadi saya memposting ini sebagai jawaban terpisah.
Ini adalah versi objektif-c dari solusi nacho4d . Solusi terbaik yang pernah saya lihat sejauh ini.
sumber
Jika Anda mencoba untuk menampilkan gambar lokal di tengah string HTML yang lebih besar seperti
<img src="file://...">
:, gambar tersebut masih tidak muncul di perangkat, jadi saya memuat file gambar ke NSData dan dapat menampilkannya dengan mengganti string src dengan datanya sendiri. Kode contoh untuk membantu membangun string HTML untuk dimuat ke WKWebView, di mana hasilnya akan menggantikan apa yang ada di dalam tanda kutip src = "":Cepat:
Objective-C:
sumber
result += "data:image/" + attachmentType + ";base64," + base64String
WKWebView
sebagai<img>
dalam HTMLstring.Saya menggunakan di bawah ini. Memiliki beberapa hal tambahan yang sedang saya kerjakan tetapi Anda dapat melihat di mana saya mengomentari loadRequest dan saya mengganti panggilan loadHTMLString. Semoga ini bisa membantu sampai mereka memperbaiki bug.
sumber
Untuk siapa yang harus mengatasi masalah ini di bawah iOS8:
Jika halaman Anda tidak rumit, Anda dapat memilih untuk menjadikan halaman tersebut sebagai Aplikasi Halaman Tunggal.
Dengan kata lain, untuk menyematkan semua sumber daya ke dalam file html.
Yang harus dilakukan: 1. salin konten file js / css Anda ke / tags di file html masing-masing; 2. konversikan file gambar Anda menjadi svg untuk menggantikan yang sesuai. 3. memuat halaman seperti sebelumnya, menggunakan [webView loadHTMLString: baseURL:], misalnya
Ini sedikit berbeda dengan menata gambar svg, tetapi itu seharusnya tidak terlalu menghalangi Anda.
Tampaknya kinerja perenderan halaman sedikit menurun, tetapi solusi sederhana seperti itu layak bekerja di iOS8 / 9/10.
sumber
Di baris yang sama dengan GCDWebServer, saya menggunakan SImpleHttpServer ( http://www.andyjamesdavies.com/blog/javascript/simple-http-server-on-mac-os-x-in-seconds ) dan kemudian loadRequest dengan localhost url. Dengan pendekatan ini Anda tidak perlu menambahkan pustaka apa pun, tetapi file situs web tidak akan ada dalam bundel sehingga tidak akan dapat dikirimkan. Karena itu, ini akan lebih sesuai untuk kasus Debug.
sumber
Saya telah berhasil menggunakan server web PHP di OS X. Menyalin ke direktori sementara / www tidak berhasil untuk saya. Python SimpleHTTPServer mengeluh tentang keinginan membaca jenis MIME, mungkin masalah sandboxing.
Berikut server yang menggunakan
php -S
:sumber
@ nacho4d solusinya bagus. Saya ingin mengubahnya sedikit tetapi saya tidak tahu bagaimana mengubahnya di posting Anda. Jadi saya taruh di sini, saya harap Anda tidak keberatan. Terima kasih.
Jika Anda memiliki folder www, ada banyak file lain seperti png, css, js dll. Kemudian Anda harus menyalin semua file ke folder tmp / www. misalnya, Anda memiliki folder www seperti ini:
lalu di Swift 2.0:
file fungsiURLForBuggyWKWebView8 disalin dari @ nacho4d:
sumber
Coba gunakan
Sepertinya itu masih berfungsi. Namun.
sumber