iOS小技能:iOS14 读取用户剪切板数据弹出提示的兼容方案

持续创造,加速成长!这是我参加「日新计划 10 月更文应战」的第12天,点击检查活动概略

前语

布景:在iOS14中,假设APP读取剪切版的内容时,手时机弹出提示,提示哪个APP在获取剪切板内容。

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

读取UIPasteboardstringstringsURLURLsimageimagescolorcolors的时分会触发体系提示。 运用hasStringshasURLshasImageshasColors等方法的时分不会触发体系提示。

  • 读取剪贴板的代码
    iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

像这种第三方SDK,及时联络对应的SDK开发者。比如极光的v3.3.6就及时进行了适配

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

在这里刺进图片描绘

划要点

  • 先判别剪切板内容的各式,假设符合规则才读取剪切板
  • 查找哪些SDK运用了剪切板,及时晋级SDK。

比如发现了JCore SDK在iOS 14引用剪贴板,该行为导致APP被用户怀疑隐私泄露,请予以重视

I、弹出提示的兼容计划:尽可能少的去调用会触发体系提示的方法

弹出提示的原因:运用 UIPasteboard 访问用户数据

计划一:先判别剪切板内容的格式,假设符合规则采纳读取。

例如app读取口令时判别是否符合数字和链接的规则

iOS14 剪切板适配案例剖析:读取口令的完结方法

kunnan.blog.csdn.net/article/det…

计划二:运用changeCount来记载剪切板的数据是否发生变化

1.1 先判别剪切板内容的各式,假设符合规则才读取剪切板(例如淘宝的淘口令)

假设运用只是访问只访问URL格式的剪切板内容,或许特定规则的内容,比如淘口令,就能够运用API先判别,确实是符合规则的时分再去读取

判别是否为URL格式: UIPasteboardDetectionPatternAPI

typedefNSString*UIPasteboardDetectionPatternNS_TYPED_ENUMAPI_AVAILABLE(ios(14.0));
///NSStringvalue,suitableforimplementing"PasteandGo"
UIKIT_EXTERNUIPasteboardDetectionPatternconstUIPasteboardDetectionPatternProbableWebURLAPI_AVAILABLE(ios(14.0));
///NSStringvalue,suitableforimplementing"PasteandSearch"
UIKIT_EXTERNUIPasteboardDetectionPatternconstUIPasteboardDetectionPatternProbableWebSearchAPI_AVAILABLE(ios(14.0));
///NSNumbervalue
UIKIT_EXTERNUIPasteboardDetectionPatternconstUIPasteboardDetectionPatternNumberAPI_AVAILABLE(ios(14.0));

下面 API 能够获得详细的 URL 信息,但是会触发剪切板提示。而且实测当用户剪切板中包含多个 URL 时只会回来第一个。

//Detection
///Detectspatternsinthefirstpasteboarditem.
///
///@parampatternsDetectonlythesepatterns.
///@paramcompletionHandlerReceiveswhichpatternsweredetected,oranerror.
-(void)detectPatternsForPatterns:(NSSet<UIPasteboardDetectionPattern>*)patterns
completionHandler:(void()(NSSet<UIPasteboardDetectionPattern>*_Nullable,
NSError*_Nullable))completionHandlerNS_REFINED_FOR_SWIFTAPI_AVAILABLE(ios(14.0));

///Detectspatternsinthespecifiedpasteboarditems.
///
///@parampatternsDetectonlythesepatterns.
///@paramitemSetSpecifieswhichpasteboarditemsbytheirposition.Nilmeansallitems.
///@paramcompletionHandlerReceiveswhichpatternsweredetectedperitemspecified,
///oranerror.
-(void)detectPatternsForPatterns:(NSSet<UIPasteboardDetectionPattern>*)patterns
inItemSet:(NSIndexSet*_Nullable)itemSet
completionHandler:(void()(NSArray<NSSet<UIPasteboardDetectionPattern>*>*_Nullable,
NSError*_Nullable))completionHandlerNS_REFINED_FOR_SWIFTAPI_AVAILABLE(ios(14.0));

  • 比如
NSSet*patterns=[[NSSetalloc]initWithObjects:UIPasteboardDetectionPatternProbableWebURL,nil];
[[UIPasteboardgeneralPasteboard]detectPatternsForPatterns:patternscompletionHandler:(NSSet<UIPasteboardDetectionPattern>*_Nullableresult,NSError*_Nullableerror){
if(result&&result.count){
//其时剪切板中存在URL
}
}];

1.2 运用changeCount来记载剪切板的数据是否发生变化


iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

记载一下真实读取剪切板时的changeCount,假设下次读取的时分没有发生变化则不读取。 这样一来效果就好多了,运用运转生命周期内,基本上只会弹出一次提示

II 、 查找哪些SDK运用了剪切板

app呈现了从后台引发会弹出 读取剪切板的 提示,安全部分要求要急忙查,大局搜索了code,发现并没有读取剪切板的代码,比窦娥还冤,只能是第三方SDK的了,

2.1 Symbolic breakpoint 进行查找


  • 用Xcode的Symbolic breakpoint,调试[UIPasteboard generalPasteboard]

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划
iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

运用比如:

  • 从后台引发app会有这个提示
  • 单步向下走几步,然后就会呈现调用方

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

在这里刺进图片描绘

立马发现了JCore iOS SDK在iOS 14引用剪贴板该行为会导致APP被用户怀疑隐私泄露,请予以重视

晋级新版进行适配 iOS 14。

pod'JPush','3.3.6'

2.2 运用指令行查找哪些SDK运用了剪切板

  • grep -r "UIPasteboard" .
    iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划
➜retailgit:(develop)grep-r"UIPasteboard".
./retail/other/tool/CopyTextLabel/QCTCopyTextLabel.m:UIPasteboard*paste=[UIPasteboardgeneralPasteboard];
./retail/class/business/Merchant_self_recording开户请求/oldNewAddStores/NewAddStores/QCTCopyLabel.m:UIPasteboard*paste=[UIPasteboardgeneralPasteboard];
./retail/class/business/Merchant_self_recording开户请求/oldNewAddStores/NewAddStores/QCTStoresDetailViewController.m:[UIPasteboardgeneralPasteboard].string=titleLab.text?titleLab.text:@"";
Binaryfile./Pods/JCore/libjcore-ios-2.3.2.amatches
./Pods/QMUIKit/QMUIKit/QMUIComponents/QMUILabel.m:UIPasteboard*pasteboard=[UIPasteboardgeneralPasteboard];
Binaryfile./Pods/JPush/libjpush-ios-3.3.4.amatches
  • find . -type f | grep -e ".framework" | xargs grep -s UIPasteboard

➜Housekeepergit:(develop)find.-typef|grep-e".framework"|xargsgrep-sUIPasteboard
Binaryfile./Housekeeper/other/extension/iOS/thirdparties/thirdparties_ios_1.0.5/UTDID.framework/Versions/A/UTDIDmatches
Binaryfile./Housekeeper/other/extension/iOS/common/common_ios_2.1.1/normal/UMCommon.framework/Versions/A/UMCommonmatches
  • find . -type f | grep -e ".a" | xargs grep -s AUPasteboard

III 、比如:晋级JPush SDK

pod'JPush','3.3.6'

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

在这里刺进图片描绘

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

在这里刺进图片描绘

IV、 see also

  • ios_sdk_jpush

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

在这里刺进图片描绘

4.1 晋级CocoaPods(适配Xcode12)

  • 晋级选用gem即可,指令如下
sudogeminstallcocoapods

发现版别1.9.1 与Xcode12 不是很匹配,于是就晋级新版别看下。

➜Housekeepergit:(develop)pod--version
1.9.1

假设没晋级,首要问题是,假设选用pod install --verbose --no-repo-update 之后,Xcode的编译设置不会 自动批改other Linker Flags

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

在这里刺进图片描绘

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

在这里刺进图片描绘

晋级到1.9.3 再次晋级SDK的时分,就适配Xcode12,能够自动批改other Linker Flags参数了

iOS小技术:iOS14 读取用户剪切板数据弹出提示的兼容计划

在这里刺进图片描绘

因而晋级Xcode的时分,最好也一起晋级下CocoaPods