iMessage Extension: didSelect not called on iPad when tapping same message - any workarounds?

17 hours ago 1
ARTICLE AD BOX

I'm building a turn-based iMessage game and hitting a wall with iPad support. Looking for anyone who has solved this.

The Problem

On iPad, didSelect(message:conversation:) only fires the first time a user taps a message bubble. Tapping the same message again does nothing - the method simply isn't called.

On iPhone, it works correctly every time.

This breaks turn-based games where both players interact with the same message.

What I've tried so far

Calling dismiss() after sending - hoping to deselect the message so the next tap registers as new. Didn't work.

Using other lifecycle methods:

willBecomeActive(with:) - fires but doesn't provide the selected message didBecomeActive(with:) - same issue didResignActive(with:) / willResignActive(with:) - not useful for this

Checking conversation.selectedMessage - often stale or nil when checking in lifecycle methods

Sending a new message each turn (different URL/session) - doesn't help since user still taps the same visible bubble

Forcing UI refreshes and state reloads - the underlying selection state doesn't update

Code

override func didSelect(_ message: MSMessage, conversation: MSConversation) { // iPhone: fires every tap ✓ // iPad: fires only on first tap ✗ loadGame(from: message, in: conversation) }

Environment

Xcode 15+ iOS 16.6+ MSMessagesAppViewController subclass Game state encoded in message URL

What I'm looking for

Has anyone shipped a turn-based iMessage game that works on iPad? Is there a workaround I'm missing? Any undocumented APIs or creative solutions? Should I be using a completely different architecture?

I've seen Developer Forums posts about this going back to 2016 with no Apple response. Hoping someone in the community has cracked it.

Happy to share more code or try any suggestions. Thanks!

Read Entire Article