iOS 剪贴板访问指南
最后更新:2023/11/21
iOS 剪贴板访问 UX 方案 (方法已失效)
背景
Apple从iOS14后,增加了对剪贴板内容的隐私保护
在 iOS16 以上的版本中,由于新的隐私政策,你会发现在访问剪贴板数据的时候,会有如下所示的弹窗。
问题
由于 link_hash_id
或 native_msg
字段的数据来自于剪贴板。
而在iOS16中,只要读取了 UIPasteboard.general.string
就会弹出是否允许的弹窗,且弹窗没有暴露api来控制,也没有记录上次的点击结果。如果拒绝,下次读取还是会弹出。
为了提升用户体验,解决方案是,唤起 APP 不需要每次弹窗,只需判断剪贴板的内容是否是智链的再进行访问。能既不影响正常使用下的用户体验,并且,还能充分使用上剪贴板数据。
解决办法
先查看是否是智链的粘贴板内容,再调用UIPasteboard.general.string获取
在给 'link_hash_id' 传参的数据,我们建议做一下算法的判断
var clipboard = ""
if #available(iOS 15.0, *) {
UIPasteboard.general.detectValues(for: [\.flightNumbers, \.probableWebURL]) { result in
switch result {
case .success(let detectedValues):
guard detectedValues.flightNumbers.first != nil else {
return
}
guard detectedValues.probableWebURL.first != nil else {
return
}
clipboard = UIPasteboard.general.string ?? ""
case.failure(let err):
print("读取粘贴板失败:\(err)")
}
}
} else if #available(iOS 14.0, *) {
UIPasteboard.general.detectPatterns(for: [UIPasteboard.DetectionPattern.probableWebURL]) { result in
switch result {
case .success(let dict):
if dict.contains(UIPasteboard.DetectionPattern.probableWebURL) {
clipboard = UIPasteboard.general.string ?? ""
}
case.failure(let err):
print("读取粘贴板失败:\(err)")
}
}
} else {
clipboard = UIPasteboard.general.string ?? ""
}
以上代码只做参考,在经过算法判断后取得的是剪贴板数据。