WebView的基本使用
1 概念性知識
01 webView是有缺點的,會導致內存泄露,而且這個問題是它系統本身的問題。
02 手機上面的safai其實就是用webView來實現的
03 現在的開發并不完全是原生的開發,而更加傾向于原生+Html5的方式
04 webView是OC代碼和html代碼之間進行交互的橋梁
2 代碼相關
/*A*網頁操控相關方法**/
[self.webView goBack]; 回退
[self.webView goForward]; 前進
[self.webView reload]; 刷新
//設置是否能夠前進和回退
self.goBackBtn.enabled = webView.canGoBack;
self.fowardBtn.enabled = webView.canGoForward;
/*B*常用的屬性設置**/
self.webView.scalesPageToFit = YES; 設置網頁自動適應
self.webView.dataDetectorTypes = UIDataDetectorTypeAll; 設置檢測網頁中的格式類型,all表示檢測所有類型包括超鏈接、電話號碼、地址等。
self.webView.scrollView.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
/*C*相關代理方法**/
//每當將加載請求的時候調用該方法,返回YES 表示加載該請求,返回NO 表示不加載該請求
//可以在該方法中攔截請求
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
return ![request.URL.absoluteString containsString:@"dushu"];
}
//開始加載網頁,不僅監聽我們指定的請求,還會監聽內部發送的請求
-(void)webViewDidStartLoad:(UIWebView *)webView
//網頁加載完畢之后會調用該方法
-(void)webViewDidFinishLoad:(UIWebView *)webView
//網頁加載失敗調用該方法
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
/*D*其它知識點-加載本地資源**/
NSURL *url = [[NSBundle mainBundle] URLForResource:@"text.html" withExtension:nil];
[self.webView loadRequest:[NSURLRequest requestWithURL:url]];
8 HTML
1.Html決定網頁的內容,css決定網頁的樣式,js決定網頁的事件
2.html學習網站:http://www.w3school.com.cn
9 OC和JS代碼的互調
01 OC調用JS的代碼
NSString *str = [self.webView stringByEvaluatingJavaScriptFromString:@"sum()"];
02 JS怎么調用OC的說明
新的需求:點擊按鈕的時候撥打電話
但是我在點擊按鈕的時候,用戶是不知道的,我們怎么能夠知道用戶點擊了網頁上面的一個按鈕,只能通過一個技巧,那就是自己搞一個特定的協議頭比如說xmg://,當我攔截到你的網絡請求的時候,只需要判斷一下當前的協議頭是不是這個就能判斷你現在是否是JS調用。
OC里面有通過字符串生成SEL類型的方法,所以當拿到數據之后做下面的事情
1)截取方法的名稱
2)將截取出來的字符串轉換為SEL
3)利用performSelect方法來調用SEL
03 涉及到的相關方法
[@"abc" hasPrefix:@"A"] //判斷字符串是否以一個固定的字符開頭,這里為A
//截串操作
- (NSString *)substringFromIndex:(NSUInteger)from;
//切割字符串,返回一個數組
- (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為唯一的警告標識
[self performSelector:selector withObject:nil];
#pragma clang diagnostic pop
10 NSInvocation的基本使用
//封裝invacation可以調用多個參數的方法
-(void)invacation
{
//1.創建一個MethodSignature,簽名中保存了方法的名稱,參數和返回值
//這個方法屬于誰,那么就用誰來進行創建
//注意:簽名一般是用來設置參數和獲得返回值的,和方法的調用沒有太大的關系
NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(callWithNumber:andContext:withStatus:)];
/*注意不要寫錯了方法名稱
// NSMethodSignature *signature = [ViewController methodSignatureForSelector:@selector(call)];
*/
//2.通過MethodSignature來創建一個NSInvocation
//NSInvocation中保存了方法所屬于的對象|方法名稱|參數|返回值等等
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
/*2.1 設置invocation,來調用方法*/
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.自定義的參數索引從2開始,0和1已經被self and _cmd占用了
//2.方法簽名中保存的方法名稱必須和調用的名稱一致
[invocation setArgument:&number atIndex:2];
[invocation setArgument:&context atIndex:3];
[invocation setArgument:&status atIndex:4];
/*3.調用invok方法來執行*/
[invocation invoke];
}
11 異常處理
01 一般處理方式:
a.app異常閃退,那么捕獲crash信息,并記錄在本地沙盒中。
b.當下次用戶重新打開app的時候,檢查沙盒中是否保存有上次捕獲到的crash信息。
c.如果有那么利用專門的接口發送給服務器,以求在后期版本中修復。
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];//得到當前調用棧信息
NSString *reason = [exception reason];//非常重要,就是崩潰的原因
NSString *name = [exception name];//異常類型
NSString *errorMsg = [NSString stringWithFormat:@"當前調用棧的信息:%@\nCrash的原因:%@\n異常類型:%@\n",arr,reason,name];
//把該信息保存到本地沙盒,下次回傳給服務器。
}