У меня небольшая путаница в отношении отображения моего пользовательского интерфейса при открытии приложения из входящего фонового видеовызова.Я успешно заставляю iOS вызывать интерфейс «входящего видеовызова» по умолчанию, когда приложение находится в фоновом режиме, но после ответа на вызов мое приложение не просыпается должным образом?
Когда я получаюpush push, я устанавливаю CXProvider и уведомляю CallKit о входящем звонке:
func handleIncomingCallFromBackground() {
//These properties are parsed from the push payload before this method is triggered
guard let callingUser = callingUser, roomName != nil else {
print("Unexpected nil caller and roomname (background)")
return
}
let callHandleTitle = "\(callingUser.first_name) \(callingUser.surname)"
let configuration = CXProviderConfiguration.default
let callKitProvider = CXProvider(configuration: configuration)
callKitProvider.setDelegate(self, queue: nil)
let callHandle = CXHandle(type: .generic, value: callHandleTitle)
self.callHandle = callHandle
let callUpdate = CXCallUpdate.default
callUpdate.remoteHandle = callHandle
let callUUID = UUID()
self.callUUID = callUUID
callKitProvider.reportNewIncomingCall(with: callUUID, update: callUpdate) { error in
if error != nil {
self.resetTwilioObjects()
}
}
}
Я отвечаю на метод делегата ответа на вызов для CXProvider, в котором я получаю токен доступа для видеовызова с сервераотправьте ответ на сервер, чтобы предупредить вызывающего абонента, что мы приняли вызов, и выполните переход к нашему собственному контроллеру видеовызова (это все, что jobsVC.showVideoCallVC () делает), который обрабатывает соединение вызовачерез комнату Twilio и т. д. Код ниже.
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
guard let customer = callingUser, let callHandle = self.callHandle, let uuid = callUUID, let roomName = roomName else {
resetTwilioObjects()
return
}
self.twilioAPI = TwilioAPI()
self.twilioAPI!.accessToken(room: roomName) { (success, accessToken) in
switch success{
case true:
guard let token = accessToken else {
return
}
let customerID = customer.userID
DispatchQueue.global().asyncAfter(deadline: .now() , execute: {
self.twilioAPI!.postResponse(customerID: customerID, status: 1) { (success) in
if let success = success, !success {
self.resetTwilioObjects()
}
}
})
guard let jobsVC = P_ChildHomeJobsVC.instance else {
print("Jobs VC unexpectedly nil")
return
}
//All this method does is perform a segue, the parameters are stored for later.
jobsVC.showVideoCallVC(callingUser: customer, callHandle: callHandle, callKitProvider: provider, callUUID: uuid, twilioAccessToken: token, roomName: roomName)
action.fulfill()
default:
action.fail()
self.resetTwilioObjects()
}
}
}
В зависимости от того, заблокировано ли устройство, я получаю различные действия:
- Если устройство заблокировано, при нажатиизначок моего приложения, чтобы открыть приложение, я получаю последний скриншот приложения с зеленой полосой вверху вместо пользовательского интерфейса.
- Если устройстворазблокирована, после нажатия на значок моего приложения, чтобы открыть приложение, ничего не происходит вообще - оно остается на интерфейсе iOS.
Согласно моим журналам, переход фактически выполняется правильно, и внутренняя работаконтроллер видеозвонка даже запускается, но вскоре после того, как я получаю applicationWillResignActive: делегатский вызов и все останавливается.
Что странно (а может и нет), если устройство заблокировано во время блокировкиприложение все еще находится на переднем плане, все работает как положено: приложение правильно проснулось и отображается обновленный пользовательский интерфейс.Я заметил, что я все еще получаю applicationWillResignActive: вызов, но сразу же получаю applicationDidBecomeActive: после этого.
Есть ли у кого-нибудь какие-либо предложения или подсказки относительно того, кем я могу бытьделать неправильно?