如何允许任何用户在Firestore中的“ uid”下访问数据?

时间:2019-05-25 21:29:08

标签: swift firebase google-cloud-firestore

我正在构建一个应用程序,我希望用户能够使用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后显示的邀请,因此我无法显示数据。如何使我的应用程序像我在第一段中对概念的解释那样工作?让我知道您是否需要更多信息。真的很难解释我需要什么帮助。

1 个答案:

答案 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之类的东西,因此取决于您的用例。