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