Availability comes and goes
The offer screen opens only for a linked player who currently has an offer, and that can change between syncs: an offer available at launch may be gone an hour later, and one that was absent may appear. CheckCanShowOffer on the Linked status before calling. Calling in any state is still safe - when there is no offer, the call does nothing and the reason is logged through OnLog.
Because availability is transient, do not cache a “this player has an offer” flag of your own - it will go stale. Gate your UI on the SDK’s live snapshot instead:
Offer lifecycle
The offer screen reports its lifecycle through the same unified events, carryingAlmediaScreen.Offer and the same AlmediaInAppScreenResult semantics as the reward hub:
ShowOffer() while the reward hub (or the linking flow) is showing is ignored with a log, and no lifecycle event fires for the ignored call.