服務項目

需求溝通

h5開發

  H5因其及時響應的更新速度媲美著需求的速度和較高的趣味性受到越來越多的用戶的青睞。目前,大多數的應用中都嵌入了H5。優點非常明顯。那么在iOS應用中如何嵌入一個H5,并且和它進行交互就成了一個勢必要掌握的技術了。本文我將結合我在項目中的一些需求整理出對應的技術點,僅供參考。

  在iOS開發中,H5的嵌入可以通過UIWebView或者WKWebView。這兩個都是繼承UIView,來加載web數據的類。UIWebView是在iOS2的時候開始使用的。特點是加載速度慢,占用內存多,優化艱難。WKWebView是在iOS8蘋果新推出的,加載速度快,占用內存較少,是一個不錯的選擇。如果想要比較兩者的區別,您可以選擇一個網頁進行測試一下。鑒上所述,我們選擇WKWebView進行開發。好了,廢話不多說了。

  1.WKWebView創建和加載

  - (void)createWebView

  { WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init] // 根據需要去設置對應的屬性

  WKWebView *webView = [[WKWebView alloc]initWithFrame:self.view.bounds configuration:config];

  webView.navigationDelegate = self;

  [self.view addSubview:webView];

  NSURL *url = [NSURL URLWithString:self.strURL];

  [self loadWebViewWithURL:url]; // JS調用OC 添加處理腳本

  [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"Share"];

  }

  2.JS調用OC代碼。

  [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"Share"];

  這是利用WKWebView的一個新特性MessageHandler來處理JS調用原生方法。要實現JS調用iOS原生方法,步驟見下。

  添加協議。讓控制器成為MessageHandler的代理對象。

  對于監聽的方法名要和JS開發的人商量好。這里我們監聽的是Share方法,對于JS開發的人員必須要以以下方式寫。

  window.webkit.messageHandlers. Share.postMessage(null)

  實現協議方法。在這個方法里message參數有一個屬性body。message.body就是JS傳過來的參數,可以是字符串,可以是數組,也可以是字典。通過message.name判斷可以知道監聽的是JS的哪個方法。

  - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

  {

  if ([message.name isEqualToString:@"Share"]) { //TODO

  }

  }

  至此,JS調用OC代碼就已完結。是不是很簡單。另外,我在網上也看到了不一樣的處理方式。大家可以參考WebViewJavascriptBridge我覺得寫的比較清楚。本人還沒有嘗試過這種,如果都嘗試過的寶寶能不能分享一下兩者的優缺點啊。

  3. OC調用JS代碼。

  [self.webView evaluateJavaScript:@"show()" completionHandler:^(id _Nullable response, NSError * _Nullable error) { //TODO

  }];

  相信代碼已經看得很清楚啦。show()就是JS寫的方法,這個方法可傳可不傳參數,具體依實際情況而定。另外關于UIWebView和JS的交互,以下部分僅供參考。

  JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

  context[@"Share"] = ^() { NSArray *args = [JSContext currentArguments]; dispatch_async(dispatch_get_main_queue(), ^{ //TODO

  });

  4. 關于

  網頁加載開始,結束,失敗這幾個都特別簡單,我就不贅述了。說一下下面這個協議方法,這個方法發生在頁面跳轉中。WKNavigationActionPolicy是一個枚舉,WKNavigationActionPolicyAllow表示允許跳轉,WKNavigationActionPolicyCancel表示取消跳轉。對了,這里還有一個補充: scrollView嵌套網頁和原生view,原生view要根據網頁的高度來布局。我看到不少的電商應用都有這種布局,但在算高度上會有各種問題,不知道你們有遇見過?

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

  { NSString *url = navigationAction.request.URL.absoluteString; if(![url isEqualToString:self.strURL]) { // 頁面跳轉

  }

  decisionHandler(WKNavigationActionPolicyAllow);

  }

  5. 關于< WKUIDelegate >

  不知道您有沒有遇見過JS寫的alert()框在iOS上不彈出。那么您有沒有實現這些協議方法呢。

  /// 創建一個新的WebView- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;/// 輸入框- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;/// 確認框- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;/// 警告框- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;

  6. 獲取網頁標題,網頁加載進度和加載狀態

  這是通過KVO的方式進行監聽的。您可以點擊進WKWebView的內部看一下,他們每個屬性上面都有很長的解釋,你不難發現這一段。舉一個獲取標題的例子。其他的類似。別忘了,KVO監聽在dealloc中移除監聽者哦。

  8E6F0A58-609E-4093-BD65-F51A10D1703D.png

  [self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];

  - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

  {

  if ([keyPath isEqualToString:@"title"]) { if (object == self.webView) { if(self.navigationController)

  self.navigationItem.title = self.webView.title;

  }

  } else {

  [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

  }

  }

選擇一家app定制的軟件開發公司,最重要的是程序員的素質和綜合能力,仟源科技專業從事軟件開發,服務行業范圍非常之廣,匯聚了JAVA,NET,前端,APP應用,PHP,軟件測試等多方面的開發工程師,也有平面設計,產品設計與運營,網絡建設與運維等方面的專業人才,有多年的企業級軟件開發的經驗。

  仟源科技有限公司始終堅持以創業服務創業,以創新服務創新”的宗旨,做軟件開發,游戲開發和系統開發核心業務,實現前瞻性投資,為優秀創業者做一站式扶持,并建立“大服務、大扶持、大未來”的目標。仟源科技堅持以客戶需求為中心,打造企業品牌助力企業成長!那么最后說一句,如果您有軟件開發的需求,請馬上關注聯系我們吧。

上一篇:區塊鏈溯源電商 下一篇:h5 app開發
文章標簽:
文章評論:

專業的游戲開發/系統開發、品牌設計/網站建設,選仟源!

選擇專業的企業服務公司,服務更靠譜!

立即點擊咨詢>
客服圖標
客服圖標
118旺角心水论坛