快速启动带有 url 的应用程序,然后在启动应用程序之前调用 API
Posted
技术标签:
【中文标题】快速启动带有 url 的应用程序,然后在启动应用程序之前调用 API【英文标题】:Launching an app with a url in swift then calling an API before launching the app 【发布时间】:2021-11-22 20:55:36 【问题描述】:这有点难,如果标题不正确,我深表歉意。我不知道如何用词来表达标题。
基本上我在 ios 中使用 Jitsi SDK,我们将其设置为使用 JWT 进行身份验证和识别主机/访客。当应用程序使用 URL 启动时,我的问题就出现了。方法...
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool ...
当它启动时,它会将房间号作为 URL 的一部分。这一切都说得通。我的问题是我需要调用 API 来“签入”用户并检索在服务器上生成的 jwt。上面的函数有一个关于应用程序是否应该启动以及所有爵士乐的返回,在 Jitsi 文档中它显示返回应该是......
return JitsiMeet.sharedInstance().application(app, open: finalURL, options: options)
但是我不希望它这样做。我需要做一个API调用,我的api调用的回调会有我需要的jwt,然后我希望它可以正常打开应用程序,这样我就可以自己处理加入会议了。
我想我的主要问题是.. 如果我进行一个 API 调用,该调用具有一个回调,该回调将使用所需的参数启动应用程序,但我只是从该函数返回 false,它会正常工作吗?
我知道这可能听起来令人困惑,所以这里是我在想什么的快速 sn-p...
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 调用完成之前得到它的返回,因为返回不能等待 api 调用完成,但我不确定我该怎么做处理这种情况。这是当使用特定 URL 启动应用程序时在 AppDelegate 中调用的方法,当用户单击链接加入会议时会发生这种情况。那么,如果应用程序使用特定 URL 启动,有没有办法进行 API 调用,然后相应地处理它?我是否走在正确的道路上,从理论上讲,上述内容应该有效吗?我有点迷茫,需要比我更擅长 swift 的人的建议。
感谢您的通读,如果标题不正确,我再次道歉。很难解释,我不确定标题应该是什么。
【问题讨论】:
【参考方案1】:当 application(open,options) 被调用时,你必须立即返回一个 bool。如果您对服务器进行异步调用以获取 JWT 令牌,然后返回 false,它就会停在那里。
所以只需返回 true 并继续您正在做的事情。查看文档后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
【讨论】:
所以我应该保存房间号并返回true以正常打开应用程序,而不是返回false,然后在我的MainViewController中检查房间号是否存在,如果存在则进行api调用并加入会议? 是的,我就是这么做的。 在仔细阅读文档developer.apple.com/documentation/uikit/uiapplicationdelegate/… 之后,您的应用似乎已经在启动的路上,我误以为否则很抱歉。因此,如果 URL 有空间,我会修改您现有的代码以返回 true 并允许控制流继续通过您的网络调用。我会更新我的答案。 经过深思熟虑后,我更新了我的答案。抱歉之前走错路了。 感谢您的帮助。我可以通过在启动房间的主视图类中添加一个变量来解决它,然后在应用程序委托的 open url 方法中设置该变量并从该函数返回 true。以上是关于快速启动带有 url 的应用程序,然后在启动应用程序之前调用 API的主要内容,如果未能解决你的问题,请参考以下文章