Runtime开发中遇到的问题

替换系统方法

Posted by 祝化林 on January 29, 2019

APP中遇到一个问题

使用SDWebImage 加载图片的时候图片没有显示出来, 后来看了图片的链接,里面有汉字,造成 NSStrngNSURL的时候出问题.

怎么解决呢?

首先我想到了,给NSString使用UFT-8转码 成功解决了问题, 但是整个项目都是使用

[NSURL URLWithString:string]

这个方法来实现的, 修改量巨大, 于是想到了Runtime来替换掉系统的

[NSURL URLWithString:string]

这个方法 首先是+(void)load

+(void)load{
    
    Method urlWitStrMethod = class_getClassMethod(self, @selector(URLWithString:));
    Method urlutf8Method = class_getClassMethod(self, @selector(initWithUTF8String:));
    method_exchangeImplementations(urlWitStrMethod, urlutf8Method);
}

然后是initWithUTF8String 方法的实现

+(NSURL *)initWithUTF8String:(NSString *)URLString{
     // 非空判断
    if (URLString.length < 1) {
        return nil;
    }
    NSString *str = [URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url;
    if ([NSURL hasChinese:URLString]) {
        url = [[NSURL alloc] initWithString:str];
    }else{
        url = [[NSURL alloc] initWithString:URLString];
    }
    
    return url;
    
}

事已至此 以为一切都已经结束了, 然鹅,有些图片的地址,已经被转过一次码了, 我再转码,仍然会有问题! 于是

判断是否有汉字

+ (BOOL)hasChinese:(NSString *)str {
    for(int i=0; i< [str length];i++){
        int a = [str characterAtIndex:i];
        if( a > 0x4e00 && a < 0x9fff)
        {
            return YES;
        }
    }
    return NO;
}

至此,算是基本上解决问题