# Notifications

Send a test push to your app on an iOS simulator, and read the notifications a device showed, even after the banner has gone.

Testers need two things from notifications: a way to make one arrive on demand, and a way to see what the device showed. Silan sends a test push to your app on an Xcode simulator with no server in the loop. On a real iPhone with the Developer way, and on Android, it lists the notifications the device showed, sent by your own backend, so an agent can check the words of a banner that is already gone.

## A worked example

Your staging server sends an order-shipped push to MegaMart. You ask your agent, connected with the testing tool set: place an order in MegaMart on the iPhone, wait for the shipped notification and tell me its text.

The agent taps through the order on the iPhone. Then it calls `wait_for` with a notification condition for MegaMart's app id, and the engine waits inside itself instead of the agent polling. When the push arrives, `get_notifications` with `app_id` lists it, with its title and body, and the agent quotes it back: `Your lamp is on its way`.

On an iOS 26.5 simulator Silan made, there is no server at all. The agent calls `send_test_push` with the app id and a payload, and the simulator shows the banner within a second.

## Steps

1. For a real iPhone, set it up with the Developer way. Reading notifications needs the element list, which the Simple way does not have ([Devices](/devices/)).
2. For a simulator, make one in Silan: **Add a device › Make a simulator**. Test pushes work on iOS 26.5 simulators. On iOS 27 simulators Silan turns the tool off and shows a warning in the device's health, because the system's push command hangs the simulator.
3. Connect your AI app with the testing tool set, or make an API key with the `testing` profile ([Connections](/features/connections/)).
4. In a flow or from your agent, send `send_test_push` on a simulator, or let your backend send the real push.
5. Check with `wait_for` (a notification condition) and `get_notifications` (`since`, `app_id`). See [wait_for](/reference/mcp/wait-for/), [get_notifications](/reference/mcp/get-notifications/) and [send_test_push](/reference/mcp/send-test-push/).

## What is supported today

| What | Status |
|---|---|
| Test push to your app on an Xcode simulator Silan makes (iOS 26.5) | Supported |
| Test push on an iOS 27 simulator | Off, with a warning in the device's health |
| Test push on an Android emulator | Not available (the Android driver refuses it) |
| Test push to a real iPhone or Android phone through Apple's or Google's push service | Coming soon |
| Reading the notifications a real iPhone showed (Developer way) | Supported |
| Reading the notifications an Android device showed | Supported on an emulator. Android phones in testing |
| Reading notifications on the Simple way | Not available |
| Waiting for a notification inside the engine with `wait_for` | Supported |
| Reading SMS or one-time codes from the phone's messages | Not available. The agent can read a code that shows on the screen like any text, or fill one from your password manager ([Sign-ins](/use-cases/sign-in-without-seeing-the-password/)) |

:::note[Proof]
Test pushes proved on iOS 26.5 Xcode simulators by a Silan worker, every push form delivered in under a second, and the hang on iOS 27 simulators seen on 30 Sep 2026 and worked around in the driver. Reading notifications proved by Silan workers on an iPhone with the Developer way and on an Android emulator. No owner run. Source: use-case facts of 4 Nov 2026 and the iOS simulator driver's notes.
:::