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的细节,以及多端的异同点,可以提高开发效率。

相关推荐
红橙Darren3 小时前
手写操作系统 - 编译链接与运行
android·ios·客户端
鹏多多.6 小时前
flutter-使用device_info_plus获取手机设备信息完整指南
android·前端·flutter·ios·数据分析·前端框架
麦兜*21 小时前
【swift】SwiftUI动画卡顿全解:GeometryReader滥用检测与Canvas绘制替代方案
服务器·ios·swiftui·android studio·objective-c·ai编程·swift
GeniuswongAir1 天前
iOS 26 一键登录失效:三大运营商 SDK 无法正常获取手机号
ios
吴Wu涛涛涛涛涛Tao1 天前
Flutter 实现类似抖音/TikTok 的竖向滑动短视频播放器
android·flutter·ios
陈涛5751 天前
5个最好用的 JSON 工具推荐:让数据处理变得简单高效
json
猪哥帅过吴彦祖1 天前
Flutter 插件工作原理深度解析:从 Dart 到 Native 的完整调用链路
android·flutter·ios
归辞...1 天前
「iOS」————UITableView性能优化
ios·性能优化·cocoa
AI工具测评与分析1 天前
EhViewer安卓ios全版本类下载安装工具的完整路径解析
android·ios