5

基本上,每当应用程序启动或打开时,我都会检查剪贴板上是否有链接,如果有,我会询问用户是否要添加它。

但是,我最近添加了使用 x-callback-urls 将 URL 添加到应用程序中的功能。如果他们使用 LaunchPad 之类的应用程序在我的应用程序中打开 URL,“你想从剪贴板添加 URL 吗?” 通知仍然打开,这没有多大意义,因为他们已经启动它以添加该 URL。

问题是,我的 AppDelegate 中的方法在and之后openURL:被调用来处理 URL 方案,所以我无法检查这些方法是否已经被调用。我可以使用 a ,但这似乎很懒惰和 hacky。 appDidFinishLaunchingappWillEnterForegroundopenURLdispatch_after

有没有办法检查应用程序是如何启动的,即:通过 URL 方案或通过手动打开?

4

2 回答 2

9

不要实施applicationDidFinishLaunching:. 改为使用application:didFinishLaunchingWithOptions:。同样不要使用application:handleOpenURL:application:openURL:sourceApplication:annotation:而是使用。

如果您从 URL 启动,则选项字典将包含 UIApplicationLaunchOptionsURLKey 键,并且该键的值将是 URL。

但是,如果您的应用程序已经在运行但在后台,并且用户调用了重新打开您的应用程序的 URL,您将收到一条application:openURL:sourceApplication:annotation:消息。您真正需要做的是实现一个 handleURL 方法,然后从两者调用该application:didFinishLaunchingWithOptions:方法application:openURL:sourceApplication:annotation:

编辑:

请注意,在 iOS 9 中,Apple 弃用application:openURL:sourceApplication:annotation:并添加了新方法application:openURL:options:

如果您的应用仅适用于 iOS 9 及更高版本,则应实施新application:openURL:options:方法。如果你需要支持 iOS 9更早的版本,你可能应该同时实现application:openURL:sourceApplication:annotation:新的 iOS 9 方法application:openURL:options:。操作系统将为您正在运行的操作系统版本调用正确的版本。然后,我将创建一个两者都调用的通用方法。这样你就可以从两个操作系统版本中调用,但你处理打开 URL 的代码只在一个地方。

于 2014-01-18T20:25:59.933 回答
1

applicationDidBecomeActiveopenURL在和continueUserActivity( 和 之后)之后调用appWillEnterForeground,因此是确定应用程序打开方式的好地方。

将 url 缓存在openURLcontinueUserActivity(取决于来源,深层链接可能来自continueUserActivity。有趣的是,我总是看到从 Messages 打开链接时调用该方法。然后检查该 urlapplicationDidBecomeActive

  private var launchURL:URL?

  static func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    launchURL = userActivity.webpageURL
    // Do something with userActivity
    return true
  }

  static func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
    launchURL = url
    // Do something with URL
    return true
  }

  static func applicationDidBecomeActive(_ application: UIApplication) {
    defer {
      launchURL = nil // Just cleaning up
    }

    let didLaunchFromURL = launchURL != nil
  }

于 2019-05-09T20:19:45.493 回答