iOS - 无需打开新标签即可从Native App返回Safari

时间:2015-04-30 14:50:14

标签: ios tabs safari native

我无法确定如何从iOS 7+中的原生应用程序切换到Safari。我使用过UIApplication.sharedApplication.openURL(),但会打开一个新标签。我想在不打开新标签的情况下将用户返回到他/她之前查看的当前页面。我发现了this SO帖子,但它已经有几年了,所以我希望自那时起事情发生了变化。

以下是我想象的工作流程:

  1. 用户点击Safari上HTML页面上的链接以打开/安装我的应用
  2. 用户在我的应用上执行操作
  3. 用户完成操作后,我的应用会自动打开Safari,用户又回到了他/她离开的页面
  4. 谷歌以某种方式使用他们的谷歌地图应用程序做到了这一点。如果您在Safari上的google.com上搜索地址,则可以点按搜索结果中显示的地图,它会打开地图应用。地图应用程序的顶部将是一个“返回Safari”栏,您可以点按。点击后,您将返回Safari而不加载其他标签。我似乎无法找到关于谷歌如何做到这一点的任何事情。如果我可以在我的应用程序中复制该行为,那就可以了。

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:10)

有一种方法可以使用标准iOS API实现您的目标。无需使用外部组件。

您可以控制自己的网页和应用,以便了解包含应用链接的确切网址。

以下是步骤:

1)在您的应用中,定义自定义URL方案。在这种情况下,我们假设您使用方案myawesomeapp://。您可以通过转到目标的“信息”部分在Xcode项目中执行此操作。见下文

Defining a custom URL scheme

2)在您的网页中,您需要处理两个方案:安装/未安装应用程序。这只是检测应用程序是否响应方案myawesomeapp://的问题。

要从您的网页检测您的应用是否未安装,请参阅this post

我将解释您的应用已安装的情况。

我们说包含该链接的网页是:

http://www.mywebsite.com/mypage.html#mytag

您在网页中提供的链接应将一些参数传递给应用,其中一个应该是您希望应用返回的网址。以下示例链接可以是:

myawesomeapp://?action=my_action_1&sourceurl=http%3A%2F%2Fwww.mywebsite.com%2Fmypage.html%23mytag

请注意,您在方案中作为参数传递的网址必须为URL encoded,否则无效。

3)在您的app委托中,您需要实现该方法:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

在此方法中,解析URL,解码查询项并将sourceURL传递给负责在调用之前处理操作的视图控制器。在这种情况下,我在ViewController中设置了一个公共属性,用于存储URL。

@property (nonatomic, strong) NSURL *sourceURL;

4)在视图控制器中,当用户完成交互时,您只需调用:

[[UIApplication sharedApplication] openURL:self.sourceURL];

由于self.sourceURL包含您网页的网址,因此将使用该网址启动Safari。但是,由于该页面已经打开,iOS会检测到该页面并重新打开该页面。

我在我的Github page中有一个实现所有这一切的示例项目。

最后,在iPhone中安装示例项目后,从移动版Safari中打开此堆栈溢出帖子并open my awesome app

打开应用程序后,单击按钮,您将返回此堆栈溢出帖子。

答案 1 :(得分:2)

您所描述的行为正是FB's AppLinks所针对的行为,并且您将获得与支持它的所有iOS应用程序相同的行为(这是相当多的)开箱即用!

顺便说一句,谷歌地图使用相同的组件:如果你打开Goog​​le地图就可以看到它,就像说Fantastical.app! enter image description here