iOS開発_HOOK

6638 ワード

NSURLRequestを使用すると、リクエストアドレスURLが入力されますが、URLに中国語があれば、NSURLRequestのリクエストアドレスが空になることがわかります
- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL * url =[NSURL URLWithString:@"http://www.baidu.com/  "];
    NSURLRequest * request =[NSURLRequest requestWithURL:url];
    NSLog(@"%@",request);
}
//2018-04-23 10:08:23.719236+0800 003-HOOK[947:5550247]  { URL: (null) }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  • 改善する方法はありますか?やってみる
    NSURLから継承されたクラスを作成し、HOOKと名付けて新しいメソッドを作成します.
    #import 
    
    @interface NSURL (HOOK)
    
    +(instancetype)HK_URLWithString:(NSString *)URLString;
    
    @end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • #import "NSURL+HOOK.h"
    
    @implementation NSURL (HOOK)
    
    +(instancetype)HK_URLWithString:(NSString *)URLString{
        NSURL * url = [NSURL URLWithString:URLString];
        if(url ==nil){
            NSLog(@"  ");
        }
        return url;
    }
    @end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

  • このとき、ViewController.hでNSURL+HOOK.hファイルをインポートする必要があります.また、呼び出しのメソッド名HK_を変更する必要があります.URLWithString
    #import "ViewController.h"
    #import "NSURL+HOOK.h"
    @interface ViewController ()
    @end
    @implementation ViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        NSURL * url =[NSURL HK_URLWithString:@"http://www.baidu.com/  "];
        NSURLRequest * request =[NSURLRequest requestWithURL:url];
        NSLog(@"%@",request);
    }
    
    //2018-04-23 10:30:38.145984+0800 003-HOOK[1168:5566807]   
    //2018-04-23 10:30:38.146393+0800 003-HOOK[1168:5566807]  { URL: (null) }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

  • もっと簡潔な方法はありませんか?Runtime実行時にメソッド呼び出しの順序を変更し、NSURL+HOOK.mでファイルを変更できます.
    //
    //  NSURL+HOOK.m
    //  003-HOOK
    //
    //  Created by mac on 2018/4/23.
    //  Copyright © 2018  mac. All rights reserved.
    //    HOOK?
    /**
       Runtime            
     */
    
    #import "NSURL+HOOK.h"
    #import 
    
    @implementation NSURL (HOOK)
    
    +(void)load{
        //    Method
        Method URLWithStr = class_getClassMethod(self, @selector(URLWithString:));
        Method HKWithStr = class_getClassMethod(self, @selector(HK_URLWithString:));
        //     IMP
        method_exchangeImplementations(URLWithStr, HKWithStr);
    }
    //  URLWithString
    //+(instancetype)URLWithString:(NSString *)URLString{
    //    NSURL * 
    //}
    +(instancetype)HK_URLWithString:(NSString *)URLString{
        NSURL * url = [NSURL URLWithString:URLString];
        if(url ==nil){
            NSLog(@"  ");
        }
        return url;
    }
    @end
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

  • この場合、ViewController.hファイルでは最初のコードを使用しますが、1つのコードを変更する必要はありません.
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        NSURL * url =[NSURL URLWithString:@"http://www.baidu.com/  "];
        NSURLRequest * request =[NSURLRequest requestWithURL:url];
        NSLog(@"%@",request);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

  • 私たちは私たちの目的を達成することができます.この方法は詐欺と呼ばれています.利用しているのがruntimeのHOOKです.
    しかし、プログラムは私たちが想像していたように順調に動作していないのではなく、カードが死んでいることに気づきました.  iOS开发_HOOK_第1张图片
    これは,メッセージ送信時の真の方法を修正したためである.
    iOS开发_HOOK_第2张图片
    実際に実行されているのはHK_URLWithStringでは、NSURL+HOOK.mファイルでURLWithStringメソッドを呼び出しましたが、実際に実行されているのはそれ自体なので、ループを繰り返すことなく、プログラムメモリが急増し、カードがクラッシュします.どうやって解決しますか?簡単です.NSURL+HOOK.mファイルのURLWithStringをHK_に置き換えます.URLWithString
    iOS开发_HOOK_第3张图片
    #import "NSURL+HOOK.h"
    #import 
    @implementation NSURL (HOOK)
    +(void)load{
        //    Method
        Method URLWithStr = class_getClassMethod(self, @selector(URLWithString:));
        Method HKWithStr = class_getClassMethod(self, @selector(HK_URLWithString:));
        //     IMP
        method_exchangeImplementations(URLWithStr, HKWithStr);
    }
    //  URLWithString?
    //+(instancetype)URLWithString:(NSString *)URLString{
    //    NSURL * 
    //}
    +(instancetype)HK_URLWithString:(NSString *)URLString{
        NSURL * url = [NSURL HK_URLWithString:URLString];
        if(url ==nil){
            NSLog(@"  ");
        }
        return url;
    }
    @end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

  • 実行すると、私たちが想定した目的を達成できることがわかりました.元のプロジェクトのコードを修正する必要はなく、NSURL+HOOK.hとNSURL+HOOK.mをプロジェクトにドラッグするだけで実現できます.
    2018-04-23 11:22:36.367259+0800 003-HOOK[1748:5624887]   
    2018-04-23 11:22:36.367636+0800 003-HOOK[1748:5624887]  { URL: (null) }
  • 1
  • 2

  • gitHubの例:https://github.com/Goddreamwt/iOS_HOOK.git