Iphone 带有地图的UIWebView行为
我的应用程序中有一个加载移动网站的UIWebView。移动网站有很多不同的链接 其中一个链接将尝试使用谷歌地图加载地图 最初,我遇到了一个问题,用户单击了“地图”链接,因为应用程序将尝试在我的webview中加载地图。这会让用户陷入困境,因为一旦你在webview中加载了地图,就没有回头路了 您返回的唯一方法是强制关闭应用程序,因此这并不理想 然后,我发现其他人也有同样的问题,并按照描述实施了解决方案 这非常有效,现在单击地图链接,它将打开地图应用程序。为了回到原来的应用程序,我只需双击home按钮,然后在运行的应用程序列表中选择我的应用程序 然而,这带来了另一个问题。当我再次选择我的应用程序时,它会短暂显示返回的内容,然后打开以下弹出窗口: 无论您在那里选择了什么,它都会再次加载地图,但这次是在webview内部,这否定了前面所述的所有工作 这里有人见过这种行为吗?如果有,你知道如何绕过它,这样它甚至不会打开弹出窗口询问你的当前位置吗 更新 添加代码I;我习惯于处理它Iphone 带有地图的UIWebView行为,iphone,objective-c,google-maps,uiwebview,Iphone,Objective C,Google Maps,Uiwebview,我的应用程序中有一个加载移动网站的UIWebView。移动网站有很多不同的链接 其中一个链接将尝试使用谷歌地图加载地图 最初,我遇到了一个问题,用户单击了“地图”链接,因为应用程序将尝试在我的webview中加载地图。这会让用户陷入困境,因为一旦你在webview中加载了地图,就没有回头路了 您返回的唯一方法是强制关闭应用程序,因此这并不理想 然后,我发现其他人也有同样的问题,并按照描述实施了解决方案 这非常有效,现在单击地图链接,它将打开地图应用程序。为了回到原来的应用程序,我只需双击hom
- (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;
}
提前感谢,您是否在
shouldStartLoadWithRequest:navigationType:
中确定返回否?地图应用程序何时打开?在我看来,maps应用程序正在打开,而该方法正在返回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;
}
根据您在下面的补充意见,我编辑了此答案,以关注我最初提出的第二个解决方案:
- 在我的一个应用程序中,我访问了外部网站,在我的故事板中,我创建了一个视图,其中包含一个UIWebView和一个UIButton(返回按钮)。您可以这样做,只需让UIWebView加载您想要的地图,然后从那里开始
.xib的外观如下所示……请特别注意,done按钮是子视图顺序中的最后一个按钮,因此如果需要,它可以位于webview的顶部(是的,webview可以占据superview不动产的100%,按钮可以放在上面;我使用的这个示例应用程序中没有)(并忽略背景图像;在我用来拍摄此屏幕截图的示例应用程序中,它使用在部分透明的webview后面;如果需要,请确保它以.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
@interface-WebGoogleMapInUIWebViewViewController()
@属性(非原子)int backCount;
#如果需要IPHONE操作系统版本最低版本>IPHONE 4 3
@属性(只读、弱、非原子)ibuiwebview*webView;
#否则
@属性(只读、不安全、未维护、非原子)IBOUTLE UIWebView*webView;
#恩迪夫
@结束
@WebGoogleMapinuIWebViewController的实现
@综合网络视图;
//…UIViewController生命周期代码和所有其他代码位于此处…
#pragma标记-动作
-(iAction)完成:(id)发送方
{
if(self.webView.canGoBack)//对于nil webView依赖false
[self.webView goBack];
}
@结束
此解决方案应允许您停留在应用程序内部,然后如果您进入询问位置的对话框,结果应立即生效,并仅在应用程序内部应用
我知道这并不能像你所说的那样解决问题,但它可能会给你想要的行为。我倾向于同意SurfDev,它听起来像是返回了是。如果不是,那么根据你提供的数据,没有人能给你真正的答案
就我个人而言,我会记录WebView试图访问的每个URL。我最好的猜测是,不知何故,第二次尝试访问地图站点时会触发,而这次URL略有不同
底线是,NSLog可以获取更多关于webview正在做什么的数据。如果有必要,你可以使用它的每一个回调语句。我100%返回否。我已经在问题上发布了我的代码,以便你可以看到。我不确定我是否理解你的意思。我的应用程序是一个移动网站,可以加载谷歌地图,所以我不会想要更改移动网站。虽然我可以更改移动应用程序,但请您在这里举例说明一下好吗?在这种情况下,您最好选择第二个选项:在您的代码中的视图控制器(或故事板或xib)如果您有您提到的UIWebView
,您也可以选择一个按钮;将它放在最后一个顺序将使它显示在您的webview的“顶部”。然后,在代码中,在前面提到的视图控制器中,为该按钮实现一个iAction,该按钮将调用[webview goBack]
。因此,当用户准备离开地图时,他们可以点击您提供的后退按钮,并最终进入您原来的移动网站webView。这听起来是正确的方式。您能否为我提供一个如何实现这一点的示例?我的意思是,我有一个想法,但正如我所说,我不是一个真正的IoS开发人员,一个nd在这里举个例子可能对其他人也有帮助。非常感谢。我还没有实现这个,但从我的阅读来看,这似乎是正确的。你得到了赏金:-)