先阐述背景:

app需要集成一个本地的html文件,并且在调用时url带参数。如:

analysis.html?sId=417492&apiUrl=http://192.168.100.1:8888

1、传统方法。

首先我采取了之前的本地网页集成方法

//htmlPath即是本地html的路径,filename即是html名

NSString *filePath = [htmlPath stringByAppendingPathComponent:filename];

NSString *htmlString = [[NSString alloc]initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

[webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:htmlPath]];

传入文件名filename = @"analysis.html?sId=417492&apiUrl=http://192.168.100.1:8888";

发现htmlString为空,并不能通过带参数的文件地址找到对应的文件。

后来也试过NSString的initWithContentsOfURL等方法。均无法实现需求。

放弃。

2、relativeToURL

之后我找到了另一个方法

NSString *filePath = [htmlPath stringByAppendingPathComponent:filename];

NSURL *fileUrl = [NSURL URLWithString:@"?sId=417492&apiUrl=http://192.168.100.1:8888"

relativeToURL:[NSURL fileURLWithPath:filePath]];

NSURLRequest *request = [NSURLRequest requestWithURL: fileUrl];

[webView loadRequest:request];

经试验,该方法可以正常打开html文件,并将参数传入。

需要注意的是,有时候我们发现使用[NSURL URLWithString:filePath]也可以达到相同的效果,在UIWebView是这样的,但放到WKWebView就行不通了,所以还是建议统一使用:[NSURL fileURLWithPath:filePath]。

问题解决,于是轻松加惬意得继续扩展。还有没有更简单的方法呢?

3、直接拼URL

基于方法二,既然通过url,为什么不能直接将参数拼接在url后面呢。仔细看,其实这种用法其实很像网络请求的Get方法,所以

//htmlPath即是本地html的路径,filename=@"analysis.html?sId=417492&apiUrl=http://192.168.100.1:8888"

NSString *filePath = [htmlPath stringByAppendingPathComponent:filename];

接下来将path转化为url就好了吧?

NSURL *fileUrl = [NSURL fileURLWithPath: filePath];

NSURLRequest *request = [NSURLRequest requestWithURL: fileUrl];

[webview loadRequest:request];

然而并没有。网页并没有加载显示出来,自然参数也并没有传递进去。难道我想错了?

打印一下url发现

Printing description of fileUrl:

file:///var/containers/Bundle/Application/39A2343F-37E1-42B4-8D7E-F373A153BF1D/UrlDemo.app/statis/analysis.html%3FsId=417492&apiUrl=192.168.100.1:8888

发现问题:url中的"?"被转码成"%3F",直接导致整个url的解析失败。再然后,我试过对参数编码,对path编码,最后发现,是在方法二中建议使用的fileURLWithPath:的问题,在该方法中,会自动进行编码。不推荐使用的URLWithString:方法反而不会。于是为了解决编码问题,我尝试着使用URLWithString将Path转化成URL

NSURL *fileUrl = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@", filePath]];

就是手动拼接一个文件头。打印url正常,编译正常,运行正常,正确打开网页并传递了参数。

但是总觉得手动拼一个头做法不太正规,于是继续挖坑。

4、NSURLComponents

直接上代码

NSString *filePath = [htmlPath stringByAppendingPathComponent:filename];

NSURL *fileUrl = [NSURL fileURLWithPath:filePath isDirectory:NO];//此部分没有?所以没有问题,isDirectory=YES会导致多一层目录。

NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:fileUrl resolvingAgainstBaseURL:NO];

[urlComponents setQueryItems:@[[NSURLQueryItem queryItemWithName:@"sId" value:@"417492"], [NSURLQueryItem queryItemWithName:@"apiUrl" value:@"http://192.168.100.1:8888"]]];

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:urlComponents.URL];

正确实现需求。

综上,解决问题的方法永远不止一个。

不求甚解是一种态度;

浅尝辄止是一种态度;

刨根问底是一种态度;

精益求精是一种态度。

浅尝辄止了~

新建html带参数,本地html加载时带参数的问题相关推荐

  1. 海康工业相机功能模块-参数保存、加载、批量复制参数

    海康工业相机功能模块-参数保存与加载 前言 相机参数保存的快速方法 相机参数导入导出的操作方法 UserSetLoad 加载相机内部参数 FeatureLoad/FeatureSave FileAcc ...

  2. QWebEngineView 加载 flash插件参数配置

    QWebEngineView 加载 flash插件参数配置 官网 http://doc.qt.io/qt-5/qtwebengine-features.html Qt WebEngine 特性 主要看 ...

  3. 扣丁音乐(四)——本地音乐加载

    本文出自:http://blog.csdn.net/dt235201314/article/details/51341078 一丶本地音乐加载相当于就是listVIew应用 扣丁音乐1.0前部分(gi ...

  4. 【Flutter】Image 组件 ( 配置本地 gif 图片资源 | 本地资源加载 placeholder )

    文章目录 一.配置本地 gif 图片资源 二.本地资源加载 Placeholder 三.完整代码示例 四.相关资源 一.配置本地 gif 图片资源 配置 assets 图片资源 : 将 gif 图片拷 ...

  5. SAP Spartacus 4.0 源代码模式下开启 SSR,为什么会从本地去加载 all.css?

    为什么会从本地去加载 all.css 文件呢?这路径不对头: CSR 模式下,css 的加载是好的: 在 icon-loader.service.ts 代码里设置断点: 更多Jerry的原创文章,尽在 ...

  6. 【深度学习】——利用pytorch搭建一个完整的深度学习项目(构建模型、加载数据集、参数配置、训练、模型保存、预测)

    目录 一.深度学习项目的基本构成 二.实战(猫狗分类) 1.数据集下载 2.dataset.py文件 3.model.py 4.config.py 5.predict.py 一.深度学习项目的基本构成 ...

  7. uboot加载linux内核加载那些内容,几个地址参数及uboot加载启动内核过程的理解

    关于uBoot和Linux内核中几个地址参数及uboot加载启动内核过程的理解 uboot一般使用mkimage工具先制作一个启动映象文件来引导识别内核的,uboot源代码的tools/目录下有mki ...

  8. Springboot Web应用中服务器配置参数ServerProperties的加载

    #概述 Springboot配置文件中以server开头的项表示服务器的配置参数,这一点从字面意义即可直观理解,这些参数,包括端口,路径设置,SSL配置参数等等.具体有哪些参数,从源代码的角度上,可以 ...

  9. unity下载模型到本地并加载

    目录 1.目的 2.参考 2.1 Unity3D 动态加载本地/网络GLB模型 2.2 unity下载模型到本地并加载 2.3 插件:TriLib2.0 3.注意 4.操作 4.1 3dmax简单的制 ...

最新文章

  1. WIN7源码安装Apache和PHP注意事项
  2. 专用码计算机英语怎么说,计算机专用英语词汇整理
  3. 移动金融业务风控框架及设备风险识别的意义(上)
  4. linux电脑系统投到电视,教你如何在Linux操作系统下观看电视节目
  5. Java多线程之多线程之间按顺序调用
  6. 数据库连接池技术详解【吐血整理,疯狂推荐】
  7. jmeter(四十五)常用Beanshell脚本
  8. Vue在渲染函数createELement和JSX中使用插槽slot
  9. 安装chrome_Chrome 离线安装包下载
  10. This ZooKeeper instance is not currently serving requests
  11. CentOS下SNMP的安装与使用
  12. BZOJ1114 : [POI2008]鲁滨逊逃生Rob
  13. Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(7):信号通讯
  14. ZigBee组网实验:多终端节点向协调器发送数据amp;协调器给终端节点发送数据
  15. 东方联盟郭盛华发家史:8年来实现跨越式发展
  16. 穷举查找之旅行商问题、背包问题、分配问题
  17. 病毒、木马、蠕虫、rootkit和后门
  18. 如何生成java dump文件
  19. 8分频verilog线_七、八分频电路Verilog源代码
  20. “屌丝”身世-由一个低级趣味而来

热门文章

  1. 晒一波程序员的工位,你中意哪一款?
  2. 14 个经典的 Linux 终端命令行,这些工具堪称神器!
  3. 面试官:关于Spring就问这13个
  4. 海量数据处理:从并发编程到分布式系统
  5. 中小型金融企业该如何进行灾备建设?
  6. Java 8中Stream API的这些奇技淫巧!你都Get到了吗?
  7. C++语言基本类型—浮点型
  8. Linux常用命令及技巧1
  9. 05Observer/Event(观察者)模式
  10. 电商运营-跨境开网店全图解