Your SDK key is shown when you create the app, and can be rotated in the dashboard under
Settings → SDK key. It is a public client key: it ships inside your app.
import TrueOrigin// as early as possible, e.g. in application(_:didFinishLaunchingWithOptions:)TrueOrigin.configure(apiKey: "to_…")
Only the first call counts. On the first launch after install the SDK reports the install,
then waits for the result. If the device is offline, it retries with exponential backoff
for up to six hours, across launches.Next: read the attribution in your app, and track events.
With Universal Links, a tap on your tracking link opens your app directly when it is
already installed. Without the app, the tap goes to the App Store as usual.
In the dashboard, Settings → App: enter your Bundle ID and Apple Team ID.
In Xcode, Signing & Capabilities → Associated Domains: add
applinks:appdownload.link.
Apple caches the association file. Save the Bundle ID and Team ID before you ship the
build that adds the associated domain.
Your app then receives only its own links: its ad link, appdownload.link/{app}, and
the links with a path under it.
The SDK does not read the IDFA or the IDFV. Its only identifier is a random install id
that lives in the app’s UserDefaults and is removed with the app. Tracked events
wait in a file in the app’s Application Support folder until they are sent. The privacy manifest
(PrivacyInfo.xcprivacy) ships inside the framework: no tracking, no tracking domains,
and the required-reason APIs it uses (UserDefaults CA92.1, file timestamps C617.1).What your app declares in its App Store privacy label is your decision. What the SDK
sends is listed in our privacy policy. The manifest
declares no collected data: events carry only what your app passes to track, so
whether they are purchase history or product interaction in the label is yours to say.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"TrueOrigin","description":"Web-to-app install attribution for iOS and Android: see which ad brought each install, trial and purchase, and send them back to Meta and TikTok.","colors":{"primary":"#00c3c9","light":"#37ded5","dark":"#00868a"},"logo":{"light":"https://mintcdn.com/true-origin/OdufS3q3vsN_VSDb/logo/light.svg?fit=max\u0026auto=format\u0026n=OdufS3q3vsN_VSDb\u0026q=85\u0026s=ce788df97f927b7815709eaffc08fbcf","dark":"https://mintcdn.com/true-origin/OdufS3q3vsN_VSDb/logo/dark.svg?fit=max\u0026auto=format\u0026n=OdufS3q3vsN_VSDb\u0026q=85\u0026s=94b4959352e1da9e20a09497d8fdce9d","href":"https://trueorigin.dev"},"favicon":"https://mintcdn.com/true-origin/OdufS3q3vsN_VSDb/favicon.svg?fit=max\u0026auto=format\u0026n=OdufS3q3vsN_VSDb\u0026q=85\u0026s=656ffb5f23fa8d1053ffa2c8da255bba","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://cal.com/timok/trueorigin-onboarding","label":"Book a call"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.trueorigin.dev"}},"footer":{"socials":{"github":"https://github.com/trueorigin-dev"}},"seo":{"metatags":{"og:site_name":"TrueOrigin Docs"}},"fonts":{"family":"Geist"},"integrations":{"telemetry":{"enabled":false}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"true-origin","hasAudioNarration":false,"actualSubdomain":"true-origin","customDomains":["docs.trueorigin.dev"],"gitSource":{"type":"github","owner":"koehler-international","repo":"trueorigin","deployBranch":"main","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6ac40a3c0675e4758b564a5c","clientVersion":"0.0.4124","searchFilterCounts":[{"language":"default","tag":"SDK","count":6},{"language":"default","tag":"Campaigns","count":4},{"language":"default","tag":"Get started","count":2},{"language":"default","tag":"Help","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"sdk/ios","slug":"/sdk/ios","pageMetadata":{"title":"iOS SDK","description":"Add TrueOrigin to a native iOS app with Swift Package Manager.","href":"/sdk/ios"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Add TrueOrigin to a native iOS app with Swift Package Manager.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Requirements: iOS 15 or later, Xcode 16 or later. For React Native and Expo, use\n`,_jsx(_components.a,{href:`/sdk/react-native`,children:_jsx(_components.code,{children:`@trueorigin/react-native`})}),` instead.`]}),`\n`,_jsx(Heading,{level:`2`,id:`install`,children:`Install`}),`\n`,_jsxs(_components.p,{children:[`In Xcode: `,_jsx(_components.strong,{children:`File → Add Package Dependencies…`}),`, enter`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`https://github.com/trueorigin-dev/trueorigin-ios`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`and choose `,_jsx(_components.strong,{children:`Up to Next Major Version`}),` from the latest release. Or in `,_jsx(_components.code,{children:`Package.swift`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`package`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://github.com/trueorigin-dev/trueorigin-ios\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"0.1.0\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The package is a binary, `,_jsx(_components.code,{children:`TrueOrigin.xcframework`}),`. SwiftPM checks every download against\nthe checksum in `,_jsx(_components.code,{children:`Package.swift`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`configure`,children:`Configure`}),`\n`,_jsxs(_components.p,{children:[`Your SDK key is shown when you create the app, and can be rotated in the dashboard under\n`,_jsx(_components.strong,{children:`Settings → SDK key`}),`. It is a public client key: it ships inside your app.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` TrueOrigin`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// as early as possible, e.g. in application(_:didFinishLaunchingWithOptions:)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`TrueOrigin.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`configure`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`apiKey`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"to_…\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Only the first call counts. On the first launch after install the SDK reports the install,\nthen waits for the result. If the device is offline, it retries with exponential backoff\nfor up to six hours, across launches.`}),`\n`,_jsxs(_components.p,{children:[`Next: `,_jsx(_components.a,{href:`/sdk/attribution`,children:`read the attribution`}),` in your app, and `,_jsx(_components.a,{href:`/sdk/events`,children:`track events`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`options`,children:`Options`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`var`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` options `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` TrueOrigin.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Options`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`options.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`logging`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` true`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`TrueOrigin.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`configure`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`apiKey`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"to_…\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`options`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: options)`})]}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Option`}),_jsx(_components.th,{children:`Default`}),_jsx(_components.th,{})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`logging`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`false`})}),_jsxs(_components.td,{children:[`Log to the unified logging system, subsystem `,_jsx(_components.code,{children:`dev.trueorigin.sdk`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reportTimeout`})}),_jsx(_components.td,{children:`6 hours`}),_jsxs(_components.td,{children:[`How long to keep retrying the first report before the status becomes `,_jsx(_components.code,{children:`failed`}),`.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`TrueOrigin.installId`}),` is the SDK’s id for this install. It stays the same until the app\nis deleted; a reinstall gets a new one.`]}),`\n`,_jsx(Heading,{level:`2`,id:`universal-links`,children:`Universal Links`}),`\n`,_jsx(_components.p,{children:`With Universal Links, a tap on your tracking link opens your app directly when it is\nalready installed. Without the app, the tap goes to the App Store as usual.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`In the dashboard, `,_jsx(_components.strong,{children:`Settings → App`}),`: enter your `,_jsx(_components.strong,{children:`Bundle ID`}),` and `,_jsx(_components.strong,{children:`Apple Team ID`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`In Xcode, `,_jsx(_components.strong,{children:`Signing \u0026 Capabilities → Associated Domains`}),`: add\n`,_jsx(_components.code,{children:`applinks:appdownload.link`}),`.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Apple caches the association file. Save the Bundle ID and Team ID before you ship the\nbuild that adds the associated domain.`})}),`\n`,_jsxs(_components.p,{children:[`Your app then receives only its own links: its ad link, `,_jsx(_components.code,{children:`appdownload.link/{app}`}),`, and\nthe links with a path under it.`]}),`\n`,_jsx(Heading,{level:`2`,id:`privacy`,children:`Privacy`}),`\n`,_jsxs(_components.p,{children:[`The SDK does not read the IDFA or the IDFV. Its only identifier is a random install id\nthat lives in the app’s UserDefaults and is removed with the app. `,_jsx(_components.a,{href:`/sdk/events`,children:`Tracked events`}),`\nwait in a file in the app’s Application Support folder until they are sent. The privacy manifest\n(`,_jsx(_components.code,{children:`PrivacyInfo.xcprivacy`}),`) ships inside the framework: no tracking, no tracking domains,\nand the required-reason APIs it uses (UserDefaults `,_jsx(_components.code,{children:`CA92.1`}),`, file timestamps `,_jsx(_components.code,{children:`C617.1`}),`).`]}),`\n`,_jsxs(_components.p,{children:[`What your app declares in its App Store privacy label is your decision. What the SDK\nsends is listed in our `,_jsx(_components.a,{href:`https://trueorigin.dev/privacy`,children:`privacy policy`}),`. The manifest\ndeclares no collected data: events carry only what your app passes to `,_jsx(_components.code,{children:`track`}),`, so\nwhether they are purchase history or product interaction in the label is yours to say.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"iOS SDK","description":"Add TrueOrigin to a native iOS app with Swift Package Manager.","href":"/sdk/ios"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Install","slug":"install","depth":2,"children":[]},{"title":"Configure","slug":"configure","depth":2,"children":[{"title":"Options","slug":"options","depth":3,"children":[]}]},{"title":"Universal Links","slug":"universal-links","depth":2,"children":[]},{"title":"Privacy","slug":"privacy","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"true-origin","siteName":"TrueOrigin","title":"iOS SDK - TrueOrigin","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-30T19:09:46.882Z","originalFileLocation":"sdk/ios.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Add TrueOrigin to a native iOS app with Swift Package Manager.\">\u003cmeta data-mint-head name=\"application-name\" content=\"TrueOrigin\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"iOS SDK - TrueOrigin\">\u003cmeta data-mint-head property=\"og:description\" content=\"Add TrueOrigin to a native iOS app with Swift Package Manager.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TrueOrigin Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.trueorigin.dev/sdk/ios\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://true-origin.mintlify.site/_mintlify/api/og/v2?division=SDK\u0026amp;title=iOS+SDK\u0026amp;description=Add+TrueOrigin+to+a+native+iOS+app+with+Swift+Package+Manager.\u0026amp;theme=22e4ba202aec4f05f9d7a53a\u0026amp;signature=b20d28e802f7bd42777070b3eb72bcb56ecddddef7b67fd2fc36345fb1e762f6\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"iOS SDK - TrueOrigin\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Add TrueOrigin to a native iOS app with Swift Package Manager.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://true-origin.mintlify.site/_mintlify/api/og/v2?division=SDK\u0026amp;title=iOS+SDK\u0026amp;description=Add+TrueOrigin+to+a+native+iOS+app+with+Swift+Package+Manager.\u0026amp;theme=22e4ba202aec4f05f9d7a53a\u0026amp;signature=b20d28e802f7bd42777070b3eb72bcb56ecddddef7b67fd2fc36345fb1e762f6\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/true-origin/eQdBsyUIVcwH4y1S/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TrueOrigin\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#00c3c9\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.trueorigin.dev/sdk/ios\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/sdk/ios.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.trueorigin.dev/#organization\",\"name\":\"TrueOrigin\",\"url\":\"https://docs.trueorigin.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/true-origin/OdufS3q3vsN_VSDb/logo/light.svg?fit=max\u0026auto=format\u0026n=OdufS3q3vsN_VSDb\u0026q=85\u0026s=ce788df97f927b7815709eaffc08fbcf\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.trueorigin.dev#website\",\"name\":\"TrueOrigin\",\"url\":\"https://docs.trueorigin.dev\",\"publisher\":{\"@id\":\"https://docs.trueorigin.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.trueorigin.dev/sdk/ios#webpage\",\"url\":\"https://docs.trueorigin.dev/sdk/ios\",\"name\":\"iOS SDK\",\"description\":\"Add TrueOrigin to a native iOS app with Swift Package Manager.\",\"dateModified\":\"2026-09-30T19:09:46.882Z\",\"isPartOf\":{\"@id\":\"https://docs.trueorigin.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.trueorigin.dev/sdk/ios#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.trueorigin.dev/sdk/ios#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"TrueOrigin\",\"item\":\"https://docs.trueorigin.dev\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"iOS SDK\",\"item\":\"https://docs.trueorigin.dev/sdk/ios\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.trueorigin.dev/sdk/ios#article\",\"headline\":\"iOS SDK\",\"name\":\"iOS SDK\",\"description\":\"Add TrueOrigin to a native iOS app with Swift Package Manager.\",\"url\":\"https://docs.trueorigin.dev/sdk/ios\",\"mainEntityOfPage\":{\"@id\":\"https://docs.trueorigin.dev/sdk/ios#webpage\"},\"dateModified\":\"2026-09-30T19:09:46.882Z\",\"publisher\":{\"@id\":\"https://docs.trueorigin.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.trueorigin.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TrueOrigin\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"TrueOrigin\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/sdk/ios.md","siteName":"TrueOrigin","nav":{"global":null,"groups":[{"group":"Get started","pages":[{"title":"Introduction","href":"/index"},{"title":"Quickstart","description":"From sign-up to your first matched install in about fifteen minutes.","href":"/quickstart"}]},{"group":"SDK","pages":[{"title":"iOS SDK","href":"/sdk/ios"},{"title":"Android SDK","description":"Add TrueOrigin to a native Android app from Maven Central.","href":"/sdk/android"},{"title":"React Native","href":"/sdk/react-native"},{"title":"Reading the attribution","href":"/sdk/attribution"},{"title":"Tracking events","href":"/sdk/events"},{"title":"Google Play Data safety","href":"/sdk/data-safety"}]},{"group":"Campaigns","pages":[{"title":"Tracking links","href":"/tracking-links"},{"title":"RevenueCat","href":"/revenuecat"},{"title":"Postbacks to Meta and TikTok","href":"/postbacks"},{"title":"Ad spend","href":"/ad-spend"}]},{"group":"Help","pages":[{"title":"Troubleshooting","href":"/troubleshooting"}]}]},"basePath":"","title":"iOS SDK - TrueOrigin","buildId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","deploymentId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","dynamics":[],"chunks":[]}