在 swift 中使用 url 启动应用程序,然后在启动应用程序之前调用 API

Launching an app with a url in swift then calling an API before launching the app

这有点难,如果标题不正确,我深表歉意。我不确定如何表达标题才有意义。

基本上我在 iOS 中使用 Jitsi SDK,我们将其设置为使用 JWT 进行身份验证和识别 host/guest。当应用程序以 URL 启动时,我的问题就出现了。方法...

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {...

启动时,房间号作为 URL 的一部分。这一切都说得通。我的问题是我需要调用 API 来“签入”用户并检索在服务器上生成的 jwt。上面的函数有一个关于应用程序是否应该启动的 return 和所有的爵士乐,在 Jitsi 文档中它显示 return 应该是...

return JitsiMeet.sharedInstance().application(app, open: finalURL, options: options)

但是我不希望它那样做。我需要进行 API 调用,我的 api 调用的回调将具有我需要的 jwt,然后我希望它能够正常打开应用程序,以便我可以自己处理加入会议。

我想我的主要问题是..如果我进行一个 API 调用,它有一个回调函数,该回调函数将使用所需的参数启动应用程序,但我只是从该函数中 return false , 它会正常工作吗?

我知道这听起来可能令人困惑,所以这里是我的想法的一个简短片段...

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
  guard NSURLComponents(url: url resolvingAgainstBaseURL: true) != nil else {
    return false
  }
  let room = url.lastPathComponent
  if let finalURL = URL(string: 'myserverhere/' + room) {
    callCheckinAPI(room: room) { (res) in
      if(res.success) {
        DispatchQueue.main.async {
          self.launchMainApp(room)
        }
      } else {
        //not sure how to return false from here
      }
    }
    return false
  }
  return false
}

我觉得这会是个问题,因为函数会在 Api 调用完成之前获得它的 return,因为 return 不能等待 api 调用完成,但我不确定如何处理这种情况。这是在使用特定 URL 启动应用程序时在 AppDelegate 中调用的方法,当用户单击 link 加入会议时会发生这种情况。那么,如果应用程序以特定 URL 启动,有没有办法进行 API 调用,然后相应地处理它?我走在正确的道路上吗?从理论上讲,上述内容应该有效吗?我只是有点迷茫,需要 swift 比我好得多的人的建议。

感谢您的阅读,如有不妥之处再次致歉。很难解释,我不确定标题应该是什么。

调用 application(open,options) 时,您必须立即 return 一个布尔值。如果您对服务器进行异步调用以获取 JWT 令牌,然后 return false 它将就此停止。

所以 return 正确并继续您正在做的事情。查看文档后 https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application 如果应用程序尚未启动,您似乎正在启动该应用程序。


func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
  guard NSURLComponents(url: url resolvingAgainstBaseURL: true) != nil else {
    return false
  }

  let room = url.lastPathComponent

  // new made up function
  guard roomExists(url) else {
    return false
  }

  if let finalURL = URL(string: 'myserverhere/' + room) {
    callCheckinAPI(room: room) { (res) in
      if(res.success) {
        DispatchQueue.main.async {
          // the view controller should already be attached to the window by this point
          // so inside this function it should have a function to connect to the room
          mainviewcontroller.connect(to:room)
          // self.launchMainApp(room)
        }
      } else {
         // show alert that something went wrong
      } 
    }
  }

  return true
}