天天看點

iOS小技能:URL編碼

引言

  1. iOS webView加載的URL中不可以有中文符号的解決方案:把url中含有的中文字元轉化為UTF8編碼
  2. URL特殊字元處理
  3. 判斷是否符合數字和連結的規則來判斷是否命中淘密碼的格式
  4. 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在擷取剪切闆内容。

iOS小技能:URL編碼
讀取​

​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​

​系統提供了三種内容檢測模式:
  1. 數字​

    ​UIPasteboardDetectionPatternNumber​

  2. 連結​

    ​UIPasteboardDetectionPatternProbableWebURL​

  3. 搜尋​

    ​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 檢測剪切闆的資料是否發生變化

iOS小技能:URL編碼

III Url格式校驗

+(BOOL)isUrl:(NSString *)url{
    NSString *regex =@"[a-zA-z]+://[^\\s]*";
    NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
    return      

see also