TL;DR
- An iOS SDK integration lets you embed in-app surveys natively inside Swift, Objective-C, and SwiftUI apps — no custom feedback UI to build
- Minimum requirements: Xcode 13+, iOS 12.1+, Swift 5+
- Two install paths: CocoaPods (recommended for version pinning and CI/CD compatibility) or manual framework
- Trigger surveys after specific iOS events, not on cold app open, where response rates drop sharply
sendDeviceDetailsautomatically captures OS version, device type, resolution, and IP address with every response- iOS in-app surveys see 20–40% response rates, compared to 8–15% for post-session email surveys
Crash reports tell you something broke. App Store reviews tell you a user was angry enough to write about it. Neither tells you what they were actually trying to do when things went sideways, or whether the friction you shipped last sprint is causing silent churn or just minor inconvenience users worked around and forgot.
That's the gap in-app user feedback fills. Direct signals, in context, tied to the moment — not a week later from a reviewer who's already gone. With Zonka Feedback's iOS SDK, you can collect that feedback inside your app without building a custom survey flow from scratch. This guide covers the full integration: prerequisites, installation, initialization in Swift and Objective-C, iOS-specific trigger logic, and what to actually do with what you collect once it starts coming in.
Why iOS Feedback Collection Works Differently
Most teams assume in-app feedback works the same way regardless of platform. It doesn't.
Apple controls when the review prompt appears. Apple decides how often it fires. Apple routes users to the App Store — where you see a star rating and nothing else. The native SKStoreRequestReview API, which most iOS teams default to, can't ask specific questions, can't target particular user segments, and gives you zero context behind the number. That's the tool you're working around, not with.
Apple's Human Interface Guidelines add another layer. Overlays and modal interruptions that feel acceptable on Android or web land differently on iOS, where users have strong expectations about minimal friction and native UI behavior. A survey pattern that performs fine on one platform can feel intrusive on iPhone. iOS users don't file complaints about that. They uninstall.
That's the iOS-specific feedback problem: the window is narrow, and the signals are quiet.
The SDK approach gives you what the App Store can't: structured questions tied to specific events, user targeting by cohort or behavior, and response data that lives in your own system rather than as a star count you can't drill into.
For the broader case on why in-app surveys outperform other feedback channels, that's covered in depth separately. This guide stays iOS-specific.
If you're still evaluating which tool to use before committing to an integration, the in-app feedback tools comparison covers what to look for across the major SDKs.
When Should You Trigger a Survey in Your iOS App?
The most common iOS feedback mistake isn't technical. It's timing.
A survey fired on cold app open catches users before they've done anything worth giving feedback on. A survey fired at session end catches users already mentally elsewhere. Both produce low response rates and weak data.
Trigger on an event. Not on a clock.
Here's what works, anchored to iOS-specific behavior:
1. After an Apple Pay or In-App Purchase Confirms
The moment after a transaction completes is the highest-intent signal you have. The user committed. They're still in the experience. A single CSAT question ("How smooth was the checkout?") lands in context and takes three seconds. Leave it for the next session and you're asking someone to reconstruct a memory.
2. After a Face ID or Touch ID Authentication Flow
Authentication is a friction point specific to iOS. If a user struggles with Face ID recognition, falls back to passcode, or abandons the flow entirely, that's a detectable signal. Trigger a brief question after the flow resolves, whether it succeeded or not. Your crash report won't surface this. Your App Store reviews won't either, because users who hit auth friction once just work around it. Until they don't.
3. Before You Fire SKStoreRequestReview
Apple's native review prompt has no sentiment filter. It reaches everyone: frustrated users, confused users, users who just had a bad session. And routes them to a public rating. A one-question NPS or thumbs-up screen before you call SKStoreRequestReview lets you intercept detractors first. Route promoters to the review prompt. Route detractors to a feedback form where you can actually do something about what they tell you.
4. When a Core Gesture Interaction Fails
If your app uses UIGestureRecognizer delegates and a key gesture isn't registering correctly, that's a detectable event. Most teams don't add a feedback trigger to failure paths, which means they find out about gesture issues from App Store reviews six weeks after they shipped. Add a short question to the failure state. The data is specific, the timing is right, and users are already paused.
5. After an App Clip or TestFlight Build Interaction
App Clips users are first-impression feedback at its purest. They've experienced your app's core flow without the commitment of a full install. The moment after the core action completes is the right time to ask. For beta testing surveys on TestFlight builds specifically, this is one of the highest-ROI trigger points you can set up before a production release, when fixes are still cheap.
6. On Background-to-Foreground Return
When a user returns after a period away — triggered via UIApplication.willEnterForegroundNotification — you have a natural re-engagement moment. A short "what brought you back?" question works well here, particularly for apps with irregular usage patterns like fitness or productivity tools. It's low-friction because the user is already in a transition state and hasn't committed to a task yet.
7. After a Core Workflow Completes
Feature activation, first report generated, profile setup finished: whatever the core milestone is in your app, completion is the right time to ask whether it worked as expected. On iOS, workflow completion often aligns with a haptic success signal, which makes the survey feel like a natural continuation rather than an interruption.
For broader mobile app survey trigger logic across iOS and Android, that's covered separately.
How to Integrate the Zonka Feedback iOS SDK: Step-by-Step
1. Pre-Requisites: What You Need Before You Start
Before you integrate the iOS SDK, make sure you meet these requirements:
- Active Zonka Feedback Account – If you don't have one, sign up here.
- A survey created in Zonka Feedback – Ensure you have created at least one survey in Zonka Feedback. Add your preferred questions for in-app survey based on your use-case (ratings, multiple-choice, open-ended responses, etc.).
- SDK Token – Retrieve your SDK token from Zonka Feedback. Go to Distribute > In-App tab, enable the toggle, and copy your SDK token.
- App Permissions: Ensure compliance with Apple's App Store guidelines if collecting user data such as email, phone numbers, or names.
Once you have these, you're ready to install the SDK.
2. Minimum System Requirements
Before installing the SDK, ensure your development environment and app meet these requirements:
- Xcode Version: 13 or later
- iOS Deployment Target: 12.1 or later
- Supported Devices: iPhone and iPad (iOS 12.1+)
- Programming Language: Swift 5+ (supports Objective-C integration)
3. Installing the Zonka Feedback iOS SDK
Zonka Feedback's iOS SDK supports two installation paths. CocoaPods is the recommended option. It handles version pinning cleanly and plays well with most CI/CD pipelines. Manual framework installs work, but if your team upgrades Xcode versions or rebuilds the project from scratch later, CocoaPods saves you the re-setup.
Option 1: Install Using CocoaPods (Recommended)
If you haven't installed CocoaPods yet, run the following command in your terminal:
sudo gem install cocoapods
Navigate to your project directory in the terminal and run:
pod init
Open the generated Podfile and add the following lines:
source "https://github.com/CocoaPods/Specs.git"
platform: ios, "12.1"
use_frameworks!
pod "ZonkaFeedback"
Save the Podfile, then run the following command in Terminal:
pod install
After installation, open the .xcworkspace file CocoaPods generates, not the .xcodeproj. That's the file you'll work from going forward.
Option 2: Add Framework Directly
Download the ZonkaFeedback.framework file and drag it into your Xcode project. In the pop-up window, ensure that "Copy items if needed" is checked, then click "Finish."
Configure the Framework in Target Settings
- Open your project settings in Xcode.
- Navigate to the "General" tab under your app's target settings.
- Locate the "Frameworks, Libraries, and Embedded Content" section.
- Set ZonkaFeedback.framework to "Embed & Sign" to ensure proper functionality.
4. Setting Up the SDK
Once the framework is added, initialize it in your app using the SDK token you retrieved from your Zonka Feedback dashboard.
For specifying the region use US for the US region and EU for the EU region.
Swift
import ZonkaFeedback
class AppDelegate: UIResponder, UIApplicationDelegate
{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
{
ZFSurvey.sharedInstance().initializeSDK(token: "<<SDK_TOKEN>>",zfRegion: "<<REGION>>")
return true
}
}
Initialization in SwiftUI Projects, with No AppDelegate Class
The Zonka Feedback iOS SDK is fully compatible with SwiftUI projects. If your SwiftUI app does not include an AppDelegate class, you can initialize the SDK directly within the constructor of the main application class, as shown below:
import ZonkaFeedback
@main
struct SwiftUIApp: App
{
init()
{
ZFSurvey.sharedInstance().initializeSDK(token: "<<SDK_TOKEN>>",zfRegion: "<<REGION>>")
}
}
Objective-C
#import <ZonkaFeedback-Swift.h>
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[ZFSurvey sharedInstance] initializeSDKWithToken:@"<<SDK_TOKEN>>" zfRegion:@"<<REGION>>"];
}
5. Identifying Logged-In Users
If your app has user accounts, you can automatically add users to your Zonka Feedback contacts by passing their details.
|
Parameter |
Type |
Example |
|
contact_name
|
string
|
"Josh Holland"
|
|
contact_email
|
string
|
"example@company.com"
|
|
contact_mobile
|
string
|
"+14532323223"
|
|
contact_uniqueid
|
string
|
"k2334"
|
Swift
import ZonkaFeedback
let userInfoDict = NSMutableDictionary()
userInfoDict.setValue("james@examplemail.com", forKey: "contact_email")
userInfoDict.setValue("James Robinson", forKey: "contact_name")
userInfoDict.setValue("+919191919191", forKey: "contact_mobile")
ZFSurvey.sharedInstance().userInfo(dict: userInfoDict)
Objective-C
#import <ZonkaFeedback-Swift.h>
NSMutableDictionary *userInfoDict = [[NSMutableDictionary alloc]init];
[userInfoDict setValue:@"james@examplemail.com" forKey:@"contact_email"];
[userInfoDict setValue:@"James Robinson" forKey:@"contact_name"];
[userInfoDict setValue:@"+919191919191" forKey:@"contact_mobile"];
[[ZFSurvey sharedInstance] userInfoWithDict:userInfoDict];
Using the Zonka Feedback SDK
The Zonka Feedback SDK enables you to launch targeted in-app surveys with ease. Through the Zonka Feedback web panel, you can create a survey and drop it into any ViewController where you want it to appear.
To display a survey, simply create an instance of ZFSurveyViewController in the desired ViewController where you want the survey to appear.
let surveyViewController = ZFSurveyViewController()
6. Optional Parameters
Using sendDeviceDetails (Optional)
You can enable sendDeviceDetails to automatically include device information with each Zonka Feedback survey response. This will capture details such as operating system, OS version, IP address, and device type. By default, this setting is enabled when you integrate the SDK. On iOS, this is particularly useful because screen sizes and hardware capabilities vary significantly across the iPhone and iPad lineup — filtering responses by device model lets you isolate issues that are hardware-specific rather than universal.
Send Custom Attributes
You can send additional user data with survey responses to add more context. This can include details like screen name, order ID, or transaction ID, helping you track responses more effectively.
How Attributes Enhance Feedback Collection
- Identify respondents (since surveys are anonymous by default).
- Trigger surveys based on specific user actions.
- Filter survey results for deeper analysis and user segmentation.
Swift
import ZonkaFeedback
func openSurvey()
{
let surveyViewController = ZFSurveyViewController()
surveyViewController.sendDeviceDetails = true
let attributesDict = NSMutableDictionary()
attributesDict.setValue("james@examplemail.com", forKey: "contact_email")
attributesDict.setValue("James Robinson", forKey: "contact_name")
attributesDict.setValue("+919191919191", forKey: "contact_mobile")
surveyViewController.sendCustomAttributes = attributesDict
self.view.addSubview(surveyViewController.view)
}
Objective-C
#import <ZonkaFeedback-Swift.h>
-(void)openSurvey
{
ZFSurveyViewController *surveyViewController = [ZFSurveyViewController new];
surveyViewController.sendDeviceDetails = true;
NSMutableDictionary *attributesDict = [[NSMutableDictionary alloc]init];
[attributesDict setValue:@"james@examplemail.com" forKey:@"contact_email"];
[attributesDict setValue:@"James Robinson" forKey:@"contact_name"];
[attributesDict setValue:@"+919191919191" forKey:@"contact_mobile"];
surveyViewController.sendCustomAttributes = attributesDict;
[self.view addSubview:surveyViewController.view];
}
7. Resetting Visitor Data on Logout
Clear user data when a session ends so responses don't get attributed to the wrong account. This step is easy to overlook. On shared devices like enterprise iPads or family-use apps, skipping it means responses from one user get attached to the previous user's account. That's a data quality problem that's easy to prevent and annoying to fix retroactively.
Swift
import ZonkaFeedbackSDK
func logout()
{
ZFSurvey.sharedInstance().clear()
}
Objective-C
#import <ZonkaFeedback-Swift.h>
-(void)logout
{
[[ZFSurvey sharedInstance] clear];
}
After the Integration: What to Do with iOS Feedback Data
The technical setup takes under an hour. What most teams get wrong comes after.
In-App Surveys vs. Push Notifications for Feedback
Push notifications for feedback have a 5–10% tap rate on iOS. Since iOS 14, users can deny the notification permission prompt entirely, which means a meaningful portion of your audience may never see a push-based feedback request at all, regardless of how well you've timed it.
In-app surveys don't have that dependency. They fire inside the active session, with no permission friction, no app-switching, no opt-in required. Push still has a use case: reaching lapsed users you can't catch in-session. But for active users mid-workflow? In-app wins. Every time.
Keep It to One Question
Apple's Human Interface Guidelines are explicit about minimizing interruptions. Not a five-question form in a full modal. A single rating question anchored as a bottom sheet is what users tolerate and respond to.
The teams that see the strongest iOS response rates use one rating question in the moment, with optional open-text follow-up for users who want to say more. Most don't add the follow-up. That's fine. The rating is what you needed anyway.
Our mobile app feedback survey templates are structured around this principle: one primary metric, one optional follow-up, nothing more.
What Response Rates Actually Look Like on iOS
iOS in-app surveys consistently see 20–40% response rates from users who encounter the prompt. Post-session email surveys for the same apps run 8–15%.
Three things move the number:
- Timing: Surveys triggered within 30 seconds of an event outperform those fired at session end
- Question count: One question beats five. Not by a little.
- Placement: Bottom sheet presentations outperform modal overlays on iOS. They feel native. Modals feel forced.
Connecting Feedback to Your Product Workflow
Survey responses sitting in a dashboard don't fix anything. Route them.
Negative ratings should trigger a Jira ticket or a Slack alert automatically. Zonka's integrations handle this without custom code. The iOS-specific metadata the SDK captures automatically (device model, OS version, screen resolution) should feed directly into your product feedback analytics alongside behavioral data. A CSAT drop on iPhone 14 Pro models looks very different once you can see that 60% of affected users also gave a 2/5 on ease of use in the same session.
For the broader framework on building a feedback system that connects to your product process rather than just collecting responses, the product feedback guide covers it in full.
If you're building for multiple platforms, the same integration logic applies. The React Native SDK, Flutter SDK, and Android SDK guides follow the same structure and can be set up in parallel.
Ready to Start Collecting iOS Feedback?
The hard decisions aren't in the code. They're upstream: what to ask, when to ask it, which events are worth triggering on, and what you're going to do when a pattern shows up in the responses.
As iOS 18 tightens permission controls across notification and tracking channels, in-app surveys are becoming one of the few feedback mechanisms that don't require a user opt-in to function. That's not a small thing.
Schedule a demo to walk through how it maps to your app's specific architecture and get started.