iOS - Return 在不打开新标签的情况下从本机应用程序到 Safari

iOS - Return to Safari from Native App without Opening New Tab

我无法弄清楚如何从 iOS 7+ 中的本机应用程序切换到 Safari。我使用了 UIApplication.sharedApplication.openURL(),但这会打开一个新标签。我想 return 用户到当前页面 he/she 之前正在查看而不打开新选项卡。我发现 this SO post,但它已经有几年了,所以我希望从那以后情况有所改变。

这是我设想的工作流程:

  1. 用户在 Safari 的 HTML 页面上点击 link 到 open/install 我的应用程序
  2. 用户在我的应用程序上执行操作
  3. 用户完成操作后,我的应用程序自动打开 Safari,用户返回到 he/she 离开的页面

Google 用他们的 Google 地图应用程序以某种方式做到了这一点。如果您在 Safari 上的 google.com 上搜索地址,您可以点击搜索结果中显示的地图,它会打开地图应用程序。在地图应用程序的顶部将有一个 "Return to Safari" 栏,您可以点击它。点击它后,您将 returned 到 Safari,而无需加载另一个选项卡。我似乎找不到任何有关 Google 是如何做到这一点的信息。如果我可以在我的应用程序中复制该行为,那就可以了。

如有任何帮助,我们将不胜感激!

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

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

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

您控制您的网页和您的应用程序,因此您知道确切的 URL link 到您的应用程序。

步骤如下:

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

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

如果您的应用未安装,请从您的网页检测,请参考this post

我将说明您的应用已安装的情况。

假设包含 link 的网页是:

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

您在网页中提供的 link 应该向应用程序传递一些参数,其中之一应该是您希望应用程序向 return 传递的 URL。下面的示例 link 可以是:

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、解码查询项并将源URL 传递给负责在调用之前处理操作的视图控制器。在这种情况下,我在 ViewController 中设置了一个 public 属性 来存储 URL.

@property (nonatomic, strong) NSURL *sourceURL;

4) 在view controller中当用户完成交互时,你只需要调用:

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

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

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

最后,在 iPhone 中安装示例项目后,从移动版 Safari 和 open my awesome app

打开此堆栈溢出 post

应用程序打开后,单击按钮,您将 return 到此堆栈溢出 post。