【问题标题】:iOS - Return to Safari from Native App without Opening New TabiOS - 从本机应用程序返回 Safari 而不打开新标签
【发布时间】:2015-07-10 08:14:50
【问题描述】:

我无法弄清楚如何从 iOS 7+ 中的本机应用切换到 Safari。我用过UIApplication.sharedApplication.openURL(),但这会打开一个新标签。我想在不打开新标签的情况下将用户返回到他/她之前查看的当前页面。我找到了this SO 帖子,但它已经有几年历史了,所以我希望从那时起情况有所改变。

这是我设想的工作流程:

  1. 用户在 Safari 上点击 HTML 页面上的链接以打开/安装我的应用程序
  2. 用户对我的应用执行操作
  3. 用户完成操作后,我的应用会自动打开 Safari,用户会回到他/她离开的页面

Google 以某种方式通过他们的 Google 地图应用做到了这一点。如果您在 Safari 上搜索 google.com 上的地址,您可以点击搜索结果中出现的地图,它将打开地图应用程序。在地图应用程序的顶部,您可以点击“返回 Safari”栏。点击它后,您将返回 Safari,而无需加载另一个选项卡。我似乎找不到任何关于谷歌是如何做到这一点的。如果我可以在我的应用程序中复制该行为,那就可以了。

任何帮助将不胜感激!

【问题讨论】:

  • 请看我的回答和 Github 项目。

标签: ios tabs safari native


【解决方案1】:

有一种方法可以使用标准 iOS API 来完成您想要的事情。无需使用外部组件。

您可以控制您的网页和您的应用,因此您知道包含指向您的应用的链接的确切 URL。

这些是步骤:

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

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

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

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

假设包含链接的网页是:

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

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

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

请注意,您在方案中作为参数传递的 URL 必须是 URL encoded,否则将无法正常工作。

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

- (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 包含您网页的 URL,Safari 将使用该 URL 启动。但是,由于该页面已经打开,iOS 会检测到这一点并重新打开该页面。

我的Github page 中有一个示例项目,它实现了所有这些。

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

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

【讨论】:

  • 哇,感谢您的惊人而彻底的回应!我会再看一下这个答案,并在星期二试一试!
  • @Alexander 如果您需要有关 Github 项目的帮助,请告诉我。
  • 太棒了,我成功了!非常感谢您的详细回答和示例代码!有什么办法可以防止 Safari 在打开现有选项卡后重新加载页面?
  • @Alexander 如果页面被缓存,它将不会重新加载。不幸的是,您无法控制这一点。但是我在我的一些应用程序中使用了这种方法并完成了这项工作。
  • @JuanCatalan link[5] 需要使用 https 进行更新,因为这是现在 SO 的默认协议。我自己在这里添加了一个:nub.ro/testiosurlopen
【解决方案2】:

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

顺便说一句,Google 地图使用相同的组件:如果您从 Fantastical.app 中打开 Google 地图,您就可以看到它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2021-07-08
    • 2018-12-11
    • 2021-10-12
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多