# `Mob.Notify`
[🔗](https://github.com/genericjam/mob/blob/master/lib/mob/notify.ex#L1)

Local and push notifications.

Requires `:notifications` permission (request via `Mob.Permissions.request/2`).
No `Info.plist` key needed on iOS. Android 13+ (API 33) requires
`POST_NOTIFICATIONS` in `AndroidManifest.xml`; older Android
versions are user-controlled via system settings. The default
`mix mob.new` template ships `POST_NOTIFICATIONS`. See the
[permissions guide](permissions.html) for the cross-platform table.

All notifications arrive via `handle_info` regardless of app state (foreground,
background, or relaunched after being killed). No special `mount/3` handling needed.

## Local notifications

    Mob.Notify.schedule(socket,
      id:    "reminder_1",
      title: "Time to check in",
      body:  "Open the app to see today's updates",
      at:    ~U[2026-04-16 09:00:00Z],   # or delay_seconds: 60
      data:  %{screen: "reminders"}
    )

    # Cancel a pending notification
    Mob.Notify.cancel(socket, "reminder_1")

    def handle_info({:notification, %{id: id, data: data, source: :local}}, socket), do: ...

## Push notifications (requires `mob_push` package on your server)

    # Call once after :notifications permission granted
    Mob.Notify.register_push(socket)

    def handle_info({:push_token, :ios,     token}, socket), do: ...
    def handle_info({:push_token, :android, token}, socket), do: ...

    def handle_info({:notification, %{title: t, body: b, data: d, source: :push}}, socket), do: ...

iOS: `UNUserNotificationCenter`. Android: `NotificationManager` + `AlarmManager` + FCM.

# `cancel`

```elixir
@spec cancel(Mob.Socket.t(), String.t()) :: Mob.Socket.t()
```

Cancel a pending local notification by its id.
Has no effect if the notification has already been delivered.

# `register_push`

```elixir
@spec register_push(Mob.Socket.t()) :: Mob.Socket.t()
```

Register this device for push notifications.

The device token arrives as `{:push_token, platform, token_string}` where
`platform` is `:ios` or `:android`.

Send this token to your server and use the `mob_push` library to send
notifications to it.

# `schedule`

```elixir
@spec schedule(
  Mob.Socket.t(),
  keyword()
) :: Mob.Socket.t()
```

Schedule a local notification.

Options:
  - `id:` (required) — string identifier, used to cancel the notification
  - `title:` (required) — notification title
  - `body:` (required) — notification body text
  - `at: %DateTime{}` — absolute trigger time (UTC)
  - `delay_seconds: integer` — trigger after N seconds (alternative to `at:`)
  - `data: %{}` — arbitrary map passed back in the `handle_info` payload

---

*Consult [api-reference.md](api-reference.md) for complete listing*
