iOS · Android · SDK

# Content delivery

Which dashboard content reaches your app, when it refreshes, and how debug mode helps you test alerts.

## The same app in Mobile Joe

The public SDK key selects your app in Mobile Joe. iOS and Android use the same key and receive the same content; content of your other apps never appears.

## FAQs

New FAQs start as drafts. **Publish → Publish now** makes a FAQ live, and the SDK receives live FAQs in dashboard order. Drafts and archived FAQs are not delivered. Edits to a live FAQ reach your app with the next load.

## Alerts

An alert needs targeting before it can be delivered: enable **Send to all users** , or add at least one iOS or Android version filter. **Deliver → Deliver now** makes it live; archiving removes it from your app. Filters match the exact values the SDK sends:

| Filter | iOS | Android |
| --- | --- | --- |
| App versions | `CFBundleShortVersionString`, for example `2.4` | `versionName`, for example `2.4.0` |
| OS versions | System version with patch component, for example `18.5.0` | API level, for example `35` |

- When both filters of a platform contain values, both must match. An alert with filters for only one platform does not reach the other.
- Build numbers are not used for targeting.
- The filters offer only versions that devices of your app have reported. Run a new version once with the SDK configured to select it.

## Feature Plans

Draft feature plans are hidden. Every other status is visible and open for votes, so changing a draft to a visible status publishes it. The status controls where the standard screens list a plan:

| Filter | Statuses |
| --- | --- |
| All (default) | Open, Under review, Planned, In progress |
| Roadmap | Under review, Planned, In progress |
| Completed | Completed |

Closed plans appear in none of these lists, but a deep link still opens them.

## When content refreshes

The SDKs do not poll. Dashboard changes reach your app with the next request:

- **FAQs:** when the screen appears (iOS) or is created (Android), on pull to refresh, and on retry.
- **Feature Plans:** the same, plus while scrolling and on filter, sort, or search changes.
- **Alerts:** on iOS on appearance and when the app becomes active, at most once every 15 minutes, also in your own UI; on Android whenever their screen starts.

## Debug mode

Pass `debugMode: true` on iOS or `isDebugMode = true` on Android to `Joe.configure`. Debug mode changes only alerts: alerts with **Debug delivery** enabled reach debug-mode apps before delivery and regardless of targeting, and the iOS 15-minute interval does not apply. Disable debug delivery or debug mode before you test targeting.

Debug mode uses the live API, so votes are real votes. Enable it only in development builds, for example with `#if DEBUG` or `BuildConfig.DEBUG`, and relaunch the app after switching it.

## Test an alert

1. Create a draft alert with **Debug delivery** and confirm it appears with debug mode enabled.
2. Target your device's version, deliver the alert, and confirm it appears with debug mode disabled.
3. Archive it and confirm it disappears after the next refresh.
