String
1、URL字符串的编码与解码
在我们开发应用的时候都会发送网络请求,如果拼接的
URL地址中包含有中文、空格、特殊符号时,就会无法正确访问,或者打开图片链接也含有中文、空格、特殊符号时也会无法正确访问,这时我们就要对其转义
- 我们可以使用
addingPercentEncoding方法实现编码的功能,也就是将指定的字符集使用%代替,在String的扩展中,我们增加两个属性:urlEncoding和urlDecoding
public extension String {
/// 编码
var urlEncoding: String {
if isEmpty { return "" }
guard let encodeUrlString = addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
return self
}
return encodeUrlString
}
/// 解码
var urlDecoding: String {
if isEmpty { return "" }
guard let decodingUrl = self.removingPercentEncoding else { return self }
return decodingUrl
}
}
这样基本就完成了,但是我在开发中遇到过这样的问题,就是后台返回的图片地址已经是编码过的,这时我对其再编码就会有问题,导致打不开。所以我们在编码的时候,不论url有没有编码,我们最好先解码一次
/// 编码
var urlEncoding: String {
if isEmpty { return "" }
let urlDecod = urlDecoding // 先解码,防止链接二次编码导致链接打不开
guard let encodeUrlString = urlDecod.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
return self
}
return encodeUrlString
}
2、打开URL
public extension String {
func openURL() {
guard let url = URL(string: self) else { return }
guard UIApplication.shared.canOpenURL(url) else { return }
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}
/// 拨打电话
func phone() {
guard let url = URL(string: "telprompt://\(self)") else { return }
guard UIApplication.shared.canOpenURL(url) else { return }
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}
}
3、获取url中的参数
- 我们可以使用
URLComponents来获取url中的参数,可以使用下面两种方法来初始化
/// 根据URL
public init?(url: URL, resolvingAgainstBaseURL resolve: Bool)
/// 根据URL String
public init?(string: String)
- 我们使用第一种来获取,在
URL的扩展中增加一个urlParameters()方法
public extension URL {
func urlParameters() -> [String: String]? {
guard let components = URLComponents(url: self, resolvingAgainstBaseURL: true),
let queryItems = components.queryItems else { return nil }
return queryItems.reduce(into: [String: String]()) { (result, item) in
result[item.name] = item.value
}
}
}
- 我们使用第二种来获取,在
String的扩展中增加一个urlParameters()方法
public extension String {
func urlParameters() -> [String: String]? {
guard let urlComponents = URLComponents(string: self),
let items = urlComponents.queryItems else { return nil }
return items.reduce(into: [String: String]()) { (result, item) in
result[item.name] = item.value
}
}
}