iOS小技能:iOS14 讀取使用者剪下板資料彈出提示的相容方案
持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第12天,點選檢視活動詳情
前言
背景:在iOS14中,如果APP讀取剪下版的內容時,手機會彈出提示,提示哪個APP在獲取剪下板內容。
讀取
UIPasteboard
的string
、strings
、URL
、URLs
、image
、images
、color
、colors
的時候會觸發系統提示。 使用hasStrings
、hasURLs
、hasImages
、hasColors
等方法的時候不會觸發系統提示。
- 讀取剪貼簿的程式碼
像這種第三方SDK,及時聯絡對應的SDK開發者。比如極光的v3.3.6就及時進行了適配
在這裡插入圖片描述
劃重點
- 先判斷剪下板內容的各式,如果符合規則才讀取剪下板
- 查詢哪些SDK使用了剪下板,及時升級SDK。
比如發現了JCore SDK在iOS 14引用剪貼簿,該行為導致APP被使用者懷疑隱私洩露,請予以重視
I、彈出提示的相容方案:儘可能少的去呼叫會觸發系統提示的方法
彈出提示的原因:使用 UIPasteboard 訪問使用者資料
方案一:先判斷剪下板內容的各式,如果符合規則採取讀取。
例如app讀取口令時判斷是否符合數字和連結的規則
方案二:使用changeCount
來記錄剪下板的資料是否發生變化
1.1 先判斷剪下板內容的各式,如果符合規則才讀取剪下板(例如淘寶的淘口令)
如果應用僅僅訪問只訪問URL格式的剪下板內容,或者特定規則的內容,比如淘口令,就可以使用API先判斷,確實是符合規則的時候再去讀取
判斷是否為URL格式: UIPasteboardDetectionPatternAPI
``` typedef NSString * UIPasteboardDetectionPattern NS_TYPED_ENUM API_AVAILABLE(ios(14.0));
/// NSString value, suitable for implementing "Paste and Go" UIKIT_EXTERN UIPasteboardDetectionPattern const UIPasteboardDetectionPatternProbableWebURL API_AVAILABLE(ios(14.0));
/// NSString value, suitable for implementing "Paste and Search" UIKIT_EXTERN UIPasteboardDetectionPattern const UIPasteboardDetectionPatternProbableWebSearch API_AVAILABLE(ios(14.0));
/// NSNumber value UIKIT_EXTERN UIPasteboardDetectionPattern const UIPasteboardDetectionPatternNumber API_AVAILABLE(ios(14.0)); ```
下面 API 可以獲得具體的 URL 資訊,但是會觸發剪下板提示。並且實測當用戶剪下板中包含多個 URL 時只會返回第一個。
``` // Detection
/// Detects patterns in the first pasteboard item.
///
/// @param patterns Detect only these patterns.
/// @param completionHandler Receives which patterns were detected, or an error.
- (void)detectPatternsForPatterns:(NSSet
- 例子
``` NSSet *patterns = [[NSSet alloc] initWithObjects:UIPasteboardDetectionPatternProbableWebURL, nil];
[[UIPasteboard generalPasteboard] detectPatternsForPatterns:patterns completionHandler:^(NSSet
1.2 使用changeCount
來記錄剪下板的資料是否發生變化
記錄一下真正讀取剪下板時的changeCount
,如果下次讀取的時候沒有發生變化則不讀取。 這樣一來效果就好多了,應用執行生命週期內,基本上只會彈出一次提示
II 、 查詢哪些SDK使用了剪下板
app出現了從後臺喚起會彈出 讀取剪下板的 提示,安全部門要求要趕緊查,全域性搜尋了code,發現並沒有讀取剪下板的程式碼,比竇娥還冤,只能是第三方SDK的了,
2.1 Symbolic breakpoint 進行查詢
- 用Xcode的Symbolic breakpoint,除錯
[UIPasteboard generalPasteboard]
使用例子:
- 從後臺喚起app會有這個提示
- 單步向下走幾步,然後就會出現呼叫方
在這裡插入圖片描述
立馬發現了JCore iOS SDK在iOS 14引用剪貼簿該行為會導致APP被使用者懷疑隱私洩露,請予以重視
升級新版進行適配 iOS 14。
pod 'JPush' , '3.3.6'
2.2 使用命令列查詢哪些SDK使用了剪下板
grep -r "UIPasteboard" .
➜ retail git:(develop) grep -r "UIPasteboard" .
./retail/other/tool/CopyTextLabel/QCTCopyTextLabel.m: UIPasteboard * paste = [UIPasteboard generalPasteboard];
./retail/class/business/Merchant_self_recording開戶申請/oldNewAddStores/NewAddStores/QCTCopyLabel.m: UIPasteboard * paste = [UIPasteboard generalPasteboard];
./retail/class/business/Merchant_self_recording開戶申請/oldNewAddStores/NewAddStores/QCTStoresDetailViewController.m: [UIPasteboard generalPasteboard].string = titleLab.text ? titleLab.text : @"";
Binary file ./Pods/JCore/libjcore-ios-2.3.2.a matches
./Pods/QMUIKit/QMUIKit/QMUIComponents/QMUILabel.m: UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
Binary file ./Pods/JPush/libjpush-ios-3.3.4.a matches
find . -type f | grep -e ".framework" | xargs grep -s UIPasteboard
```
➜ Housekeeper git:(develop) find . -type f | grep -e ".framework" | xargs grep -s UIPasteboard
Binary file ./Housekeeper/other/extension/iOS/thirdparties/thirdparties_ios_1.0.5/UTDID.framework/Versions/A/UTDID matches Binary file ./Housekeeper/other/extension/iOS/common/common_ios_2.1.1/normal/UMCommon.framework/Versions/A/UMCommon matches ```
find . -type f | grep -e ".a" | xargs grep -s AUPasteboard
III 、例子:升級JPush SDK
pod 'JPush' , '3.3.6'
在這裡插入圖片描述
在這裡插入圖片描述
IV、 see also
在這裡插入圖片描述
4.1 升級CocoaPods(適配Xcode12)
- 升級採用gem即可,命令如下
sudo gem install cocoapods
發現版本1.9.1 與Xcode12 不是很匹配,於是就升級新版本看下。
➜ Housekeeper git:(develop) pod --version
1.9.1
如果沒升級,主要問題是,如果採用pod install --verbose --no-repo-update 之後,Xcode的編譯設定
不會 自動修改other Linker Flags
在這裡插入圖片描述
在這裡插入圖片描述
升級到1.9.3 再次升級SDK的時候,就適配Xcode12,可以自動修改other Linker Flags引數了
在這裡插入圖片描述
因此升級Xcode的時候,最好也同時升級下CocoaPods
- iOS小技能:UITableView的適配 (iOS10/iOS14/iOS16.0)
- iOS小技能:和uni-app、unity的融合方案
- iOS小技能:iOS15崩潰排查技巧(symbolicatecrash符號化分析問題、匯出和隱藏符號)
- iOS小技能:【intercept the HTTP/HTTPS requests 】利用NSURLProtocol 攔截請求
- iOS小技能: tweak 整合CocoaAsyncSocket(建連、斷開、重連、心跳、通用請求)
- iOS小技能:iOS13 證件掃描 & 文字識別API
- iOS小技能:整合下拉重新整理控制元件 & 實現無感知上拉載入更多
- iOS小技能:程式碼觸發button的點選事件、快速找到按鈕action方法
- iOS小技能:撥號、發郵件、簡訊、應用間跳轉
- iOS小技能:鏈式程式設計在iOS開發中的應用
- iOS小技能:iOS14 讀取使用者剪下板資料彈出提示的相容方案
- iOS小技能:因境外IP無法訪問導致 App 被拒的解決方案
- iOS小技能:RSA簽名、驗籤、加密、解密的原理
- iOS小技能:Xcode14新特性(適配)
- iOS小技能:Socket基礎知識
- iOS小技能:SKU檢視搭建
- iOS小技能: 日曆的使用(案例:兩個時間的比較、獲取最近30天的資料)
- iOS小技能:1. iOS 實現json資料提交 2. 對同一個URL的多次請求進行資料快取 3. 檢查網路狀態
- iOS小技能:使用正則表示式對聊天記錄的關鍵詞進行監控
- iOS小技能:去掉/新增導航欄黑邊(iOS13適配)