1

モバイル Web サイトを読み込むアプリケーションに UIWebView があります。モバイル Web サイトには、さまざまなリンクが多数あります。

これらのリンクの 1 つは、Google マップを使用して地図を読み込もうとします。

最初は、アプリケーションが Web ビュー内にマップを読み込もうとするため、ユーザーがマップ リンクをクリックするという問題がありました。これが何をするかは、webview 内にマップをロードすると、元に戻る方法がないため、ユーザーが立ち往生することです。

ここに画像の説明を入力

戻るための唯一の方法は、アプリケーションを強制的に閉じることであるため、理想的ではありません。

次に、同じ問題を抱えている他の人を見つけ、ここで説明されているように解決策を実装しました。

これはうまく機能し、マップ リンクをクリックすると、マップ アプリケーションが開きます。元のアプリケーションに戻るには、ホーム ボタンをダブルタップして、実行中のアプリケーションのリストから自分のアプリケーションを選択します。

しかし、これは別の問題をもたらしました。アプリケーションを再度選択すると、コンテンツが短時間表示され、次のポップアップが開きます。

ここに画像の説明を入力

そこで選択したものに関係なく、マップが再度読み込まれますが、今回は webview 内で行われるため、前述のように行われたすべての作業が無効になります。

この種の動作を見た人はいますか?もしそうなら、それを回避する方法を知っているので、現在の場所を尋ねるポップアップさえ開かないようにしますか?

更新 コードを追加する;それを処理するために使用しています

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

    // URL Starts with "http://maps?"
    if([[request.URL description] hasPrefix:@"http://maps"]){
        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    }
    // otherwise let the webview deal with the request
    return YES;
}

前もって感謝します、

4

3 に答える 3

2

以下の追加コメントに基づいて、この回答を編集して、最初に提案した2番目のソリューションに焦点を当てました。

  • 私が持っている 1 つのアプリで、外部の Web サイトにアクセスし、ストーリーボードで、UIWebView と戻るボタンである UIButton を含むビューを作成しました。これを実行して、UIWebView にマップをロードさせ、そこから移動することができます。

.xib は次のようになります。完了ボタンがサブビュー順序の最後にあるという事実に特に注意して、必要に応じて Web ビューの上に配置できるようにします (はい、Web ビューは 100 を占めるようにすることができます)。スーパービューの不動産の % であり、ボタンはその上に配置できます。使用したこのサンプル アプリではそうではありません) (背景画像は無視します。このスクリーンショットを撮るために使用したサンプル アプリでは、背後で使用されています)。部分的に透明な Web ビュー (これが必要な場合は、.xib ビューのサブビュー順序で最初に表示され、他のすべてのサブビューの「後ろ」になるようにしてください)。

ここに画像の説明を入力

これに必要なコードは、この .xib に関連付けられたビュー コントローラーにあり、次のようになります。

@interface WebGoogleMapInUIWebViewViewController () <UIWebViewDelegate>

@property (nonatomic) int backCount;

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3
@property (readonly, weak, nonatomic) IBOutlet UIWebView *webView;
#else
@property (readonly, unsafe_unretained, nonatomic) IBOutlet UIWebView *webView;
#endif
@end

@implementation WebGoogleMapInUIWebViewViewController

@synthesize webView;

// … UIViewController life-cycle code and all other code goes here …    

#pragma mark - Actions

- (IBAction)done:(id)sender
{
    if (self.webView.canGoBack) // relying on false for a nil webView
        [self.webView goBack];
}

@end

このソリューションにより、アプリ内にとどまることができます。その後、場所を尋ねるダイアログが表示された場合、結果はすぐに表示され、アプリ内でのみ適用されます。

私はこれがあなたが述べた方法で問題を解決しないことを知っていますが、あなたが望む動作を与えるかもしれません.

于 2012-09-28T04:06:50.300 に答える
1

あなたは間違いなく に戻っNOてきshouldStartLoadWithRequest:navigationType:ますか? マップ アプリケーションが開いたとき マップ アプリケーションが開いていて、メソッドが返されているように思えますYES

if ([[request.URL description] hasPrefix:@"http://maps"]) {
    // open URL in Safari and return NO to prevent UIWebView from load it
    [[UIApplication sharedApplication] openURL:[request URL]];
    return NO;
}
于 2012-09-26T11:29:20.920 に答える
0

私はSurfDevに同意する傾向があります.メソッドがYESを返しているようです. そうでない場合、あなたが提供したデータに基づいて誰もがあなたに与えることができる答えは実際にはありません.

個人的には、WebView がアクセスしようとする各 URL を NSLog します。おそらく、マップ サイトにアクセスしようとする 2 回目の試行が原因で、今回は URL がわずかに異なっていると思われます

要点は、NSLog を使用して、webview が何をしているかについてより多くのデータを取得することです。必要に応じて、すべてのコールバック ステートメントを使用できます。

于 2012-10-02T05:45:54.407 に答える