Я пишу приложение для регистрации некоторых устройств в моей среде. У меня есть экран регистрации, где пользователь может ввести свое имя пользователя. Затем я посылаю команду через привилегированного помощника, чтобы зарегистрировать машину на нашем сервере MDM. Пока все это работает очень хорошо. Однако, поскольку двоичный файл, с которым взаимодействует помощник, не имеет дескрипторов XPC, я не могу проверить, когда он завершится. Но мое приложение должно остановиться, пока регистрация на сервере не будет обновлена.
По этой причине я написал вызов API, чтобы проверить текущего пользователя, назначенного устройству на сервере, и сравнить его с тем, который дал нам пользователь. Эта функция с обработчиком завершения возвращает Bool:
func isUsernameSetAndMatchesLocal(sAMAccountName: String, usernameSet: @escaping (Bool?, URLResponse?, Error?) -> Void) {
let url = "https://my.api.com/api/" + getSerialNumber() + "/subset/Location"
guard let request = try? setupJssApiUrlRequest(apiURL: url) else {
print("Malformed URL")
return
}
URLSession.shared.dataTask(with: request) { data,response,error in
guard let data = data else {
print(error ?? "Error is nil")
return
}
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let computer = try decoder.decode(ComputerRecord.self, from: data)
if computer.computer.location.username == sAMAccountName {
usernameSet(true, response, error)
} else {
usernameSet(false, response, error)
}
} catch {
usernameSet(false, response, error)
}
}.resume()
}
Это хорошо работает, и если я запустлю это, скажем на детской площадке:
let myObject = myClass.init()
myObject.isUsernameSetAndMatchesLocal(sAMAccountName: "john.smith"){ bool, response, error in
guard let bool = bool else {
print("We got an error")
return
}
print(bool)
}
Что я действительно хочу сделать, так это иметь некоторый код, похожий на этот, чтобы мое приложение приостановилось и дождалось завершения регистрации и обновления на сервере.
var isAssigned = false
while isAssigned == false {
self.myJSS.isUsernameSetAndMatchesLocal(sAMAccountName: sAMAccountNameValue){ bool, response, error in
guard let bool = bool else {
return
}
isAssigned = bool
}
}
Это похоже на ошибку, и код либо не запускается, либо получает противоречивые результаты. Я уверен, что есть способ сделать это, но я не уверен. По сути, я хочу, чтобы приложение:
- Сравнить имя пользователя, которому назначено устройство, и вернуть true / false
- Пока false, подождите и проверьте снова
- Когда мы получим истину, тогда продолжаем
Надеюсь, это имеет смысл! Люди на этом сайте очень помогли с другими вопросами, поэтому я надеюсь, что кто-то еще может поделиться своими знаниями.
Спасибо,
Людет (Эд)