2016-03-28 7 views
0

私はIOSアプリケーションにHTMLまたはjsonとして返信する可能性のあるアクションイベントをWebに要求するWebビューを1つのWebページに持っています。だから、どのようにアプリケーションが送信される応答の種類を知るようになります。応答がアプリ内で処理されるようにします。IOSのWebviewで応答タイプ(Json/Html)をチェックする方法

デリゲートを使ってwebviewで静的なHTMLコンテンツを読むのは、私が試したことです。それが動的な場合、どのように処理できますか。

コードのロジック: - コントローラの負荷ON

  1. 、URLと要求ページWeb表示中(何か)、JSON場合、ユーザは
  2. 確認応答タイプを相互作用する、その後4他の3
  3. 負荷ウェブ別のURLとページ
  4. ネイティブDBにJSONデータおよび店舗をデシリアライズ

答えて

2

方法1

まず、あなたは以下の

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    NSError *error; 
    NSString *responseString = [NSString stringWithContentsOfURL:request.URL 
                 encoding:NSASCIIStringEncoding 
                  error:&error]; 

    //Parse the string here to confirm if it's JSON or HTML 
    //In case of JSON, stop the loading of UIWebview 
    if(json) { 
     retrun NO; 
    } 

    return YES; 
} 

を使用し、webView: shouldStartLoadWithRequest: navigationType:方法では、その後、あなたのUIViewController

UIWebViewデリゲートメソッドを設定して処理する必要がある。注:これはパフォーマンスヒットがかかりますHTMLコンテンツの場合、レスポンスは2回読み込まれます。一度stringWithContentsOfURLメソッドに入り、2回目にWebビューが読み込まれます。

方法2

かかわらず、コンテンツタイプの、あなたがウェブビューロードさせることができ、二重の負荷を避けるために。そして、webViewDidFinishLoadメソッドでロードされたコンテンツを取得します。

このため、サーバー側でもいくつかの変更を行う必要があります。

JSONを使用してHTMLページは次のように構成されているとします。私は、私は迅速にソリューションをIOSに新しい把握していて、長いブレーンストーミングした後webViewDidFinishLoad

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString *res = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('json').innerHTML"]; 

    //Use the JSON string as required 
} 
+0

あなたが与えた解決策はかなり良いです。有難うございます。 私はパフォーマンスを向上させるために2番目の方法を選択することを考えています。 Webページが初めて読み込まれたときに

が空の場合、ユーザーが操作(クリック)してからdivが更新されるとすぐに、質問が1つあります。今質問はどのように私は(アプリ)ユーザーがクリックした/すべてのイベントが発生した/データがdivタグでいっぱいであることを知って来るだろうか? 私の質問はあなたにはっきりと欲しいと思います。そうでない場合は、親切に私に知らせてください。 –

+0

私が理解しているように、 'div'タグは' UIWebView'のコンテンツが更新されると更新されます。この場合、 'webViewDidFinishLoad'メソッドへのコールバックを受け取ります。単に 'res'文字列の長さを調べて、上記のタグ* id *からデータを受け取ったかどうかを判断することができます。 – UditS

+0

私はあなたの解決策を受け入れました。ありがとうございました。 共有することが1つあります。私の古い同僚の1人がもう1つの方法を与えました(3)。つまり、Webサーバーは、メソッド名とパラメータでURLを設定することで、アプリケーション内のメソッドを呼び出すことができます。パフォーマンスにうまく合っていれば、私はそれを続けるだろう。 :-) –

1

で次に

<html> 
<body> 

<div id="json" style="display: none">{"jsonvalue":"{{result}}"}</div> 

</body> 
</html> 

迅速な言葉で解決策を見つけることができなかったためです。 UIWebView:ここsolutions-

  1. まず、ドラッグ&WebViewの

    @IBOutlet弱いのvar webViewlLoadの接続を作成するのWebViewを落とすためのいくつかのステップがあります!

  2. は今

    webViewlLoadを呼び出すことによって、あなたのWebViewをロードします。loadRequest(URL)

  3. 今私は5秒間待ついくつかの時間を待って、次のコード

    上記のコードで
let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 5 * Int64(NSEC_PER_SEC)) 

    dispatch_after(time, dispatch_get_main_queue()) { 

//put your code which should be executed with a delay here 

    let doc = self.webViewlLoad.stringByEvaluatingJavaScriptFromString("document.documentElement.outerHTML")! 

    print("document JSON = \(doc)") 

    let startIndexJSON = doc.rangeOfString("{")?.startIndex 

    let endIndexJSON = doc.rangeOfString("}}")?.startIndex 

    var finalJson = doc.substringWithRange(Range<String.Index>(start:startIndexJSON!, end: endIndexJSON!.advancedBy(2)))  
    print("\n\n finalJson JSON = \(finalJson)") 

    } 

してデータを取得するためのWebViewをチェックし、 webViewはjsonをロードします。私は結果を部分文字列で読む。

関連する問題