1

我的应用程序中有一个加载移动网站的 UIWebView。然后,移动网站有许多不同的链接。

其中一个链接将尝试使用谷歌地图加载地图。

最初,我遇到了用户单击地图链接的问题,因为应用程序会尝试在我的 web 视图中加载地图。这样做是让用户卡住,因为一旦您在 web 视图中加载了地图,就无法返回。

在此处输入图像描述

您返回的唯一方法是强制关闭应用程序,因此并不理想。

然后我发现其他人也有同样的问题,并按照此处描述的方式实施了解决方案。

这很好用,现在单击地图链接后,它会打开地图应用程序。为了回到原来的应用程序,我可以简单地双击主页按钮,然后在正在运行的应用程序列表中选择我的应用程序。

然而,这带来了另一个问题。当我再次选择我的应用程序时,它会短暂显示内容,然后打开以下弹出窗口:

在此处输入图像描述

无论您在那里选择什么,它都会再次加载地图,但这次是在 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

根据您在下面的其他评论,我已编辑此答案以专注于我最初提出的第二个解决方案:

  • 在我拥有的一个应用程序中,我去访问外部网站,在我的故事板中,我创建了一个包含 UIWebView 和 UIButton 的视图,它是一个后退按钮。您可以这样做,只需让 UIWebView 加载您想要的地图并从那里开始。

.xib 看起来像下面这样......特别注意完成按钮在子视图顺序中的最后一个事实,以便如果需要它可以位于 webview 的顶部(是的,可以使 webview 占用 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

你确定要回来NOshouldStartLoadWithRequest: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。如果没有,那么根据您提供的数据,任何人都无法真正给您答案。

就个人而言,我会 NSLog WebView 尝试访问的每个 URL。我最好的猜测是,第二次访问地图站点的尝试会以某种方式触发,而这一次 URL 略有不同。

底线是,NSLog 可以获取更多关于 webview 正在做什么的数据。如果需要,您可以使用它的每一个回调语句。

于 2012-10-02T05:45:54.407 回答