我正在构建一个应用程序,我希望用户能够使用URL方案点击URL,并被发送到我的应用程序上的特定视图控制器。没问题。但是,我还需要将特定数据发送到该视图控制器。我需要它,以便用户A可以通过消息向用户B发送邀请(URL)。用户B可以点击该邀请(URL)打开一个屏幕,其中包含有关Firebase邀请的详细信息。然后,用户可以接受邀请,也可以拒绝邀请。
我已经这样设置了数据库:
用户(集合)
“ uid”(文档)
聚会(集合)
“ partyName”(文档)
respondedYes(字段)
respondedNo(field)
这是AppDelegate
中某人点击URL的代码。
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
// Open the RSVPViewController.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rsvpViewController = storyboard.instantiateViewController(withIdentifier: "RSVPViewController") as! RSVPViewController
if let window = self.window, let rootViewController = window.rootViewController {
var currentController = rootViewController
while let presentedController = currentController.presentedViewController {
currentController = presentedController
}
currentController.present(rsvpViewController, animated: true, completion: nil)
}
return true
}
我不知道如何获得邀请,所以我知道用户B点击URL后显示的邀请,因此我无法显示数据。如何使我的应用程序像我在第一段中对概念的解释那样工作?让我知道您是否需要更多信息。真的很难解释我需要什么帮助。
答案 0 :(得分:0)
在这种情况下,邀请URL需要包含一些参数,这些参数将告诉您的应用用户B正在打开哪个邀请。这可以通过在URL中使用简单的GET参数来实现。因此,例如您的URL现在可能看起来像这样:myapp:Invite?invite_id=2
,其中invite_id
参数将在用户B打开应用程序时处理。
由于不是让其他用户访问第一个用户的UID下的数据的最佳主意,因此我将在firestore上创建一个新的“邀请”集合,当用户A发送该文件时会在其中创建一个新的邀请文档。新创建的邀请文档的UUID将是您在上面的URL中发送的参数。
要创建此URL,请参见this answer,基本上,您将执行以下操作:
let queryItems = [NSURLQueryItem(name: "invite_id", value: "123")]
let urlComps = NSURLComponents(string: "myapp:Invite")!
urlComps.queryItems = queryItems
let URL = urlComps.URL!
现在,在application(_:,handleOpen:)
(对于接收方的应用程序)中,您可以通过扩展URL
类来解析URL参数,如this answer所述。
假设您使用链接答案中描述的扩展名(我在这里建议之前在操场上进行了测试),则可以按以下方式重写函数:
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
let invite_id = url.valueOf("invite_id")
// get data from firestore for this invite id and store it in a struct called invite_data
// (i'm going to assume that the variable invite_data is defined now).
// Open the RSVPViewController.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rsvpViewController = storyboard.instantiateViewController(withIdentifier: "RSVPViewController") as! RSVPViewController
// tell the rsvpViewController about the data:
// this assumes you have a variable in rsvpVC that takes this info to display it.
rsvpViewController.invite_data = invite_data
if let window = self.window, let rootViewController = window.rootViewController {
var currentController = rootViewController
while let presentedController = currentController.presentedViewController {
currentController = presentedController
}
currentController.present(rsvpViewController, animated: true, completion: nil)
}
return true
}
请注意,上面的invite_data
是一个结构,可以包含您需要在RSVP VC中显示相关详细信息以及处理接受或拒绝邀请之类的任何信息。
另一种方法是只发送要显示在rsvpViewController
中的所有数据,而不必打扰邀请文档。如果字段数很少,可能会更容易。但是我怀疑在这种情况下,您将希望传递诸如party_id
之类的东西,因此取决于您的用例。