引言
- iOS webView加載的URL中不可以有中文符号的解決方案:把url中含有的中文字元轉化為UTF8編碼
- URL特殊字元處理
- 判斷是否符合數字和連結的規則來判斷是否命中淘密碼的格式
- Url格式校驗
I URL編碼
1.1 UTF8編碼
NSUTF8StringEncoding];
WebViewController *webVC = [[WebViewController alloc] initWithAddress:url];
1.2 URL特殊字元處理
/**
iOS URL 特殊字元處理: url 編碼(又叫做 percentcode 百分号編碼)
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
*/
+ (NSString *)percentUrl:(NSString *)oriUrl {
if (IOS_VERSION < 9) {
if ([oriUrl isKindOfClass:[NSString class]]) {
oriUrl = [oriUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
} else {
if ([oriUrl isKindOfClass:[NSString class]]) {
oriUrl = [oriUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
}
}
return
II 判斷剪貼闆内容是否符合數字和連結的規則
背景:在iOS14中,如果APP讀取剪切版的内容時,手機會彈出提示,提示哪個APP在擷取剪切闆内容。
讀取的
UIPasteboard
、
string
、
strings
、
URL
、
URLs
、
image
、
images
、
color
colors
的時候會觸發系統提示。
使用
、
hasStrings
、
hasURLs
、
hasImages
等方法的時候不會觸發系統提示。
hasColors
2.1 彈出提示的相容方案:盡可能少的去調用會觸發系統提示的方法
iOS14剪切闆适配:
方案一:先判斷剪切闆内容的各式,如果符合規則采取讀取。
例如app讀取密碼,可以判斷是否符合數字和連結的規則
方案二:使用
changeCount
來記錄剪切闆的資料是否發生變化
完整的demo 請 關注公号:iOS逆向
2.2 檢測剪切闆内容是否比對
通過判斷是否符合數字和連結的規則來判斷是否命中分享内容:采用剪切闆内容檢測模式和iOS 14提供的API
detectPatternsForPatterns:completionHandler: detectPatternsForPatterns:inItemSet:completionHandler:
進行實作。
目前系統提供了三種内容檢測模式:
UIPasteboardDetectionPattern
- 數字
UIPasteboardDetectionPatternNumber
- 連結
UIPasteboardDetectionPatternProbableWebURL
- 搜尋
UIPasteboardDetectionPatternProbableWebSearch
// Detection
/// Detects patterns in the first pasteboard item.
///
/// @param patterns Detect only these patterns.
/// @param completionHandler Receives which
密碼的組成部分:數字+文字+連結的形勢
void)pasteBoardCheckWithText:(NSString *)text {
UIPasteboard *board = [UIPasteboard generalPasteboard];
if (text.length > 0) {
[board setString:text];
}
[board detectPatternsForPatterns:[NSSet setWithObjects:UIPasteboardDetectionPatternProbableWebURL, UIPasteboardDetectionPatternNumber, UIPasteboardDetectionPatternProbableWebSearch, nil]
completionHandler:^(NSSet<UIPasteboardDetectionPattern> * _Nullable set, NSError * _Nullable error) {
BOOL hasNumber = NO, hasURL = NO;
for (NSString *type in set) {
if ([type isEqualToString:UIPasteboardDetectionPatternProbableWebURL]) {
hasURL = YES;
} else if ([type isEqualToString:UIPasteboardDetectionPatternNumber]) {
hasNumber = YES;
}
}
if (hasNumber && hasURL) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"tip" message:[NSString stringWithFormat:@"%@\n%@", [board string], @"符合密碼的格式"] preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"sure" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];
});
}
}];
}
2.3 檢測剪切闆的資料是否發生變化
III Url格式校驗
+(BOOL)isUrl:(NSString *)url{
NSString *regex =@"[a-zA-z]+://[^\\s]*";
NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
return