Как я могу разрешить любому пользователю доступ к данным в разделе «uid» в Firestore? - PullRequest
0 голосов
/ 26 мая 2019

Я создаю приложение и хочу, чтобы пользователь мог нажимать на URL-адрес с помощью схемы URL-адресов и отправляться на определенный контроллер представления в моем приложении. Это работает хорошо. Однако мне также нужно получить конкретные данные на этот контроллер представления. Мне нужно, чтобы пользователь A мог отправить приглашение (URL) через сообщения пользователю B. пользователь B может нажать на это приглашение (URL), чтобы открыть экран с подробной информацией о приглашении от Firebase. Затем пользователь может принять приглашение или отклонить его.

Моя база данных настроена так:

пользователи (сбор)

"UID" (документ)

стороны (сбор)

"partyName" (документ)

respondedYes (поле)

respondedNo (поле)

Это код, который есть в 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 голосов
/ 26 мая 2019

В этом сценарии URL-адрес приглашения должен содержать параметры, которые сообщат вашему приложению, кто приглашает открывающего пользователя B. Это может быть достигнуто с помощью простых параметров GET в вашем URL. Так, например, ваш URL теперь может выглядеть следующим образом: myapp:Invite?invite_id=2, где параметр invite_id будет обрабатываться, когда пользователь B откроет приложение.

Поскольку предоставление доступа другим пользователям к данным по UID первого пользователя не самая лучшая идея, я бы создал новую коллекцию "приглашений" в firestore, где новый документ с приглашением создается, когда пользователь A отправляет его. UUID вновь созданного документа приглашения будет параметром, который вы отправите в указанном выше URL.

Чтобы создать этот URL, см. этот ответ , в основном вы должны сделать следующее:

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, как описано в в этом ответе .

Предполагая, что вы используете расширение, описанное в связанном ответе (который я тестировал на игровой площадке, прежде чем рекомендовать здесь), вы можете переписать свою функцию следующим образом:

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 и т. Д., Так что это зависит от вашего варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...