Can't insert message after TouchID authentication

63 Views Asked by At

So I'm playing around a bit with iMessage apps, and have hit a weird issue. I want to try and use TouchID authentication inside of iMessage, and am able to pop the TouchID alert fine from the iMessage app. However, when I go to insert a message showing the result of TouchID, it won't insert the message for me. Here's the relevant code:

@IBAction func authenticateTapped(_ sender: Any) {
    let context = LAContext()
    var wasSuccessful = false
    self.group.enter()
    context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Testing authentication") { (successful, _) in

        wasSuccessful = successful
        self.group.leave()
    }

    self.group.notify(queue: DispatchQueue.main) {
        self.sendResult(wasSuccessful)
    }
}

@IBAction func sendMessageTapped(_ sender: Any) {
    sendResult(true)
}

func sendResult(_ successful: Bool) {
    guard let conversation = self.activeConversation else { fatalError("expected conversation") }

    var components = URLComponents()
    components.queryItems = [URLQueryItem(name: "successful", value: successful.description)]

    let layout = MSMessageTemplateLayout()
    layout.image = UIImage(named: "green_checkmark")
    layout.caption = "Authentication Result"

    let message = MSMessage(session: conversation.selectedMessage?.session ?? MSSession())
    message.url = components.url!
    message.layout = layout

    print("queryParts: \(String(describing: components.queryItems))")
    print("message: \(message)")
    print("activeConversation: \(String(describing: conversation))")

    conversation.insert(message) {
        (error) in

        print("in completion handler")
        print(error ?? "no error")
    }
}

When authenticateTapped is triggered, the TouchID prompt shows, I successfully authenticate, and then see every log message inside of the sendResult message, except for any of the ones in the completion handler of the insert method.

The weird thing is, when the sendMessageTapped method is fired, everything works as expected. Does anyone know what's going on here, and why I can't seem to insert a message after I successfully authenticate using TouchID?

The only thing I can think of that's different between the two is that the view controller is disappearing when the TouchID prompt comes up, however, if that were the cause, I would expect none of my print statements would show up in the console, when everyone does except those in the completion handler?

Edit: I've done a bit more digging. When presenting the Touch ID authentication in compact mode, your view controller resigns active. When presenting in expanded mode, it stays active, allowing you to insert the message.

Does anyone know if resigning active when presenting the Touch ID alert is a bug or intended behavior?

0

There are 0 best solutions below