Server‑Driven UI on iOS: Who Signs Off on Generated Screens?
AI is finally good enough to design real interfaces, not just answer in chat. But once your iOS app is streaming generated SwiftUI screens into production, a…

Server‑Driven UI on iOS: Who Signs Off on Generated Screens? (Brand, Legal, Security)
AI is finally good enough to design real interfaces, not just answer in chat. But once your iOS app is streaming generated SwiftUI screens into production, a hard question appears:
Who actually signs off on every generated screen?
This article compares two approaches:
- Static, configuration‑driven layouts baked into the client
- Fully server‑driven UI (SDUI), including AI‑orchestrated SwiftUI screens
We’ll look at flexibility, complexity, and how each stacks up for brand, legal, and security review. We’ll also show where Uzori fits as a SwiftUI‑native AI UI layer for iOS.
Related reading: For a concrete, user‑facing example of AI‑driven flows, see our companion guide: “Where did my money go?” — a transaction dispute is a four‑step status answer.
Why sign‑off on generated iOS screens is now a real problem
Two forces collided in the last few years:
- Server‑driven UI became mainstream.
- Shopify moved the Shop app’s Store screen from client‑only layouts to SDUI so they could customize sections per merchant and run experiments without a fixed weekly release cycle.[^shopify]
- Netflix uses SDUI for growth and lifecycle flows on mobile, letting them change UIs without forcing users to update apps.[^netflix]
- DivKit highlights that backend‑described UI can be updated “every hour or more often,” bypassing App Store release cadence.[^divkit]
- Apple tightened policy around dynamic and AI‑driven behavior.
- App Review Guidelines emphasize that apps must not download executable code or change their primary purpose via interpreted content.[^apple-review]
- Apple’s Developer Program License Agreement clarifies that software not embedded in the binary must not expose native platform APIs or technologies without permission.[^apple-dpla]
- From May 1, 2024, newly added listed third‑party SDKs needed privacy manifests, approved reasons for certain APIs, and valid signatures.[^privacy-manifest-news]
- From February 12, 2025, apps submitted for review must include valid privacy manifests for commonly used SDKs.[^privacy-manifest-news]
In other words: generated UI is allowed, but the compliance bar went up. The question is no longer “can we do SDUI?” but “how do brand, legal, and security sign off when the UI can change every hour?”
Static client layouts vs server‑driven UI: what’s actually different?
Static, configuration‑driven layouts baked into the client
Definition:
- All screens are shipped in the binary (SwiftUI or UIKit).
- Remote config only toggles features, copy, or small layout variants.
- No new view types or navigation graphs are delivered post‑release.
Benefits:
- Easy to reason about during App Review.
- Brand/legal review flows are straightforward:
- Designers and PMs review Figma.
- Engineers build and QA.
- Legal/security review a finite set of screens before release.
- No risk of remote content changing the app’s fundamental behavior.
Drawbacks:
- Experimentation speed is bounded by your release cadence.
- Shopify explicitly called this out as a constraint with their weekly releases.[^shopify]
- AI orchestration is limited:
- AI can suggest content, but not compose new flows without shipping new builds.
- Every AI‑driven flow (forms, product explorers, dispute wizards) is hand‑built.
Fully server‑driven UI (SDUI)
Definition:
- The app renders screens described by a backend schema.
- Screens can be updated without a new binary.
- With AI in the loop, the composition of components can be generative.
Benefits:
- Rapid iteration and experimentation.
- Shopify, DivKit, and Netflix all highlight “update without release” as a primary driver.[^shopify][^divkit][^netflix]
- AI can orchestrate multi‑step flows on the fly.
- Different cohorts can see different flows without forks in client code.
Drawbacks:
- Brand, legal, and security sign‑off cannot end at the app release.
- You need:
- Schema constraints (what screens can exist).
- Server‑side validation (reject invalid or risky layouts).
- Audit trails for what was shown to whom and when.
Tools & frameworks for server‑driven UI iOS development
If you’re evaluating server‑driven UI iOS frameworks and tools, these are the main options teams consider.
Comparison table: SDUI tools and approaches
| Tool / Approach | Language / SDK | Schema type | SwiftUI support | Validation / audit features | Best for | |-------------------------|--------------------------|---------------------------------|--------------------------|---------------------------------|----------| | Uzori | iOS SDK (SwiftUI) | Constrained SwiftUI schema JSON | Yes (SwiftUI native) | Server‑side validation; audit‑friendly logs (via your backend) | AI‑orchestrated native flows with strong safety | | DivKit[^divkit] | iOS / Android / Web | JSON‑described components | Indirect (via wrappers) | Backend validation; logging up to you | High‑scale SDUI templates across platforms | | Shopify SDUI[^shopify] | Internal framework | Server‑defined blocks & sections | Not public | Internal tooling and review | Merchant‑specific storefront experimentation | | Custom SDUI stack | Your stack | Your JSON / Protobuf schema | Depends on implementation | Depends on implementation | Teams with strong infra wanting full control |
Where Uzori fits:
- Focused on SwiftUI‑native generative UI for iOS.
- Designed for plug‑in AI assistants that output constrained SwiftUI screens.
- Uses a server‑validated schema so security and legal can reason about the maximum envelope of behavior.
Uzori vs DivKit: side‑by‑side comparison
Many iOS teams evaluating server‑driven UI iOS frameworks end up comparing Uzori vs DivKit. They’re complementary, but they solve different problems.
High‑level differences
- Platform focus
- Uzori: iOS‑first; SwiftUI output only.
- DivKit: cross‑platform (iOS, Android, Web).
- Role of AI
- Uzori: built for AI agents that compose SwiftUI screens from your OpenAPI‑described backend.
- DivKit: model‑agnostic SDUI renderer; AI can drive it, but that’s not inherent.
- Schema & constraints
- Uzori: constrained SwiftUI schema that maps to native controls.
- DivKit: flexible JSON layout language with templates, states, and triggers.[^divkit]
- Compliance posture
- Uzori: assumes server‑side validation and approvals for each generated screen before it hits the client.
- DivKit: validation is up to your backend; DivKit itself doesn’t prescribe a compliance workflow.
Mapping to brand, legal, and security concerns
- Brand
- Uzori: schema can be restricted to your design system components.
- DivKit: similar, but because it’s cross‑platform, your design tokens must be coordinated per platform.
- Legal
- Uzori: designed for AI concierges in sensitive contexts (e.g., financial flows, dispute guidance) where each flow remains within a server‑validated contract.
- DivKit: excellent for marketing/growth flows; for heavy legal scrutiny, you must design your own validation and audit story.
- Security
- Uzori: every screen goes through server‑side validation; LLMs never directly emit arbitrary Swift code.
- DivKit: secure if your server constraints the JSON; not specifically AI‑oriented.
Who signs off on generated screens in a server‑driven world?
1. Brand & UX review
Static client layouts:
- Sign‑off happens at design + pre‑release QA.
- Cross‑functional review is limited to what fits into a release cycle.
Server‑driven UI:
- Brand sign‑off must shift from individual screen review to schema and pattern review.
In practice:
- Designers approve:
- The component library (what’s allowed: cards, lists, forms, carousels).
- Layout rules (spacing, typography tokens, safe combinations).
- AI personas and tone guidelines (what the agent can say and how).
- Brand governance focuses on:
- Design system fidelity: SDUI outputs must use the same components and modifiers.
- Guardrails: e.g., no AI‑generated UI that uses red error patterns for neutral states.
2. Legal & regulatory review
Apple’s App Store Review Guidelines require that apps:
- Don’t change their primary purpose via downloaded or interpreted content.[^apple-review]
- Clearly disclose what data is collected and how it’s used.[^app-privacy]
- Treat third‑party SDKs as first‑class responsibilities: you must know what data they collect and how they use it.[^third-party]
Server‑driven UI by itself isn’t banned. The risk comes from AI‑driven behavior that materially changes what the app does after review or exposes native capabilities without permission.
Legal teams typically sign off on:
- The upper bound of behaviors encoded in the SDUI schema.
- Data flows from client to backend to AI (including LLM vendors).
- The content of App Store privacy disclosures and permissions.
Jurisdiction‑specific considerations
When AI orchestrates UI, you also touch data protection and profiling law in major jurisdictions.
- GDPR / UK GDPR (EU & UK)
- AI‑driven flows that tailor interfaces based on user data may constitute profiling under GDPR Art. 4 and potentially automated decision‑making under Art. 22.
- Requirements:
- Lawful basis (e.g., consent or legitimate interest) for personalization.
- Clear transparency about profiling in your privacy notice.[^gdpr]
- Data minimization and storage limitation.
- CCPA / CPRA (California)
- Dynamic, AI‑driven interfaces may rely on “personal information” as defined by CPRA.
- Users must be informed about categories of data collected and their rights to opt out of certain data uses.[^ccpa]
- EU AI Act (upcoming)
- The AI Act introduces obligations for high‑risk AI systems and transparency requirements for AI‑enabled interactions.
- If your AI assistant influences financial decisions, credit risk, or similar, legal should assume stricter obligations and keep audit trails.
- The exact enforcement dates and obligations vary by article, but you should plan for:
- Model and data documentation.
- Risk management processes.
- Human oversight and clear user communication.[^euai]
How SDUI intersects with these laws:
- Server‑driven UI makes it easier to:
- Implement consistent consent screens and explanatory dialogs across cohorts.
- Correct non‑compliant flows without shipping new binaries.
- But it also increases the need for:
- Centralized governance of what screens can be generated.
- A robust audit trail for each generated screen.
3. Security review
Security teams care about attack surface more than layout aesthetics. With SDUI and AI, their concerns usually cluster around:
- Remote configuration path: Can attackers inject malicious layouts through compromised backends?
- Data access: Do AI‑generated screens surface sensitive data or actions without proper auth/authorization?
- Integrity and provenance: Can you prove what the user saw in case of dispute?
Security sign‑off for SDUI typically includes:
- A schema‑driven contract for all allowed UI components.
- Server‑side validation and signature verification.
- Logging and monitoring of generated screens.
Privacy, ethical AI, and secure AI app architecture for iOS
When using AI UI SDKs on iOS, you need both privacy and ethics front‑of‑mind.
Apple’s privacy model: disclosure‑first
Apple’s App Store privacy details emphasize:
- Users should understand what data is collected before download.[^app-privacy]
- Developers are responsible for keeping privacy answers accurate and up to date.
- Third‑party SDKs (including AI SDKs) require privacy manifests and signatures for certain APIs.[^privacy-manifest-news][^third-party]
Best practices for ethical, secure AI interfaces on iOS
- Minimize PII sent to models
- Send tokens or IDs, not raw names, emails, or full card numbers.
- Use server‑side joins to enrich data rather than sending everything to the model.
- Consent and transparency flows
- Show a short explanation when AI is used:
- What the AI does.
- Which data categories it accesses.
- Provide clear opt‑out options where required (especially under GDPR/CCPA).
- Show a short explanation when AI is used:
- Privacy manifests and SDK disclosure
- Ensure your AI SDKs declare:
- Data collection types.
- Network endpoints.
- Keep App Store privacy labels consistent with SDK behavior.[^app-privacy][^third-party]
- Ensure your AI SDKs declare:
- Model provenance and versioning
- Track which model version handled each request.
- Use this in your audit logs to investigate incidents.
- Secure AI interface architecture
- Keep AI as an orchestrator, not a superuser:
- AI composes UI and calls server‑exposed APIs.
- The server enforces authorization and rate limits.
- Avoid giving AI direct access to sensitive debug or admin endpoints.
- Keep AI as an orchestrator, not a superuser:
Uzori’s approach aligns with this:
- AI produces structured SwiftUI screen descriptions, not arbitrary code.
- Your backend validates every layout against a constrained schema.
- You choose how much user data is visible to the model and log what gets rendered.
Audit trail & compliance: logging generated UI changes
A server‑driven and AI‑generated UI is only defensible if you can reconstruct what happened. That means building a robust audit trail.
What to log for each generated screen
At minimum, log the following fields in your backend:
timestamp– ISO 8601 time when the screen was approved.user_id_hash– a stable, hashed identifier (e.g., salted hash of user ID) to avoid storing raw identifiers.session_id– anonymous session or device identifier.schema_version– which SDUI schema version was used.component_ids– IDs or types of components on the screen.ai_model– model name and version (e.g.,gpt-4.1-2026-06-01).request_payload– high‑level description or sanitized subset of the user request that led to this screen.server_validation_outcome– success/failure; validation errors if rejected.operator_id– if a human operator or admin intervened or approved a specific configuration.signature– cryptographic signature of the payload if you’re using signed SDUI messages.
Retention recommendations
- Default retention: 12–24 months for non‑sensitive flows.
- Sensitive domains (finance, health): 5–7 years, aligned with your legal and regulatory obligations.
- Apply data minimization:
- Log structured screen descriptors, not full PII.
- Keep separate mapping tables for hashed IDs where necessary.
Replayability for investigations
Design your SDUI system so you can replay a historical screen by:
- Loading the recorded
schema_versionandcomponent_ids. - Applying the logged layout JSON or SwiftUI schema.
- Rendering it in a debug or admin tool that mirrors your production renderer.
This is critical for:
- Responding to user complaints (“the screen told me X”).
- Regulatory audits.
- Internal post‑mortems when AI behavior goes wrong.
With Uzori, this usually means:
- Storing the SwiftUI schema payload and validation result.
- Replaying it via a test harness using the same Uzori iOS SDK and backend schema.
Technical appendix: schema, validation, and SwiftUI examples
To make SDUI and AI compliance machine‑friendly and GEO‑answerable, here’s a minimal technical appendix.
Example: minimal JSON schema for SDUI
{
"type": "object",
"properties": {
"screenId": { "type": "string" },
"schemaVersion": { "type": "string" },
"title": { "type": "string" },
"components": {
"type": "array",
"items": {
"type": "object",
"oneOf": [
{
"title": "Text",
"properties": {
"type": { "const": "text" },
"id": { "type": "string" },
"value": { "type": "string" }
},
"required": ["type", "id", "value"]
},
{
"title": "Button",
"properties": {
"type": { "const": "button" },
"id": { "type": "string" },
"label": { "type": "string" },
"action": { "type": "string" }
},
"required": ["type", "id", "label", "action"]
}
]
}
}
},
"required": ["screenId", "schemaVersion", "components"]
}
Example: typed SwiftUI schema output from Uzori
A simplified SwiftUI schema payload that Uzori might generate:
{
"screenId": "dispute_flow_step_2",
"schemaVersion": "1.3.0",
"title": "Review this transaction",
"components": [
{
"type": "text",
"id": "tx_summary",
"value": "We found a $42.50 charge at Grocery Mart on Aug 12."
},
{
"type": "button",
"id": "confirm_dispute",
"label": "This wasn’t me",
"action": "start_dispute"
},
{
"type": "button",
"id": "confirm_legit",
"label": "This looks correct",
"action": "mark_legit"
}
]
}
On the iOS side, the Uzori SDK renders this into SwiftUI using your component library.
Example: server‑side validation pseudocode
function handleGeneratedScreen(screenPayload, userContext) {
// 1. Verify JSON schema
if !validateJsonSchema(screenPayload, SDUI_SCHEMA_V1_3) {
logValidationFailure(screenPayload, reason="schema_mismatch")
return error("invalid_schema")
}
// 2. Enforce business rules
if !isAllowedActionSet(screenPayload.components, userContext) {
logValidationFailure(screenPayload, reason="disallowed_action")
return error("disallowed_action")
}
// 3. Sign payload
signature = signPayload(screenPayload, SERVER_SIGNING_KEY)
// 4. Log audit record
logGeneratedScreen({
timestamp: now(),
user_id_hash: hashUserId(userContext.userId),
session_id: userContext.sessionId,
schema_version: screenPayload.schemaVersion,
component_ids: extractComponentIds(screenPayload.components),
ai_model: userContext.aiModelName,
request_payload: sanitize(userContext.request),
server_validation_outcome: "ok",
operator_id: null,
signature: signature
})
// 5. Return to client
return {
payload: screenPayload,
signature: signature
}
}
This pattern works for both pure SDUI and AI‑orchestrated generative UI.
Recommendations by use case
If you ship mostly static flows and compliance is strict:
- Prefer client‑baked layouts with light config.
- Use SDUI only where you can tightly bound behavior.
If you need rapid experimentation and AI concierges:
- Adopt server‑driven UI with a constrained schema.
- Add server‑side validation, logging, and replay tooling from day one.
- Use a SwiftUI‑native AI UI framework like Uzori when you want AI‑composed flows but must keep everything native and safe.
If you’re already using DivKit or custom SDUI:
- Layer in AI gently:
- Start with a single feature (e.g., an AI‑guided setup or dispute flow).
- Treat AI as a planner that still respects your SDUI contract.
FAQ: server‑driven UI and generated screen approvals on iOS
Who is ultimately responsible for generated screens in an iOS app?
Your team is. Apple reviews the app binary and behavior at submission time,[^apple-review] but developers are responsible for all code and dynamic content, including third‑party SDKs and AI outputs.[^third-party] That means brand, legal, and security must align on the SDUI schema, validation, and audit trail.
Is server‑driven UI allowed under Apple’s App Store Review Guidelines?
Yes. Many large apps (Shopify Shop, Netflix) rely on server‑driven UI.[^shopify][^netflix] The key constraints are:
- Don’t fundamentally change the app’s purpose via remote content.[^apple-review]
- Don’t expose new native capabilities not described at review.
- Don’t download or execute arbitrary code.[^apple-dpla]
Server‑driven layouts that remain within a reviewed schema and purpose are generally acceptable.
How do I keep AI‑generated UI compliant with GDPR and CCPA/CPRA?
- Treat AI personalization as profiling and document it in your privacy notice.[^gdpr]
- Provide clear transparency and, where required, opt‑out mechanisms.[^ccpa]
- Log decisions and screen variants for accountability.
- Minimize PII sent to AI models and ensure data processing agreements with providers.
What makes Uzori different from other AI UI tools on iOS?
- SwiftUI‑native output instead of web views or generic markup.
- Constrained, server‑validated schema designed with App Store and legal review in mind.
- Real‑time streaming of AI‑composed SwiftUI screens that feel like the rest of your app.
- Focus on AI concierges and task‑specific flows rather than generic chat.
How do we start with server‑driven UI without disrupting existing flows?
- Begin with a single screen (e.g., an AI assistant entry‑point) behind a feature flag.
- Use SDUI only for that path; keep the rest of the app static.
- Add logging and replay from day one.
- Gradually expand once brand, legal, and security are comfortable with the controls.
The next generation of iOS apps will be AI‑native and interface‑driven. The teams that win will let AI build the UI—while keeping structure, safety, and native quality firmly under their control.
[^shopify]: Shopify, “Server-driven UI in Shop app”, Shopify Engineering (accessed 2026), describing their move to SDUI and constraints of a weekly release cadence. [^divkit]: DivKit documentation, “Server-driven UI”, divkit.tech (accessed 2026), noting backend-described UI updates can occur “every hour or more often”. [^netflix]: Netflix talk, “Server-Driven UI: Mobile and Beyond”, QCon London 2024 (accessed 2026), describing SDUI usage on mobile growth flows. [^apple-review]: Apple, App Store Review Guidelines, developer.apple.com (accessed 2026), sections on dynamically updated content and functionality. [^apple-dpla]: Apple, Apple Developer Program License Agreement, developer.apple.com (accessed 2026), clauses on interpreted code and software not embedded in the binary. [^app-privacy]: Apple, “App privacy details on the App Store”, developer.apple.com (accessed 2026), describing disclosure obligations. [^third-party]: Apple, “Requirements for using third-party SDKs”, developer.apple.com (accessed 2026), stating developers are responsible for SDK behavior. [^privacy-manifest-news]: Apple, “Upcoming third-party SDK requirements”, developer.apple.com/news/?id=pvszzano (accessed 2026), describing privacy manifest and signature enforcement dates. [^gdpr]: General Data Protection Regulation (EU) 2016/679, official text via eur-lex.europa.eu (accessed 2026), especially Articles 4, 13–14, 22. [^ccpa]: California Consumer Privacy Act and California Privacy Rights Act, official text via oag.ca.gov/privacy or cppa.ca.gov (accessed 2026). [^euai]: European Union AI Act, final text as published in the Official Journal of the European Union (accessed 2026).