iOS WKWebView請求過程中攔截URL修改之后繼續(xù)請求并且實現(xiàn)多級頁面返回

需求須知:公司要將微信公眾號里面的H5寫成自家app ,當然首選使用wkwebview浓冒。我們的HTML是之前老員工寫的離職后是一個小哥接手,這次寫這個我們兩個要密切配合才行捅位。(對于大神來說不用看了,直接給我寫正確的方法吧,不然巫了你的眼)昌粤。

問題:保持登錄

方案一:使用oc回調js吧access_token傳過去,后臺那邊自己保存判斷使用啄刹,(當然這個首先后臺那邊知道如何寫)我傳過去了他不知道雜用很郁悶涮坐,簡單說一下方法:

oc代碼:

// NSString *jsStr =[NSString stringWithFormat:@"tokenResult('%@')",@"access_token"];

//? ? [webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {

//? ? ? ? NSLog(@"==%@----%@",result,error);

//? ? }];

h5代碼:

function tokenResult(str){

? ? ? ? if(str == 'null'){

? ? ? ? ? ? alert(str);//這個str就是access_token

? ? ? ? } else {

? ? ? ? ? ? alert(str);

? ? ? ? ? ? window.webkit.messageHandlers.timeout.postMessage({body: ''});//這個是調取我這邊的方法js調用oc

? ? ? ? }

? ? }

方案2:OC端每個請求后面拼接上access_token,

聲明一些屬性后面要用到

返回按鈕的點擊事件里面的代碼


截取URL拼接方法:

代碼

url截取的代碼

#pragma mark = WKNavigationDelegate

// 在發(fā)送請求之前誓军,決定是否跳轉

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{


? ? NSLog(@"%@",navigationAction.request.URL.absoluteString);

? ? //允許跳轉

? ? //decisionHandler(WKNavigationActionPolicyAllow);

? ? //不允許跳轉

? ? //decisionHandler(WKNavigationActionPolicyCancel);

? ? NSString *hostname = navigationAction.request.URL.host.lowercaseString;

? ? NSLog(@"是否跨平臺%@",hostname);

//? ? if (navigationAction.navigationType == WKNavigationTypeLinkActivated

//? ? ? ? && ![hostname containsString:@"m.shaimobao.com"]) {

//? ? ? ? // 對于跨域袱讹,需要手動跳轉

//? ? ? ? [[UIApplication sharedApplication] openURL:navigationAction.request.URL];

//

//? ? ? ? // 不允許web內跳轉

//? ? ? ? decisionHandler(WKNavigationActionPolicyCancel);

//? ? } else {

//? ? ? ? //self.progresslayer.alpha = 1.0;

//? ? ? ? decisionHandler(WKNavigationActionPolicyAllow);//允許跳轉

//? ? }


#pragma mark - 截取連接并保存返回連接方法開始

? ? if (self.isbackbool) {//用戶點擊了返回按鈕返回YES

? ? ? ? decisionHandler(WKNavigationActionPolicyAllow);

? ? ? ? self.isbackbool = NO;

? ? }else{//用戶沒有點擊返回返回NO

? ? ? ? NSURL *URL = navigationAction.request.URL;

? ? ? ? MBLog(@"%@", URL);

? ? ? ? NSString * strurl = [NSString string];

? ? ? ? if (![[NSString stringWithFormat:@"%@",URL] isEqualToString:[NSString stringWithFormat:@"http://"]]) { // 不是主頁 加載

? ? ? ? ? ? if (![[NSString stringWithFormat:@"%@",URL] isEqualToString:[NSString stringWithFormat:@"%@",self.currentUrl]]) {

? ? ? ? ? ? ? ? NSString *string = [NSString string];

? ? ? ? ? ? ? ? if ([[NSString stringWithFormat:@"%@",URL] containsString:@"access_token"]) {

? ? ? ? ? ? ? ? ? ? NSLog(@"women 包含 bitch");

? ? ? ? ? ? ? ? ? ? string = [NSString stringWithFormat:@"%@",URL];

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? NSLog(@"women 不存在 bitch");

? ? ? ? ? ? ? ? ? ? string =[NSString stringWithFormat:@"%@&access_token=%@",URL,[self.userdic objectForKey:@"access_token"]];

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:string]];

? ? ? ? ? ? ? ? navigationAction = navigationAction;

? ? ? ? ? ? ? ? [webView loadRequest:request];

? ? ? ? ? ? ? ? self.currentUrl = URL;

? ? ? ? ? ? ? ? strurl = [NSString stringWithFormat:@"%@",URL];

? ? ? ? ? ? ? ? [self urlarrayisboolURL:strurl];


? ? ? ? ? ? ? ? decisionHandler(WKNavigationActionPolicyCancel); // 必須實現(xiàn) 取消加載 不然會加載2遍

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? self.currentUrl = URL;


? ? ? ? ? ? ? ? decisionHandler(WKNavigationActionPolicyAllow); // 必須實現(xiàn) 加載

? ? ? ? ? ? ? ? strurl = [NSString stringWithFormat:@"%@",URL];

? ? ? ? ? ? ? ? [self urlarrayisboolURL:strurl];

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? self.currentUrl = URL;

? ? ? ? ? ? decisionHandler(WKNavigationActionPolicyAllow); // 必須實現(xiàn) 加載

? ? ? ? ? ? return;

? ? ? ? }

? ? }

#pragma mark - 截取連接并保存返回連接方法結束

}

-(void)urlarrayisboolURL:(NSString *)strurl{

? ? //保存請求的連接按順序保存

? ? //首先判斷數(shù)組中是否有該鏈接(只保存一次)

? ? BOOL isbool = [_urlArray containsObject: strurl];

? ? if (isbool) {//存在


? ? }else{//不存在

? ? ? ? //存進去

? ? ? ? if ([[NSString stringWithFormat:@"%@",strurl] containsString:@"access_token"]) {

? ? ? ? ? ? [self.urlArray addObject:strurl];

? ? ? ? } else {

? ? ? ? ? ? //NSLog(@"沒有拼接的參數(shù)");

? ? ? ? }

? ? }

}

返回按鈕代碼

-(void)goback{

//? ? if ([webView canGoBack]) {

//? ? ? ? [webView goBack];

//? ? ? ? NSLog(@"back");

//? ? }

? ? if (self.urlArray.count < 1||self.urlArray.count == 1) {

? ? ? ? self.isbackbool = NO;


? ? }else{

? ? ? ? self.isbackbool = YES;//表示用戶點擊了返回按鈕此時不應該在添加鏈接

? ? ? ? NSURL * url = [NSURL URLWithString:self.urlArray[self.urlArray.count - 2]];

? ? ? ? [webView loadRequest:[NSURLRequest requestWithURL:url]];

? ? ? ? [self.urlArray removeLastObject];


? ? }


? ? //? ? /*A*網(wǎng)頁操控相關方法**/

? ? //? ? [self.webView goBack];? ? // 回退

? ? //? ? [self.webView goForward];? //前進

? ? //? ? [self.webView reload];? ? ? //刷新

? ? //設置是否能夠前進和回退

? ? //? ? self.goBackBtn.enabled = webView.canGoBack;

? ? //? ? self.fowardBtn.enabled = webView.canGoForward;

}

實現(xiàn)思路說明:

1.在 【在發(fā)送請求之前,決定是否跳轉decidePolicyForNavigationAction 】的方法中獲取到用戶點擊的當前連接

2.判斷當前連接是否已經(jīng)拼接access_token昵时,拼接之后保存當前self.currentUrl連接捷雕,然后再次發(fā)[webView loadRequest:request];重新加載,(為了防止循環(huán)壹甥,我們要判斷救巷,當前連接和將要加載的連接是否一樣,要是一樣就不用再次加載句柠,不一樣就再次loadRequest)浦译。

3.重新加載的時候將當前正在加載的URL保存到self.urlArray數(shù)組中,為防止重復添加需要做一下判斷溯职,保證數(shù)組中的元素是唯一的(urlarrayisboolURL:(NSString *)strurl)精盅。此時正面加載已經(jīng)沒有問題了。

4.返回上一個界面的的思路谜酒,定義一個bool值叹俏,yes為用戶點擊了返回按鈕(返回的時候沒有必要再截取URL)所以在【在發(fā)送請求之前,決定是否跳轉decidePolicyForNavigationAction?】方法中判斷一下甚带。要是self.isbackbool為yes就直接WKNavigationActionPolicyAllow實現(xiàn)她肯,不然就截取保存佳头。

5.返回按鈕中實現(xiàn)思路:首先去掉返回首頁的情況或是首頁的情況(及判斷數(shù)組中連接的個數(shù))。再次就是返回獲取數(shù)組中倒數(shù)第二個元素(self.urlArray[self.urlArray.count - 2])就是上一個界面的連接晴氨,最后重新加載完成康嘉。

到這里就完成方法很笨,但是功能實現(xiàn)了 ?目前只能先這樣交差 籽前,等后期有更好的專業(yè)的方法在替換亭珍。歡迎大神指導萬分感謝。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末枝哄,一起剝皮案震驚了整個濱河市肄梨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挠锥,老刑警劉巖众羡,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓖租,居然都是意外死亡粱侣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門蓖宦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐婴,“玉大人,你說我怎么就攤上這事稠茂∧迹” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵睬关,是天一觀的道長诱担。 經(jīng)常有香客問我,道長电爹,這世上最難降的妖魔是什么该肴? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮藐不,結果婚禮上,老公的妹妹穿的比我還像新娘秦效。我一直安慰自己雏蛮,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布阱州。 她就那樣靜靜地躺著挑秉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苔货。 梳的紋絲不亂的頭發(fā)上犀概,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天立哑,我揣著相機與錄音,去河邊找鬼姻灶。 笑死铛绰,一個胖子當著我的面吹牛,可吹牛的內容都是我干的产喉。 我是一名探鬼主播捂掰,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼曾沈!你這毒婦竟也來了这嚣?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤塞俱,失蹤者是張志新(化名)和其女友劉穎姐帚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體障涯,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡罐旗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了像樊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尤莺。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖生棍,靈堂內的尸體忽然破棺而出颤霎,到底是詐尸還是另有隱情,我是刑警寧澤涂滴,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布友酱,位于F島的核電站,受9級特大地震影響柔纵,放射性物質發(fā)生泄漏缔杉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一搁料、第九天 我趴在偏房一處隱蔽的房頂上張望或详。 院中可真熱鬧,春花似錦郭计、人聲如沸霸琴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梧乘。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間选调,已是汗流浹背夹供。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仁堪,地道東北人哮洽。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像枝笨,于是被迫代替她去往敵國和親袁铐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容