iOS 攔截篇(一):攔截H5通過<input>標簽選取的圖片

一、場景

H5經常會需要選擇手機照片來完善自身內容;比如上傳身份證照片痹雅、資產照片等等等。有時候這些照片經常需要app處理完后才上傳給H5糊识,那么這時候作為app的你就必須先處理好H5選擇的手機照片绩社,再上傳給他。所以本文接下來將講解如何攔截處理H5選擇的手機照片赂苗;

二愉耙、基礎知識準備

普及基礎知識:
H5選擇手機照片的方式主要有兩種:

  • 1、通過與app的JS交互拌滋,選擇手機照片朴沿;
  • 2、通過H5自身的<input>標簽败砂,選擇手機照片悯仙;

第一種JS交互的,圖片數據的獲取太容易處理了吠卷,就不再這里講了锡垄。我們這邊主要講H5通過H5自身的<input>標簽,選擇手機照片祭隔。

三货岭、攔截方法

這里我們先講怎么實現,下一點再介紹思路疾渴。
實現方式很簡單

1千贯、添加已CJFileUploadPanel類

pod 'CJHook/CJFileUploadPanel'
CJFileUploadPanel類源碼

image.png

2、建立DemoFileUploadPanel類搞坝,使用CJFileUploadPanel提供的接口實現你攔截后的圖片處理搔谴。

DemoFileUploadPanel.h

#import <Foundation/Foundation.h>

@interface DemoFileUploadPanel : NSObject

+ (void)startHook;
+ (void)stopHook;

@end

DemoFileUploadPanel.m

#import "DemoFileUploadPanel.h"
#import <CJHook/CJFileUploadPanel.h>
#import "DemoCacheUtil.h"

@implementation DemoFileUploadPanel

+ (void)startHook {
    __weak typeof(self)weakSelf = self;
    [CJFileUploadPanel startHookWithAbsoluteFilePathHandle:^NSString *(UIImage *originImage) {
        NSData *newImageData = [weakSelf dealImage:originImage];![分割圖1.jpg](https://upload-images.jianshu.io/upload_images/6214155-49f701e7162b8ec8.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

        
        // 保存圖片到本地
        NSString *absoluteFilePath = [DemoCacheUtil saveImageData:newImageData forModuleType:DemoModuleTypeIot];
        
        sleep(5); //用來測試是否主線程是否會被阻塞(請在選擇圖片后,選擇返回桩撮,看是否卡住)
        
        return absoluteFilePath;
    }];
}

+ (void)stopHook {
    [CJFileUploadPanel stopHook];
}


+ (NSData *)dealImage:(UIImage *)image {
    UIImage *newImage = [UIImage imageNamed:@"飲品2.jpg"];
    NSData *newImageData = UIImagePNGRepresentation(newImage);
    return newImageData;
}


@end

3敦第、調用

略。

如果你還想了解思路或者原理店量,請往下看芜果,如果只是想使用的話,到這里就可以了融师。


分割圖1.jpg

四右钾、攔截的思路分析

攔截的思路:1、攔截、替換系統(tǒng)方法舀射;2窘茁、在新方法中按產品需求處理圖片;
詳細步驟如下脆烟。

1山林、攔截、替換系統(tǒng)方法

即:將在WKFileUploadPanel中實現的UIImagePickerController代理方法imagePickerController:didFinishPickingMediaWithInfo:替換為你在其他類中寫的其他方法浩淘。因為系統(tǒng)沒提供WKFileUploadPanel這個類給你來讓你在該類中直接寫交換的方法。
所以我們這里是將其替換為你在CJHookFileUploadPanel類中實現的- (void)swizzled_imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info方法吴攒。
通過此步张抄,你就能夠在新寫的方法- (void)swizzled_imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info里面獲取到圖片選擇器選取到的圖片數據了。

@implementation CJHookFileUploadPanel

+ (void)hookFileUploadPanel:(BOOL)hook {
    SEL originalSelector = @selector(imagePickerController:didFinishPickingMediaWithInfo:);
    SEL swizzledSelector = @selector(swizzled_imagePickerController:didFinishPickingMediaWithInfo:);
    Class originalClass = NSClassFromString(@"WKFileUploadPanel");
    Class otherClass = [CJHookFileUploadPanel class];
    if (hook) {
        bool success = HookCJHelper_exchangeOriMethodToNewMethodWhichAddFromDiffClass(originalClass, originalSelector, otherClass, swizzledSelector);
        NSLog(@"exchangeOriMethodToNewMethod:%@", success ? @"success": @"failure");
    } else {
        bool success = HookCJHelper_recoverOriMethodToNewMethodWhichAddFromDiffClass(originalClass, originalSelector, otherClass, swizzledSelector);
        NSLog(@"recoverOriMethodToNewMethod:%@", success ? @"success": @"failure");
    }
}

- (void)swizzled_imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
    NSMutableDictionary *new_info = [[NSMutableDictionary alloc] initWithDictionary:info];
   // 在這里按產品需求處理圖片得到新new_info......
    
    [self swizzled_imagePickerController:picker didFinishPickingMediaWithInfo:new_info];
}

@end

上述為某類添加另一個類中的方法的實現代碼詳見HookCJHelper
HookCJHelper源碼

image.png

結束語

感謝閱讀洼怔!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末署惯,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子镣隶,更是在濱河造成了極大的恐慌极谊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件安岂,死亡現場離奇詭異轻猖,居然都是意外死亡,警方通過查閱死者的電腦和手機域那,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門咙边,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人次员,你說我怎么就攤上這事败许。” “怎么了淑蔚?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵市殷,是天一觀的道長。 經常有香客問我刹衫,道長醋寝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任带迟,我火速辦了婚禮甥桂,結果婚禮上,老公的妹妹穿的比我還像新娘邮旷。我一直安慰自己黄选,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著办陷,像睡著了一般貌夕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上民镜,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天啡专,我揣著相機與錄音,去河邊找鬼制圈。 笑死们童,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鲸鹦。 我是一名探鬼主播慧库,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼馋嗜!你這毒婦竟也來了齐板?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤葛菇,失蹤者是張志新(化名)和其女友劉穎甘磨,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體眯停,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡济舆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了莺债。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吗冤。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖九府,靈堂內的尸體忽然破棺而出椎瘟,到底是詐尸還是另有隱情,我是刑警寧澤侄旬,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布肺蔚,位于F島的核電站,受9級特大地震影響儡羔,放射性物質發(fā)生泄漏宣羊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一汰蜘、第九天 我趴在偏房一處隱蔽的房頂上張望仇冯。 院中可真熱鬧,春花似錦族操、人聲如沸苛坚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泼舱。三九已至等缀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娇昙,已是汗流浹背尺迂。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冒掌,地道東北人噪裕。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像股毫,于是被迫代替她去往敵國和親膳音。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容