iOS开发:关于URL解析

iOS与Android对URL的解析

首先分析了一下iOS与Android在解析URL上是否有差异。

iOS的解析:

swift 复制代码
guard let url = URLComponents(string: "http://www.example.com:80/path/to/resource.html?param=value#fragment") else {
    return
}

// 获取协议
let scheme = url.scheme ?? ""
print("url Protocol: " + scheme)

// 获取主机名
let host = url.host ?? ""
print("url Host: " + host)

// 获取端口号
let port = url.port ?? -1
print("url Port: \(port)")

// 获取路径
let path = url.path
print("url Path: " + path)

// 获取查询字符串
let query = url.query ?? ""
print("url Query: " + query)

var dict = [String: String]()
if let queryItems = url.queryItems {
    dict = queryItems.toDict
}
print("url dict: \(dict)")

// 获取片段
let ref = url.fragment ?? ""
print("url Ref: " + ref)

/**
url Protocol: http
url Host: www.example.com
url Port: 80
url Path: /path/to/resource.html
url Query: param=value
url Ref: fragment
*/

Android的解析:

java 复制代码
import java.net.URL;
import java.net.MalformedURLException;

public class URLParsingExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://www.example.com:80/path/to/resource.html?param=value#fragment");

            // 获取协议
            String protocol = url.getProtocol();
            System.out.println("Protocol: " + protocol);

            // 获取主机名
            String host = url.getHost();
            System.out.println("Host: " + host);

            // 获取端口号
            int port = url.getPort();
            System.out.println("Port: " + port);

            // 获取路径
            String path = url.getPath();
            System.out.println("Path: " + path);

            // 获取查询字符串
            String query = url.getQuery();
            System.out.println("Query: " + query);

            // 获取片段
            String ref = url.getRef();
            System.out.println("Ref: " + ref);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

Protocol: http
Host: www.example.com
Port: 80
Path: /path/to/resource.html
Query: param=value
Ref: fragment

小结

其实可以看出,iOS和Android对于URL的解析基本上是一致的。

  • ?用于分割前后,前面可以认为是路径,后面的可以认为是参数

  • param=value&name=season,通过=与&用来分割参数

  • 最后通过#用来分割Fragment

遇到的异常情况

我们在通过name=value这种形式进行传参的时候,不可避免可能会使用到#与?符号,比如下面:

shell 复制代码
haha://abcd?param=value&id=12345678&jumpType=information&content=我关注的话题#你好啊?

content=我关注的话题#你好啊?其实是{ content: 我关注的话题#你好啊? }这样一个json,但是会被截取成下面这样子:

shell 复制代码
url Query: param=value&id=12345678&jumpType=information&content=我关注的话题
url dict: ["id": "12345678", "content": "我关注的话题", "jumpType": "information", "param": "value"]
url Ref: 你好啊

content=我关注的话题#你好啊?明明是一个完整的参数,但是因为解析的策略,#与?都被截掉了。

思路

为了保证语义的完整性。

我们可以考虑将name=value这种形式进行传参转换为json:{"id": "12345678", "content": "我关注的话题#你好啊?", "jumpType": "information", "param": "value"},然后再转成jsonString,最后使用base64进行加密获得string,这里使用base64进行加密是为了保证加密后的数据没有可以被解析的符号。

App侧拿到后,先将这个string通过base64解密,获得完整的jsonString,然后就可以正常解析了。

例子

这个例子中有jumpType、id、jsonString三个参数,然后jsonString里面包含了很多个参数

javascript 复制代码
nm://home?jumpType=TopicDetail&id=d308e8ff62dbb382a106def90d946759&jsonString=e1widGFsa2luZ05hbWVcIjpcIuaIkeeahOaPkOi9puaXpeiusFwiLFwiaG90UmF0ZVwiOjEyMzgsXCJ2aWV3Q291bnRcIjo0NzY1MixcInN0YXR1c1wiOjF9

解析jsonString

json 复制代码
"{\"talkingName\":\"我的提车日记\",\"hotRate\":1238,\"viewCount\":47652,\"status\":1}"

base64加解密会不会出现#?=这个符号呢?

有关与这个,我去查阅了一下资料

Swift 中,使用 Base64 编码后的字符串不会包含 ?#& 这些符号。Base64 编码的输出只会包含以下字符:

  • 大写字母:A-Z
  • 小写字母:a-z
  • 数字:0-9
  • 加号:+
  • 斜杠:/
  • 等号:=(用于填充)

这些字符是 Base64 编码标准的一部分,确保编码后的字符串可以安全地在文本环境中传输。

但是会不会出现异常情况呢?这个还真不能保证。

总结

URL解析其实不仅涉及到网络请求,有些路由规则与传参也会涉及到URL的拼接与规则,了解URL的细节,以及多端的异同点,可以提高开发效率。

相关推荐
@大迁世界16 小时前
14个你现在必须关闭的 iOS 26 设置,不然手机很快被它榨干
macos·ios·智能手机·objective-c·cocoa
四眼蒙面侠1 天前
深入 SwiftWork(第 0 篇):用 SwiftUI 构建一个 Agent 可视化工作台
swift·openagentsdk
YJlio1 天前
10.2.8 以其他账户运行服务(Running services in alternate accounts):为什么“把服务切到某个用户账号下运行”,本质上是在改变服务的整个安全上下文?
python·安全·ios·机器人·django·iphone·7-zip
pop_xiaoli1 天前
【iOS】KVC与KVO
笔记·macos·ios·objective-c·cocoa
90后的晨仔1 天前
《swiftUI进阶 第10章:现代状态管理(iOS 17+)》
ios
ID_180079054732 天前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
sakiko_2 天前
UIKit学习笔记4-使用UITableView制作滚动视图
笔记·学习·ios·swift·uikit
代码AI弗森2 天前
配置文件战争:TOML/YAML/JSON 为何成为不同框架的“专属标配”?
json
小锋学长生活大爆炸2 天前
【开源软件】这次iPhone也是用上Claw了 | PhoneClaw
ios·开源软件·iphone·claw
SameX2 天前
独立开发一个把走过的路变成 km² 的 App,聊聊 25m 网格和后台 GPS 的坑
ios