Users communicate in iMessage, and your service works right inside the chat. No need to leave the Messages app to send a sticker, vote, or make a move in a game. An iMessage extension is a separate Extension target inside an iOS app, embedded in iMessage. Since the technology’s inception, we have developed over 20 projects for the App Store, guaranteeing pass of App Store review and avoiding rejections under sections 4.2 and 5.1. On one social app project, we built an interactive poll-sharing extension, reducing message delivery latency from 5 seconds to under 1 second by switching to URL-encoded data and implementing NSCache.
Sticker Pack vs MSMessagesAppViewController
Sticker Pack — the simplest option without code: add an Extension target of type "Sticker Pack Application", upload PNG/APNG/GIF to Stickers.xcassets. Apple generates the UI automatically. Sizes: Small (100×100 pt), Regular (136×136 pt), Large (206×206 pt). APNG — up to 500 KB, GIF — up to 25 MB (not recommended due to quality loss).
MSMessagesAppExtension — a full extension with UIKit or SwiftUI. Entry point is MSMessagesAppViewController. Two modes: Compact (~225 pt) and Expanded (nearly full screen). Switch via requestPresentationStyle(.expanded). Messages are represented by MSMessage objects with URL and MSMessageTemplateLayout (image, caption, subcaption). On tap, the recipient opens the extension if installed.
Why Choose MSMessagesAppViewController?
MSMessagesAppExtension is 10 times more flexible than Sticker Pack: it allows interactive cards, multiplayer games, polls, and integration with purchases via StoreKit 2. Sticker Pack is only suitable for static or animated stickers. If your project requires any interactive scenario—choose MSMessagesAppViewController.
Limits and Constraints of iMessage Extension
The main constraint is RAM: Apple allocates about 100 MB. Exceeding it causes an EXC_RESOURCE crash. Use NSCache with countLimit and totalCostLimit, avoid heavy images in cache, load data asynchronously. Second constraint is the URL size for data transfer: encode data into query parameters or base64, avoid large payloads.
How to Pass Data Between Participants?
Data is encoded into the URL of the MSMessage object: MSMessage.url = URL(string: "yourapp://state?data=\(encodedState)"). The recipient parses the URL in willBecomeActive(with:). You cannot directly use UserDefaults—each participant has their own device. For shared data between the main app and extension, set up an App Group: use the same identifier group.com.yourapp.shared in Capabilities of both targets. Then read/write via UserDefaults(suiteName:) and FileManager.containerURL(forSecurityApplicationGroupIdentifier:).
Comparison of Compact vs Expanded Modes
| Feature | Compact (~225 pt) | Expanded (full screen) |
|---|---|---|
| Height | ~225 pt | Full available screen |
| Primary use | Quick input, preview | Complex interfaces, games |
| Switching | Default | requestPresentationStyle(.expanded) |
| Message display | Only incoming | Can create new messages |
Comparison of Sticker Pack vs MSMessagesAppExtension
| Feature | Sticker Pack | MSMessagesAppExtension |
|---|---|---|
| Development complexity | Very low | Medium/high |
| UI flexibility | None | Full (UIKit/SwiftUI) |
| Interactivity | No | Yes |
| Time to create | 1–3 days | 3–10 weeks |
| Purchase support | Free only | StoreKit 2 / Billing 6 |
Common mistakes and solutions
Crash when using UIActivityViewController — use a custom UI. Slow loading due to cache — implement NSCache with countLimit and totalCostLimit. Code Signing errors (provisioning profile) — ensure the App ID includes the iMessage capability. Problems with push notifications (APNs) in the Extension — configure certificates separately for the App Group.
Development Process
- Scenario analysis — determine how the user interacts in compact and expanded modes.
- Design — architecture considering memory limits and data transfer.
- Implementation — write code in Swift/SwiftUI using MSMessagesAppViewController.
- Integration — set up App Group, StoreKit 2, push notifications.
- Testing — on real devices (at least 2 iPhones with different iOS versions).
- Publishing preparation — App Store Connect, TestFlight, metadata.
- Support — 30 days of free technical support after release.
What’s Included in the Work
You receive: project source code with comments, configured App Groups and StoreKit, prepared metadata for App Store Connect, a publishing guide, and 30 days of technical support after release. Additionally, we provide full documentation covering architecture, data flow, and App Group setup; access to the repository with version history; training for your team on working with extensions; and a guaranteed submission to the App Store with support during the review process. If needed, we assist with fixing any rejection issues within the warranty period.
Timeline and Budget
Sticker Pack (no code): 1–3 days (design + assembly) — from $500. iMessage Extension with interactive cards: 3 to 5 weeks — from $5,000. Multiplayer game or complex data exchange: 6 to 10 weeks — from $12,000. The cost is determined after scenario analysis—we ensure a transparent budget structure. Contact us for a preliminary timeline and cost estimate. Get a consultation—we’ll assess the complexity of your task and propose an optimal solution. Order development today.







