2

iTunesのURLをロードするときにUIWebViewがiTunesアプリを開かないようにするにはどうすればよいですか?

URLの例:http://itunes.apple.com/nl/app/bluppr-postcards/id348147229?mt = 8

上記のURLは、iTunesアプリを直接ロードします。UIWebViewDelegateは、UIWebViewにページをロードするだけでこれを制御できないようです。

JavaScript関数detectAndOpenItunes()によって制御されているようです。ページの本文タグにあります。

何か案は?

4

1 に答える 1

5

関連する関数はdetectAndOpenItunes()です。これはこのファイルに含まれており、ユーザーエージェント文字列に「iPhone」または「iPod」が含まれている必要があります。viewDidLoadで次のことを実行するWebビューを備えた簡単なテストアプリを作成しました。

[webView loadRequest:
      [NSURLRequest requestWithURL:
        [NSURL URLWithString:
          @"http://itunes.apple.com/nl/app/bluppr-postcards/id348147229?mt=8"]]];

あなたが言うように、それはAppStoreアプリを開きます。だから私はそれを次のように変更しました:

// set some user agent that doesn't have 'iPod' or 'iPhone' in the name
[[NSUserDefaults standardUserDefaults] 
             registerDefaults:[NSDictionary 
                        dictionaryWithObject:@"some old phone or other" 
                        forKey:@"UserAgent"]];

[webView loadRequest:
      [NSURLRequest requestWithURL:
        [NSURL URLWithString:
          @"http://itunes.apple.com/nl/app/bluppr-postcards/id348147229?mt=8"]]];

これにより、アプリを開かずにページがWebページとして表示されますが、フォーマットに問題があり、表示されるページが広すぎます。をすばやく検索するvar deviceDetect=と、ユーザーエージェントがフォーマットの決定にも使用されていることがわかります。

そのために私が思いつくことができる唯一の解決策は、本質的にスクリーンスクレイピングレベルの動作を含みます。+ registerClass:NSURLProtocolを使用して、任意のプロトコルハンドラーをサブクラス化して追加できます。HTTPリクエストを実行するようにプロトコルを設計すると、HTTPリクエストを処理するための組み込みメソッドが置き換えられます。どのリクエストを受け入れるか拒否するかを選択することで、実際のプロトコルハンドラーにフォールダウンしたくないHTTPリクエストを許可することで実際の読み込みを行うことができます。したがって、フェッチしたファイルを選択的にキャッチして変更してから、Webビューに渡すことができます。

これを使用して、.jsと.htmlの任意のビットをキャッチして編集できますが、Appleがページを調整するたびに、問題が発生する可能性があります。

同様に、webviewを使用stringByEvaluatingJavaScriptFromString:して適切なJavascriptを実行し、ロード後にページを再フォーマットすることもできますが、実行する内容を正確に判断することはできず、ソリューションも同様に脆弱です。

于 2011-06-06T10:51:21.270 に答える