WebView的基本使用

WebView的基本使用

1 概念性知識
    01 webView是有缺點(diǎn)的划提,會導(dǎo)致內(nèi)存泄露队询,而且這個問題是它系統(tǒng)本身的問題拳话。
    02 手機(jī)上面的safai其實(shí)就是用webView來實(shí)現(xiàn)的
    03 現(xiàn)在的開發(fā)并不完全是原生的開發(fā)都许,而更加傾向于原生+Html5的方式
    04 webView是OC代碼和html代碼之間進(jìn)行交互的橋梁

2 代碼相關(guān)
/*A*網(wǎng)頁操控相關(guān)方法**/
    [self.webView goBack];      回退
    [self.webView goForward];   前進(jìn)
    [self.webView reload];      刷新

    //設(shè)置是否能夠前進(jìn)和回退
    self.goBackBtn.enabled = webView.canGoBack;
    self.fowardBtn.enabled = webView.canGoForward;

/*B*常用的屬性設(shè)置**/
    self.webView.scalesPageToFit = YES; 設(shè)置網(wǎng)頁自動適應(yīng)
    self.webView.dataDetectorTypes = UIDataDetectorTypeAll; 設(shè)置檢測網(wǎng)頁中的格式類型,all表示檢測所有類型包括超鏈接翩肌、電話號碼突照、地址等沟绪。
    self.webView.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);

/*C*相關(guān)代理方法**/
    //每當(dāng)將加載請求的時候調(diào)用該方法,返回YES 表示加載該請求褪秀,返回NO 表示不加載該請求
    //可以在該方法中攔截請求
    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        return ![request.URL.absoluteString containsString:@"dushu"];
    }

    //開始加載網(wǎng)頁蓄诽,不僅監(jiān)聽我們指定的請求,還會監(jiān)聽內(nèi)部發(fā)送的請求
    -(void)webViewDidStartLoad:(UIWebView *)webView

    //網(wǎng)頁加載完畢之后會調(diào)用該方法
    -(void)webViewDidFinishLoad:(UIWebView *)webView

    //網(wǎng)頁加載失敗調(diào)用該方法
    -(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

/*D*其它知識點(diǎn)-加載本地資源**/
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"text.html" withExtension:nil];
    [self.webView loadRequest:[NSURLRequest requestWithURL:url]];

8 HTML

1.Html決定網(wǎng)頁的內(nèi)容媒吗,css決定網(wǎng)頁的樣式仑氛,js決定網(wǎng)頁的事件
2.html學(xué)習(xí)網(wǎng)站:http://www.w3school.com.cn

9 OC和JS代碼的互調(diào)

01 OC調(diào)用JS的代碼
    NSString *str = [self.webView stringByEvaluatingJavaScriptFromString:@"sum()"];

02 JS怎么調(diào)用OC的說明
    新的需求:點(diǎn)擊按鈕的時候撥打電話
    但是我在點(diǎn)擊按鈕的時候,用戶是不知道的,我們怎么能夠知道用戶點(diǎn)擊了網(wǎng)頁上面的一個按鈕锯岖,只能通過一個技巧介袜,那就是自己搞一個特定的協(xié)議頭比如說xmg://,當(dāng)我攔截到你的網(wǎng)絡(luò)請求的時候,只需要判斷一下當(dāng)前的協(xié)議頭是不是這個就能判斷你現(xiàn)在是否是JS調(diào)用出吹。
    OC里面有通過字符串生成SEL類型的方法遇伞,所以當(dāng)拿到數(shù)據(jù)之后做下面的事情
    1)截取方法的名稱
    2)將截取出來的字符串轉(zhuǎn)換為SEL
    3)利用performSelect方法來調(diào)用SEL

03 涉及到的相關(guān)方法
    [@"abc" hasPrefix:@"A"] //判斷字符串是否以一個固定的字符開頭,這里為A
    //截串操作
    - (NSString *)substringFromIndex:(NSUInteger)from;
    //切割字符串捶牢,返回一個數(shù)組
    - (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
    //替換操作
    - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
    //把string包裝成SEL

    SEL selector = NSSelectorFromString(sel);

04 如何屏蔽警告
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
            //-Warc-performSelector-leaks為唯一的警告標(biāo)識
            [self performSelector:selector withObject:nil];
    #pragma clang diagnostic pop

10 NSInvocation的基本使用

//封裝invacation可以調(diào)用多個參數(shù)的方法
-(void)invacation
{
    //1.創(chuàng)建一個MethodSignature鸠珠,簽名中保存了方法的名稱,參數(shù)和返回值
    //這個方法屬于誰叫确,那么就用誰來進(jìn)行創(chuàng)建
    //注意:簽名一般是用來設(shè)置參數(shù)和獲得返回值的跳芳,和方法的調(diào)用沒有太大的關(guān)系
    NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(callWithNumber:andContext:withStatus:)];

    /*注意不要寫錯了方法名稱
     //    NSMethodSignature *signature = [ViewController methodSignatureForSelector:@selector(call)];
     */

    //2.通過MethodSignature來創(chuàng)建一個NSInvocation
    //NSInvocation中保存了方法所屬于的對象|方法名稱|參數(shù)|返回值等等
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

    /*2.1 設(shè)置invocation,來調(diào)用方法*/

    invocation.target = self;
    //    invocation.selector = @selector(call);
    //    invocation.selector = @selector(callWithNumber:);
    //    invocation.selector = @selector(callWithNumber:andContext:);
    invocation.selector = @selector(callWithNumber:andContext:withStatus:);

    NSString *number = @"10086";
    NSString *context = @"下課了";
    NSString *status = @"睡覺的時候";

    //注意:
    //1.自定義的參數(shù)索引從2開始竹勉,0和1已經(jīng)被self and _cmd占用了
    //2.方法簽名中保存的方法名稱必須和調(diào)用的名稱一致
    [invocation setArgument:&number atIndex:2];
    [invocation setArgument:&context atIndex:3];
    [invocation setArgument:&status atIndex:4];

    /*3.調(diào)用invok方法來執(zhí)行*/
    [invocation invoke];
}

11 異常處理

01 一般處理方式:
    a.app異常閃退飞盆,那么捕獲crash信息,并記錄在本地沙盒中次乓。
    b.當(dāng)下次用戶重新打開app的時候吓歇,檢查沙盒中是否保存有上次捕獲到的crash信息。
    c.如果有那么利用專門的接口發(fā)送給服務(wù)器票腰,以求在后期版本中修復(fù)城看。

02 如何拋出異常

    //拋出異常的兩種方式
        // @throw  [NSException exceptionWithName:@"好大一個bug" reason:@"異常原因:我也不知道" userInfo:nil];

        //方式二
        NSString *info = [NSString stringWithFormat:@"%@方法找不到",NSStringFromSelector(aSelector)];
        //下面這種方法是自動拋出的
        [NSException raise:@"這是一個異常" format:info,nil];

03 如何捕獲異常
    NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);

    void UncaughtExceptionHandler(NSException *exception) {
    NSArray *arr = [exception callStackSymbols];//得到當(dāng)前調(diào)用棧信息
    NSString *reason = [exception reason];//非常重要,就是崩潰的原因
    NSString *name = [exception name];//異常類型

    NSString *errorMsg = [NSString stringWithFormat:@"當(dāng)前調(diào)用棧的信息:%@\nCrash的原因:%@\n異常類型:%@\n",arr,reason,name];
    //把該信息保存到本地沙盒杏慰,下次回傳給服務(wù)器测柠。
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缘滥,隨后出現(xiàn)的幾起案子轰胁,更是在濱河造成了極大的恐慌,老刑警劉巖朝扼,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赃阀,死亡現(xiàn)場離奇詭異,居然都是意外死亡擎颖,警方通過查閱死者的電腦和手機(jī)羊始,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門布朦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奖慌,“玉大人滥沫,你說我怎么就攤上這事≡逝埽” “怎么了意述?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我荤崇,道長拌屏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任术荤,我火速辦了婚禮倚喂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓣戚。我一直安慰自己端圈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布子库。 她就那樣靜靜地躺著舱权,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仑嗅。 梳的紋絲不亂的頭發(fā)上宴倍,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音仓技,去河邊找鬼鸵贬。 笑死,一個胖子當(dāng)著我的面吹牛脖捻,可吹牛的內(nèi)容都是我干的阔逼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼地沮,長吁一口氣:“原來是場噩夢啊……” “哼嗜浮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摩疑,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤危融,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后未荒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡及志,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年片排,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片速侈。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡率寡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倚搬,到底是詐尸還是另有隱情冶共,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站捅僵,受9級特大地震影響家卖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庙楚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一上荡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馒闷,春花似錦酪捡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疏虫,卻和暖如春永罚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背议薪。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工尤蛮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斯议。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓产捞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哼御。 傳聞我的和親對象是個殘疾皇子坯临,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容