> For the complete documentation index, see [llms.txt](https://docs.tryterra.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tryterra.co/help-center/help-topics/no-data/connections-expiring-disconnecting/silent-mobile-disconnect-reinit.md).

# How do I handle silent mobile disconnects?

Silent disconnects mainly affect mobile-based integrations like Apple Health and Health Connect.

Silent disconnects mainly affect mobile-based integrations like Apple Health and Health Connect.

**On app launch, call `getUserId()`.** If it returns `null` when you expect a connection (for example on a new device or after an update), call `initConnection()` to re-establish it rather than disconnecting first. Call it once per app launch, not again during the same session (for example from a view that reappears). On iOS SDK versions before 1.9.2, each extra call added another background observer, which caused duplicate uploads.

The permission popup will not reappear because the original grant is remembered, unless you request expanded permissions or the app was deleted and reinstalled.

On reinstall:

* If the device ID is unchanged, you keep the same user.
* If the device ID changes, iOS treats it as a new device and a new user ID is created.

Enforce one provider connection per `reference_id` to avoid orphaned or duplicate user IDs.

For web-based integrations you normally receive a [deauth event](https://docs.tryterra.co/health-and-fitness-api/user-authentication/handling-authentication-events) when access is revoked; in rare silent cases data requests return an `AuthorizationExpired` error. If `getUserId` returns `null` on the same device that was previously connected, capture a reproducible case for investigation.

A `404` from a data endpoint after webhooks means the user has deauthenticated and the connection is gone: handle it as "no longer connected", stop retrying, and return `2xx`.
