iOS小技能:URL编码

3,726 阅读2分钟

“我正在参加「掘金·启航计划」”

引言

  1. iOS webView加载的URL中不可以有中文符号的解决方案:把url中含有的中文字符转化为UTF8编码
  2. URL特殊字符处理
  3. 判断是否符合数字和链接的规则来判断是否命中淘口令的格式
  4. Url格式校验

I URL编码

1.1 UTF8编码


 url = [url stringByAddingPercentEscapesUsingEncoding: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 oriUrl;
}


II 判断剪贴板内容是否符合数字和链接的规则

背景:在iOS14中,如果APP读取剪切版的内容时,手机会弹出提示,提示哪个APP在获取剪切板内容。

读取UIPasteboardstringstringsURLURLsimageimagescolorcolors的时候会触发系统提示。 使用hasStringshasURLshasImageshasColors等方法的时候不会触发系统提示。

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 patterns were detected, or an error.
- (void)detectPatternsForPatterns:(NSSet<UIPasteboardDetectionPattern> *)patterns
                completionHandler:(void(^)(NSSet<UIPasteboardDetectionPattern> * _Nullable,
                                           NSError * _Nullable))completionHandler NS_REFINED_FOR_SWIFT API_AVAILABLE(ios(14.0));

口令的组成部分:数字+文字+链接的形势


- (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 检测剪切板的数据是否发生变化

记录一下真正读取剪切板时的changeCount,如果下次读取的时候没有发生变化则不读取。 这样一来效果就好多了,应用运行生命周期内,基本上只会弹出一次提示

III Url格式校验

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

blog.csdn.net/z929118967/…

see also

公号:iOS逆向