如何在iOS WKWebView上加载带有pdf的html文件

如何在iOS WKWebView上加载带有pdf的html文件,ios,uiwebview,wkwebview,pdfjs,Ios,Uiwebview,Wkwebview,Pdfjs,在我的项目中,我使用的是PDFJS库。我正在UIWebView上加载本地pdf。但这会占用大量RAM内存,有时会崩溃。为了避免这种情况,我想使用WKWebView 在UIWebview中,我这样使用(self指UIView的子类) 当我在上面的代码片段中打印finalPath时,控制台输出是/var/containers/Bundle/Application/DF419672-CF14-4B60-BE4F-EC0AC07C23AE/WebviewPOC.app/PDFJS/web/viewer.

在我的项目中,我使用的是
PDFJS
库。我正在
UIWebView
上加载本地pdf。但这会占用大量RAM内存,有时会崩溃。为了避免这种情况,我想使用
WKWebView

UIWebview
中,我这样使用(
self
UIView
的子类)

当我在上面的代码片段中打印finalPath时,控制台输出是
/var/containers/Bundle/Application/DF419672-CF14-4B60-BE4F-EC0AC07C23AE/WebviewPOC.app/PDFJS/web/viewer.html?file=/var/containers/Bundle/Application/DF419672-CF14-4B60-BE4F-EC0AC07C23AE/WebviewPOC.app/swift\u tutorial.pdf#page=1

WKWebView
loadFileURL
loadHTMLString
方法可用于加载本地html文件或本地pdf文件,效果良好。但不是两者都有。对于此html文件,如何附加本地pdf路径并加载到
WKWebView


谢谢你的帮助

让我回答我自己的问题

我使用这个库创建了一个本地主机服务器。 现在,这将创建通过主机名访问本地文件的权限。使用这种方法,应用程序的内存利用率得到了很大的优化(只是因为WKWebView)

现在,最后一个是

http://localhost:8080/~~~~~~~/PDFJS/web/viewer.html?file=/Users/~~~~~~/swift_tutorial.pdf#page=1

让我回答我自己的问题

我使用这个库创建了一个本地主机服务器。 现在,这将创建通过主机名访问本地文件的权限。使用这种方法,应用程序的内存利用率得到了很大的优化(只是因为WKWebView)

现在,最后一个是

http://localhost:8080/~~~~~~~/PDFJS/web/viewer.html?file=/Users/~~~~~~/swift_tutorial.pdf#page=1

因为苹果将拒绝使用UIWebView API的应用程序,所以我在从UIWebView迁移到WKWebView的过程中遇到了同样的问题。但由于我使用的是Xamarin框架,所以不能使用WKWebViewLocal库。我的解决方案非常相似

首先,您需要在CustomRenderer for WKWebView的OnElementChanged方法中添加以下代码:

Control.Configuration.Preferences.SetValueForKey(NSObject.FromObject(true), new NSString("allowFileAccessFromFileURLs"));
它将为该控件访问文件。没有它,pdfjs将无法加载文档,并且将始终显示为空

然后您需要更改读取文件的代码:

_pdfViewerAddress = (NSString)NSBundle.PathForResourceAbsolute("pdfjs/web/viewer", "html", NSBundle.MainBundle.ResourcePath);

if (UsePDFJS)
                {
                    var pdfjsUrlString = $"file://{_pdfViewerAddress}";
                    var pdfjsUrl = new NSUrl(pdfjsUrlString);

                    var docUrlString = $"file://{GetDocumentUrl()}";
                    var docFolderUrlString = new NSUrl($"file://{Element.PathWithoutFileName}");

                    var finalUrl = new NSUrl($"{pdfjsUrl}?file={docUrlString}#page=1");

                    Control.LoadFileUrl(finalUrl, docFolderUrlString);
                }
                else
                {
                    var error = new NSError();
                    var documentDirUrl = NSFileManager.DefaultManager.GetUrl(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User, null, false, out error);
                    var dotsFolderUrl = documentDirUrl.Append("..", true);
                    var libFolderUrl = dotsFolderUrl.Append("Library", true);
                    var tempFolderUrl = libFolderUrl.Append("TemporaryFiles", true);
                    var fileUrl = new NSUrl($"file://{GetDocumentUrl()}");

                    Control.LoadFileUrl(fileUrl, tempFolderUrl);
                }
如果使用pdfjs finalUrl,则应如下所示:

file:///private/var/containers/Bundle/Application/80424409-E164-4409-A72B-43B32EC51F1A/iOS.app/pdfjs/web/viewer.html?file=file:///var/mobile/Containers/Data/Application/ED7233AE-8D10-41DC-8AF4-10662F14A883/Documents/../Library/TemporaryFiles/10850908.pdf#page=1
就这些。不需要外部库。如果您想从BundleResources打开文档,也可以这样做。您可以使用以下代码轻松访问它:

(NSString)NSBundle.PathForResourceAbsolute("Guide", "pdf", NSBundle.MainBundle.ResourcePath);

因为苹果将拒绝使用UIWebView API的应用程序,所以我在从UIWebView迁移到WKWebView的过程中遇到了同样的问题。但由于我使用的是Xamarin框架,所以不能使用WKWebViewLocal库。我的解决方案非常相似

首先,您需要在CustomRenderer for WKWebView的OnElementChanged方法中添加以下代码:

Control.Configuration.Preferences.SetValueForKey(NSObject.FromObject(true), new NSString("allowFileAccessFromFileURLs"));
它将为该控件访问文件。没有它,pdfjs将无法加载文档,并且将始终显示为空

然后您需要更改读取文件的代码:

_pdfViewerAddress = (NSString)NSBundle.PathForResourceAbsolute("pdfjs/web/viewer", "html", NSBundle.MainBundle.ResourcePath);

if (UsePDFJS)
                {
                    var pdfjsUrlString = $"file://{_pdfViewerAddress}";
                    var pdfjsUrl = new NSUrl(pdfjsUrlString);

                    var docUrlString = $"file://{GetDocumentUrl()}";
                    var docFolderUrlString = new NSUrl($"file://{Element.PathWithoutFileName}");

                    var finalUrl = new NSUrl($"{pdfjsUrl}?file={docUrlString}#page=1");

                    Control.LoadFileUrl(finalUrl, docFolderUrlString);
                }
                else
                {
                    var error = new NSError();
                    var documentDirUrl = NSFileManager.DefaultManager.GetUrl(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User, null, false, out error);
                    var dotsFolderUrl = documentDirUrl.Append("..", true);
                    var libFolderUrl = dotsFolderUrl.Append("Library", true);
                    var tempFolderUrl = libFolderUrl.Append("TemporaryFiles", true);
                    var fileUrl = new NSUrl($"file://{GetDocumentUrl()}");

                    Control.LoadFileUrl(fileUrl, tempFolderUrl);
                }
如果使用pdfjs finalUrl,则应如下所示:

file:///private/var/containers/Bundle/Application/80424409-E164-4409-A72B-43B32EC51F1A/iOS.app/pdfjs/web/viewer.html?file=file:///var/mobile/Containers/Data/Application/ED7233AE-8D10-41DC-8AF4-10662F14A883/Documents/../Library/TemporaryFiles/10850908.pdf#page=1
就这些。不需要外部库。如果您想从BundleResources打开文档,也可以这样做。您可以使用以下代码轻松访问它:

(NSString)NSBundle.PathForResourceAbsolute("Guide", "pdf", NSBundle.MainBundle.ResourcePath);

我已经尝试了以上的改变,但它不适合我。你能分享一些关于这方面的例子吗?我已经尝试了以上的改变,但它不适合我。你能分享一些关于这方面的样品吗?