This is the official documentation for the Amplitude Analytics iOS SDK.
https://github.com/amplitude/Amplitude-Swift in the search bar.Add the dependency to your Podfile:
pod 'AmplitudeSwift', '~> 1.0'
Run pod install in the project directory.
Cartfile.
github "amplitude/Amplitude-Swift" ~> 1.0
Go to the Carthage docs for more info.
You must initialize the SDK before you can instrument. The API key for your Amplitude project is required.
let amplitude = Amplitude(configuration: Configuration(
apiKey: AMPLITUDE_API_KEY,
autocapture: .all
))
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:AMPLITUDE_API_KEY];
configuration.autocapture = AMPAutocaptureOptions.all;
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
Configuration options
Name
Description
Default Value
apiKeyThe apiKey of your project.
nil
instanceNameThe name of the instance. Instances with the same name will share storage and identity. For isolated storage and identity use a unique
instanceName for each instance."default_instance"
storageProviderImplements a custom
storageProvider class from Storage. Not supported in Objective-C.PersistentStorage
logLevelThe log level enums:
LogLevelEnum.OFF, LogLevelEnum.ERROR, LogLevelEnum.WARN, LogLevelEnum.LOG, LogLevelEnum.DEBUGLogLevelEnum.WARN
loggerProviderImplements a custom
loggerProvider class from the Logger, and pass it in the configuration during the initialization to help with collecting any error messages from the SDK in a production environment.ConsoleLogger
flushIntervalMillisThe amount of time SDK will attempt to upload the unsent events to the server or reach
flushQueueSize threshold.30000
flushQueueSizeSDK will attempt to upload once unsent event count exceeds the event upload threshold or reach
flushIntervalMillis interval.30
flushMaxRetriesMaximum retry times.
6
minIdLengthThe minimum length for user id or device id.
5
partnerIdThe partner id for partner integration.
nil
identifyBatchIntervalMillisThe amount of time SDK will attempt to batch intercepted identify events.
30000
flushEventsOnCloseFlushing of unsent events on app close.
true
callbackCallback function after event sent.
nil
optOutOpt the user out of tracking.
false
(Deprecated. Use defaultTrackingautocapture instead.)Enable tracking of default events for sessions, app lifecycles, screen views, and deep links.
DefaultTrackingOptions(sessions: true)
autocaptureEnable tracking of Autocapture events for sessions, app lifecycles, screen views, deep links, network requests, and element interactions.
AutocaptureOptions.sessions
enableAutoCaptureRemoteConfigEnable remote configuration for autocapture settings. When enabled, Autocapture settings are updateable remotely after initialization.
true
minTimeBetweenSessionsMillisThe amount of time for session timeout.
300000
serverUrlThe server url events upload to.
https://api2.amplitude.com/2/httpapi
serverZoneThe server zone to send to, will adjust server url based on this config.
US
useBatchWhether to use batch api.
false
trackingOptionsOptions to control the values tracked in SDK.
enable
enableCoppaControlWhether to enable COPPA control for tracking options.
false
migrateLegacyDataAvailable in
0.4.7+. Whether to migrate maintenance SDK data (events, user/device ID).true
offlineAvailable in
1.2.0+. Whether the SDK is connected to network. Learn more here.false
maxQueuedEventCountAvailable in
1.9.1+. Maximum number of events to retain in storage. When set to a positive number, the SDK removes oldest events at startup to maintain this limit. When set to -1, no cleanup occurs.-1
networkTrackingOptionsAvailable in
1.12.0+. Options to control the network tracking.NetworkTrackingOptions.default
interactionsOptionsAvailable in
1.15.0+. Options to control the interaction tracking.InteractionsOptions.default
Events represent how users interact with your application. For example, "Button Clicked" may be an action you want to note.
let event = BaseEvent(
eventType: "Button Clicked",
eventProperties: ["my event prop key": "my event prop value"]
)
amplitude.track(event: event)
AMPBaseEvent *event = [AMPBaseEvent initWithEventType:@"Button Clicked"
eventProperties:@{@"my event prop key": @"my event prop value"}];
[amplitude track:event];
Another way to instrument basic tracking event.
amplitude.track(
eventType: "Button Clicked",
eventProperties: ["my event prop key": "my event prop value"]
)
[amplitude track:@"Button Clicked" eventProperties:@{
@"my event prop key": @"my event prop value"
}];
identifyBatchIntervalMillis for managing the interval to flush the batched identify intercepts.Identify is for setting the user properties of a particular user without sending any event. The SDK supports the operations set, setOnce, unset, add, append, prepend, preInsert, postInsert, and remove on individual user properties. Declare the operations via a provided Identify interface. You can chain together multiple operations in a single Identify object. The Identify object is then passed to the Amplitude client to send to the server.
You can handle the identity of a user using the identify methods. Proper use of these methods can connect events to the correct user as they move across devices, browsers, and other platforms. Send an identify call containing those user property operations to Amplitude server to tie a user's events with specific user properties.
let identify = Identify()
identify.set(property: "color", value: "green")
amplitude.identify(identify: identify)
AMPIdentify *identify = [AMPIdentify new];
[identify set:@"color" value:@"green"];
[amplitude identify:identify];
Starting from release v1.8.0, the SDK is able to track more events without manual instrumentation. It can be configured to track the following events automatically:
Autocapture options
Name
Type
Enabled by default
Description
sessionsAutocaptureOptionsYes
Enables session tracking. If the option is set, Amplitude tracks session start and session end events otherwise, Amplitude doesn't track session events. When this setting isn't set, Amplitude tracks
sessionId only. See Track sessions for more information.
appLifecyclesAutocaptureOptionsNo
Enables application lifecycle events tracking. If the option is set, Amplitude tracks application installed, application updated, application opened, and application backgrounded events. Event properties tracked include:
[Amplitude] Version, [Amplitude] Build, [Amplitude] Previous Version, [Amplitude] Previous Build, [Amplitude] From Background. See Track application lifecycles for more information.
screenViewsAutocaptureOptionsNo
Enables screen views tracking. If the option is set, Amplitude tracks screen viewed events. Event properties tracked include:
[Amplitude] Screen Name. See Track screen views for more information.
elementInteractionsAutocaptureOptionsNo
Enables element interaction tracking. If the option is set, Amplitude tracks user interactions with
UIControl element and UIGestureRecognizer. Event properties tracked include: [Amplitude] Action, [Amplitude] Target View Class, [Amplitude] Target Text, [Amplitude] Action Method, [Amplitude] Gesture Recognizer, [Amplitude] Hierarchy, [Amplitude] Accessibility Identifier, [Amplitude] Accessibility Label, [Amplitude] Screen Name. See Track element interactions for more information.
networkTrackingAutocaptureOptionsNo
Enables network tracking. If the option is set, Amplitude tracks network requests. Event properties tracked include:
[Amplitude] URL, [Amplitude] URL Query, [Amplitude] URL Fragment, [Amplitude] Request Method, [Amplitude] Status Code, [Amplitude] Error Code, [Amplitude] Error Message, [Amplitude] Start Time, [Amplitude] End Time, [Amplitude] Duration, [Amplitude] Request Body Size, [Amplitude] Response Body Size. See Track network requests for more information.
frustrationInteractionsAutocaptureOptionsNo
Available in
1.15.0+. Enables frustration interaction tracking. If the option is set, Amplitude tracks frustration interactions (Rage Clicks and Dead Clicks) with UIControl element and UIGestureRecognizer. Rage Clicks generate the [Amplitude] Rage Click event and Dead Clicks generate the [Amplitude] Dead Click event. Go to Track frustration interactions for more information.
You can configure Amplitude to start tracking Autocapture events. Otherwise, you can omit the configuration to keep only session tracking enabled.
autocapture configuration accepts an OptionSet with AutocaptureOptions values.
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: [.sessions, .appLifecycles, .screenViews, .networkTracking]
))
By default, if the autocapture configuration isn't explicitly set during Configuration initialization, configuration.autocapture will automatically include AutocaptureOptions.sessions.
If you want to prevent automatic session events capture, set autocapture without the AutocaptureOptions.sessions option.
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .appLifecycles // or use `[]` to disable Autocapture.
))
autocapture configuration accepts an Array of AutocaptureOptions values.
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[
AMPAutocaptureOptions.sessions,
AMPAutocaptureOptions.appLifecycles,
AMPAutocaptureOptions.screenViews,
AMPAutocaptureOptions.networkTracking
]];
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
By default, if the autocapture configuration isn't explicitly set during Configuration initialization, configuration.autocapture will automatically include AutocaptureOptions.sessions.
If you want to prevent automatic session events capture, set autocapture without the AutocaptureOptions.sessions option.
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[AMPAutocaptureOptions.appLifecycles]]; // or use an empty array to disable Autocapture.
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
Starting from release v1.10.0, the SDK supports remote configuration for autocapture settings. This feature allows you to update autocapture settings after initialization without requiring an app update.
By default, remote configuration for autocapture is enabled. You can disable it by setting enableAutoCaptureRemoteConfig to false in the configuration:
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: [.sessions, .appLifecycles, .screenViews],
enableAutoCaptureRemoteConfig: false
))
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[
AMPAutocaptureOptions.sessions,
AMPAutocaptureOptions.appLifecycles,
AMPAutocaptureOptions.screenViews
]];
configuration.enableAutoCaptureRemoteConfig = NO;
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
When you enable remote configuration, the SDK checks for updates to Autocapture settings in your project. If updates are available, the SDK applies them automatically. This allows you to:
Changes made through remote configuration affect future events and don't apply to events that are already tracked.
Amplitude enables session tracking by default. Include AutocaptureOptions.sessions in the autocapture configuration to explicitly configure the SDK to track session events or to enable session event tracking along with other Autocapture configurations.
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .sessions
))
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[AMPAutocaptureOptions.sessions]];
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
For more information about session tracking, see User sessions.
trackingSessionEvents is deprecated and replaced with the AutocaptureOptions.sessions option of the autocapture configuration.You can enable Amplitude to start tracking application lifecycle events by including AutocaptureOptions.appLifecycles in the autocapture configuration.
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .appLifecycles
))
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[AMPAutocaptureOptions.appLifecycles]];
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
When you enable this setting, Amplitude tracks the following events:
[Amplitude] Application Installed, this event fires when a user opens the application for the first time right after installation, by observing the UIApplicationDidFinishLaunchingNotification notification underneath.[Amplitude] Application Updated, this event fires when a user opens the application after updating the application, by observing the UIApplicationDidFinishLaunchingNotification notification underneath.[Amplitude] Application Opened, this event fires when a user launches or foregrounds the application after the first open, by observing the UIApplicationDidFinishLaunchingNotification or UIApplicationWillEnterForegroundNotification notification underneath.[Amplitude] Application Backgrounded, this event fires when a user backgrounds the application, by observing the UIApplicationDidEnterBackgroundNotification notification underneath.You can enable Amplitude to start tracking screen view events by including AutocaptureOptions.screenViews in the autocapture configuration.
// UIKit
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .screenViews
))
// Swift UI
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: []
))
amplitude.track(ScreenViewedEvent(screenName: "Screen Name"))
// UIKit
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[AMPAutocaptureOptions.screenViews]];
Amplitude *amplitude = [Amplitude initWithConfiguration:screenViews];
// Swift UI
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[]];
[amplitude track:[AMPScreenViewedEvent initWithScreenName:@"Screen Name"]];
When you enable this setting, Amplitude tracks the [Amplitude] Screen Viewed event and sets the screen name property of this event to the name of the top-most view controller's class. Amplitude reads this value from the controller class metadata viewDidAppear method swizzling.
You can enable Amplitude to start tracking network requests by including AutocaptureOptions.networkTracking in the autocapture configuration.
URLConnection or on watchOS and iOS 13.
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .networkTracking
))
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[AMPAutocaptureOptions.networkTracking]];
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
With the default configuration, the SDK tracks network requests from all hosts (except *.amplitude.com) with status code 500 to 599. To customize the tracking behavior, set Configuration.networkTrackingOptions with NetworkTrackingOptions.
NetworkTrackingOptions
Name
Description
Default Value
captureRulesThe rules for capturing network requests. You should always append rules with specific hosts to the bottom of the list.
none
ignoreHostsThe hosts to ignore. Supports wildcard characters
*. eg. ["*"] to ignore all hosts, ["*.notmyapi.com", "notmyapi.com"] to ignore notmyapi.com and all subdomains.[]
ignoreAmplitudeRequestsWhether to ignore Amplitude requests.
true
NetworkTrackingOptions.CaptureRule
Name
Description
Default Value
hostsThe hosts to capture. Supports wildcard characters
*. eg. ["*"] to match all hosts, ["*.example.com", "example.com"] to match example.com and all subdomains.none
urlsExperimental Available in
1.15.0+. The URLs to capture. Supports exact match and regex pattern. Includes query parameters and fragment identifier. eg. URLPattern.exact("https://example.com/api/status") to match https://example.com/api/status, URLPattern.regex("https://example.com/api/.*") to match https://example.com/api/status and https://example.com/api/error.none
statusCodeRangeThe status code range to capture. Supports comma-separated ranges or single status codes. eg.
"0,200-299,413,500-599""500-599"
methodsExperimental Available in
1.15.0+. The HTTP methods to capture. * to match all methods. eg. ["POST", "PUT", "DELETE"]["*"]
requestHeadersExperimental Available in
1.15.0+. Captures request headers.nil
responseHeadersExperimental Available in
1.15.0+. Captures response headers.nil
requestBodyExperimental Available in
1.15.0+. Captures fields in the request body (go to #CaptureBody).nil
responseBodyExperimental Available in
1.15.0+. Captures fields in the response body (go to #CaptureBody).nil
NetworkTrackingOptions.CaptureHeader
Name
Description
Default Value
allowlistExperimental Available in
1.15.0+. The headers to capture. Case-insensitive.[]
captureSafeHeadersExperimental Available in
1.15.0+. Whether to capture safe headers.trueNote
authorization, cookie, proxy-authorization are headers which is considered as sensitive and will be excluded even is set to allowlist.Safe headers list
access-control-allow-originaccess-control-allow-credentialsaccess-control-expose-headersaccess-control-max-ageaccess-control-allow-methodsaccess-control-allow-headersaccept-patchaccept-rangesageallowalt-svccache-controlconnectioncontent-dispositioncontent-encodingcontent-languagecontent-lengthcontent-locationcontent-md5content-rangecontent-typedatedelta-baseetagexpiresimlast-modifiedlinklocationpermanentp3ppragmaproxy-authenticatepublic-key-pinsretry-afterserverstatusstrict-transport-securitytrailertransfer-encodingtkupgradevaryviawarningwww-authenticatex-b3-traceidx-frame-options
NetworkTrackingOptions.CaptureBody
Name
Description
Default Value
allowlistExperimental Available in
1.15.0+. The fields to capture. Case-sensitive. Supports wildcards: * matches one level of field, ** matches any number of levels of fields.[]
blocklistExperimental Available in
1.15.0+. The fields to exclude from capture. Case-sensitive. Supports wildcards: * matches one level of field, ** matches any number of levels of fields.[]
captureRules and ignoreHosts properties are mutually exclusive. If both are set, ignoreHosts takes precedence.captureRules from bottom to top.
For example, for the following configuration:captureRules: [
.init(hosts: ["*"], statusCodeRange: "400-499,500-599"),
.init(hosts: ["*.example.com", "example.com"], statusCodeRange: "0,500-599"),
]
With the above configuration, the SDK processes the following requests:
example.com with response code 503: match with last rule's hosts -> match with statusCodeRange filter -> capturedexample.com with response code 401: match with last rule's hosts -> not match with statusCodeRange filter -> ignorednotmyapi.com with response code 401: not match with last rule's hosts -> match with first rule's hosts -> match with statusCodeRange filter -> capturednotmyapi.com with response code 200: not match with last rule's hosts -> match with first rule's hosts -> not match with statusCodeRange filter -> ignoredThe default configuration tracks all hosts except *.amplitude.com with status code 500 to 599.
NetworkTrackingOptions.default
Name
Description
Value
captureRulesCaptures all hosts (except *.amplitude.com) with status code 500 to 599.
[AMPNetworkTrackingCaptureRule(hosts: ["*"], statusCodeRange: "500-599")]
ignoreHostsDon't ignore any other hosts by default.
[]
ignoreAmplitudeRequestsDon't capture Amplitude requests by default.
true
Example use:
// Style 1: Use the default configuration and append a new rule
let networkTrackingOptions = NetworkTrackingOptions.default // contain a rule for all hosts, statusCodeRange: "500-599"
networkTrackingOptions.captureRules.append(
.init(hosts: ["*.example.com", "example.com"], statusCodeRange: "0,500-599")
)
networkTrackingOptions.ignoreHosts.append("notmyapi.com")
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .networkTracking,
networkTrackingOptions: networkTrackingOptions,
))
// Style 2: Create a new configuration with a custom rule
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .networkTracking,
networkTrackingOptions: .init(
captureRules: [
.init(hosts: ["*"]), // all hosts, statusCodeRange: "500-599"
.init(hosts: ["*.example.com", "example.com"], statusCodeRange: "0,400-599"),
],
ignoreHosts: ["notmyapi.com"]
),
))
// Style 1: Use the default configuration and append a new rule
AMPNetworkTrackingOptions *networkTrackingOptions = AMPNetworkTrackingOptions.defaultOptions; // contain a rule for all hosts, statusCodeRange: "500-599"
NSMutableArray<AMPNetworkTrackingCaptureRule *> *rules = [networkTrackingOptions.captureRules mutableCopy];
[rules addObject:[[AMPNetworkTrackingCaptureRule alloc] initWithHosts:@[@"*.example.com", @"example.com"] statusCodeRange:@"0,400-599"]];
networkTrackingOptions.captureRules = rules;
// Style 2: Create a new configuration with a custom rule
NSArray<AMPNetworkTrackingCaptureRule *> *rules = @[
[[AMPNetworkTrackingCaptureRule alloc] initWithHosts: @[@"*"] statusCodeRange:@"500-599"],
[[AMPNetworkTrackingCaptureRule alloc] initWithHosts: @[@"*.example.com", @"example.com"] statusCodeRange:@"0,400-599"]
];
AMPNetworkTrackingOptions *networkTrackingOptions = [[AMPNetworkTrackingOptions alloc] initWithCaptureRules:rules
ignoreHosts:@[@"notmyapi.com"]
ignoreAmplitudeRequests:true];
// Then use the configuration to initialize the Amplitude instance
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[AMPAutocaptureOptions.networkTracking]];
configuration.networkTrackingOptions = networkTrackingOptions;
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
When you enable this setting, Amplitude tracks the [Amplitude] Network Request event whenever the application makes a network request. The SDK swizzles URL loading system methods to instrument network activity.
@_spi(NetworkTracking) import to access the experimental properties.
@_spi(NetworkTracking) import Amplitude-Swift
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .networkTracking,
networkTrackingOptions: .init(
captureRules: [
.init(hosts: ["*"]), // all hosts, statusCodeRange: "500-599"
.init(urls: [.regex("^https://example\\.com/api/.*"), .exact("https://example.com/api2/status")],
methods: ["POST"],
statusCodeRange: "0,400-599",
requestHeaders: .init(allowlist: ["Link", "X-API-Key"]),
responseHeaders: .init(allowlist: ["Link", "X-API-Key"], captureSafeHeaders: false),
requestBody: .init(allowlist: ["user/*", "product/**/id"]),
responseBody: .init(allowlist: ["profile/**"], blocklist: ["**/password"])),
],
ignoreHosts: ["notmyapi.com"],
ignoreAmplitudeRequests: true
),
))
Event Properties Descriptions
Event property
Description
[Amplitude] URLThe URL of the network request with sensitive information masked.
[Amplitude] URL QueryThe query parameters of the URL.
[Amplitude] URL FragmentThe fragment identifier of the URL.
[Amplitude] Request MethodThe HTTP method used for the request (GET, POST, etc.).
[Amplitude] Status CodeThe HTTP status code of the response.
[Amplitude] Error CodeThe local error code if the request failed with out a status code.
[Amplitude] Error MessageThe local error message if the request failed with out a status code.
[Amplitude] Start TimeThe timestamp when the request started, in milliseconds since Unix epoch.
[Amplitude] Completion TimeThe timestamp when the request completed, in milliseconds since Unix epoch.
[Amplitude] DurationThe duration of the request in milliseconds.
[Amplitude] Request Body SizeThe size of the request body in bytes.
[Amplitude] Response Body SizeThe size of the response body in bytes.
[Amplitude] Request BodyExperimental The captured stringified JSON request body (when you configure a
requestBody capture rule).
[Amplitude] Response BodyExperimental The captured stringified JSON response body (when you configure a
responseBody capture rule).
[Amplitude] Request HeadersExperimental The captured request headers (when you configure a
requestHeaders capture rule).
[Amplitude] Response HeadersExperimental The captured response headers (when you configure a
responseHeaders capture rule).
Deeplink tracking isn't automated. To track deeplinks, track the corresponding events.
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY"
))
amplitude.track(DeepLinkOpenedEvent(url: URL()))
amplitude.track(DeepLinkOpenedEvent(url: "url", referrer:"referrer"))
amplitude.track(DeepLinkOpenedEvent(activity: activity))
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
[amplitude track:[AMPDeepLinkOpenedEvent initWithUrl:@"url"]];
[amplitude track:[AMPDeepLinkOpenedEvent initWithUrl:@"url" referrer:@"referrer"]];
[amplitude track:[AMPDeepLinkOpenedEvent initWithActivity:activity]];
Amplitude tracks the [Amplitude] Deep Link Opened event with the URL and referrer information.
Amplitude can track user interactions with UIControl elements and UIGestureRecognizer objects in UIKit applications. To enable this option, include AutocaptureOptions.elementInteractions in the autocapture configuration.
AutocaptureOptions.elementInteractions option is available as a beta release for early feedback. Try it out and share your thoughts on our GitHub.
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .elementInteractions
))
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API_KEY"];
configuration.autocapture = [[AMPAutocaptureOptions alloc] initWithOptionsToUnion:@[AMPAutocaptureOptions.elementInteractions]];
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
After enabling this setting, Amplitude tracks the [Amplitude] Element Interacted event whenever a user interacts with an element in the application. The SDK swizzles the UIApplication.sendAction(_:to:from:for:) method and the UIGestureRecognizer.state property setter to instrument UIControl action methods and UIGestureRecognizer within the application, respectively.
Event Properties Descriptions
Event property
Description
[Amplitude] ActionThe action that triggered the event. Defaults to
touch.
[Amplitude] Target View ClassThe name of the target view class.
[Amplitude] Target TextThe title of the target
UIControl element.
[Amplitude] Target Accessibility LabelThe accessibility label of the target element.
[Amplitude] Target Accessibility IdentifierThe accessibility identifier of the target element.
[Amplitude] Action MethodThe name of the function or method that is triggered when the interaction occurs.
[Amplitude] Gesture RecognizerThe name of the
UIGestureRecognizer class that recognizes the interaction.
[Amplitude] HierarchyA nested hierarchy of the target view's class inheritance, from the most specific to the most general.
[Amplitude] Screen NameSee Track screen views.
Available in version 1.15.0+.
Amplitude can track frustration interactions (Rage Clicks and Dead Clicks) with UIControl elements and UIGestureRecognizer objects in UIKit applications. To enable this option, include AutocaptureOptions.frustrationInteractions in the autocapture configuration.
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .frustrationInteractions
))
The interactionsOptions configuration accepts an InteractionsOptions object to configure the options for capturing rage clicks and dead clicks.
InteractionsOptions
Name
Description
Default Value
rageClickThe options for capturing rage clicks.
RageClickOptions()
rageClick.enabledWhether to capture rage clicks.
true
deadClickThe options for capturing dead clicks.
DeadClickOptions()
deadClick.enabledWhether to capture dead clicks.
true
let amplitude = Amplitude(configuration: Configuration(
apiKey: "API_KEY",
autocapture: .frustrationInteractions,
interactionsOptions: .init(
rageClick: .init(enabled: true),
deadClick: .init(enabled: true)
)
))
Rage Click is a user interaction that occurs four (4) or more times in 1 second on the same element and the distance between each adjacent click is no more than 50 points.
When a Rage Click occurs, Amplitude tracks the [Amplitude] Rage Click event.
Event Properties Descriptions
Event property
Description
[Amplitude] Begin TimeThe timestamp when the interaction began in ISO 8601 format.
[Amplitude] End TimeThe timestamp when the interaction ended in ISO 8601 format.
[Amplitude] DurationThe duration of the interaction in milliseconds.
[Amplitude] Click CountThe number of clicks that occurred.
[Amplitude] ClicksThe array of clicks that occurred.
[Amplitude] Clicks[].XThe x-coordinate of the click from the top-left corner of the screen.
[Amplitude] Clicks[].YThe y-coordinate of the click from the top-left corner of the screen.
[Amplitude] Clicks[].TimeThe timestamp of the click in ISO 8601 format.
[Amplitude] ActionThe action that triggered the event. Defaults to
touch.
[Amplitude] Target View ClassThe name of the target view class.
[Amplitude] Target TextThe title of the target
UIControl element.
[Amplitude] Target Accessibility LabelThe accessibility label of the target element.
[Amplitude] Target Accessibility IdentifierThe accessibility identifier of the target element.
[Amplitude] Action MethodThe name of the function or method that triggered when the interaction occurs.
[Amplitude] Gesture RecognizerThe name of the
UIGestureRecognizer class that recognizes the interaction.
[Amplitude] HierarchyA nested hierarchy of the target view's class inheritance, from the most specific to the most general.
[Amplitude] Screen NameGo to Track screen views.
Dead Click is a tap on an interactive element that resulted in no visible change in the following three (3) seconds.
When a Dead Click occurs, Amplitude tracks the [Amplitude] Dead Click event.
0.5.0 or higher installed and running. Go to Session Replay iOS Plugin for more information.Event Properties Descriptions
Event property
Description
[Amplitude] XThe x-coordinate of the click from the top-left corner of the screen.
[Amplitude] YThe y-coordinate of the click from the top-left corner of the screen.
[Amplitude] ActionThe action that triggered the event. Defaults to
touch.
[Amplitude] Target View ClassThe name of the target view class.
[Amplitude] Target TextThe title of the target
UIControl element.
[Amplitude] Target Accessibility LabelThe accessibility label of the target element.
[Amplitude] Target Accessibility IdentifierThe accessibility identifier of the target element.
[Amplitude] Action MethodThe name of the function or method that triggered when the interaction occurs.
[Amplitude] Gesture RecognizerThe name of the
UIGestureRecognizer class that recognizes the interaction.
[Amplitude] HierarchyA nested hierarchy of the target view's class inheritance, from the most specific to the most general.
[Amplitude] Screen NameGo to Track screen views.
Amplitude supports assigning users to groups and performing queries, such as Count by Distinct, on those groups. If at least one member of the group has performed the specific event, then the count includes the group.
For example, you want to group your users based on what organization they're in by using an 'orgId'. Joe is in 'orgId' '10', and Sue is in 'orgId' '15'. Sue and Joe both perform a certain event. You can query their organizations in the Event Segmentation Chart.
When setting groups, define a groupType and groupName. In the previous example, 'orgId' is the groupType and '10' and '15' are the values for groupName. Another example of a groupType could be 'sport' with groupName values like 'tennis' and 'baseball'.
Setting a group also sets the groupType:groupName as a user property, and overwrites any existing groupName value set for that user's groupType, and the corresponding user property value. groupType is a string, and groupName can be either a string or an array of strings to indicate that a user is in multiple groups.
groupName would be '15'.
// set group with a single group name
amplitude.setGroup(groupType: "orgId", groupName: "15")
// set group with a single group name
[amplitude setGroup:@"orgId" groupName:@"15"];
If Joe is in 'orgId' 'sport', then the groupName would be '["tennis", "soccer"]'.
// set group with multiple group names
amplitude.setGroup(groupType: "sport", groupName: ["tennis", "soccer"])
// set group with multiple group names
[amplitude setGroup:@"sport" groupNames:@[@"tennis", @"soccer"]];
You can also set event-level groups by passing an Event Object with groups to track. With event-level groups, the group designation applies only to the specific event being logged, and doesn't persist on the user unless you explicitly set it with setGroup.
amplitude.track(
event: BaseEvent(
eventType: "event type",
eventProperties: [
"eventPropertyKey": "eventPropertyValue"
],
groups: ["orgId": "15"]
)
)
AMPBaseEvent *event = [AMPBaseEvent initWithEventType:@"event type"
eventProperties:@{@"eventPropertyKey": @"eventPropertyValue"}];
[event.groups set:@"orgId" value:@"15"];
[amplitude track:event];
Use the Group Identify API to set or update the properties of particular groups. Keep these considerations in mind:
The groupIdentify method accepts a group type string parameter and group name object parameter, and an Identify object that's applied to the group.
let groupType = "plan"
let groupName = "enterprise"
let identify = Identify().set(property: "key", value: "value")
amplitude.groupIdentify(groupType: groupType, groupName: groupProperty, identify: identify)
NSString *groupType = @"plan";
NSString *groupName = @"enterprise";
AMPIdentify *identify = [AMPIdentify new];
[identify set:@"key" value:@"value"];
[amplitude groupIdentify:groupType groupName:groupName identify:identify];
Amplitude can track revenue generated by a user. Revenue is tracked through distinct revenue objects, which have special fields that are used in Amplitude's Event Segmentation and Revenue LTV charts. This allows Amplitude to automatically display data relevant to revenue in the platform. Revenue objects support the following special properties, as well as user-defined properties through the eventProperties field.
let revenue = Revenue()
revenue.price = 3.99
revenue.quantity = 3
revenue.productId = "com.company.productId"
amplitude.revenue(revenue: revenue)
AMPRevenue *revenue = [AMPRevenue new];
revenue.price = 3.99;
revenue.quantity = 3;
revenue.productId = @"com.company.productId";
[amplitude revenue:revenue];
| Name | Description |
|---|---|
productId |
Optional. String. An identifier for the product. Amplitude recommends something like the Google Play Store product ID. Defaults to null. |
quantity |
Required. Integer. The quantity of products purchased. Note: revenue = quantity * price. Defaults to 1 |
price |
Required. Double. The price of the products purchased, and this can be negative. Note: revenue = quantity * price. Defaults to null. |
revenueType |
Optional, but required for revenue verification. String. The revenue type (for example, tax, refund, income). Defaults to null. |
receipt |
Optional. String. The receipt identifier of the revenue. For example, "123456". Defaults to null. |
receiptSignature |
Optional, but required for revenue verification. String. Defaults to null. |
If your app has its login system that you want to track users with, you can call setUserId at any time.
amplitude.setUserId(userId: "user@amplitude.com")
[amplitude setUserId:@"user@amplitude.com"];
You can assign a new device ID using deviceId. When setting a custom device ID, make sure the value is sufficiently unique. Amplitude recommends using a UUID.
amplitude.setDeviceId(NSUUID().uuidString)
[amplitude setDeviceId:[[NSUUID UUID] UUIDString]];
If you don't want to store the data in the Amplitude-defined location, you can customize your own storage by implementing the Storage protocol and setting the storageProvider in your configuration.
Every iOS app gets a slice of storage just for itself, meaning that you can read and write your app's files there without worrying about colliding with other apps. By default, Amplitude uses this file storage and creates an "amplitude" prefixed folder inside the app "Documents" directory. However, if you need to expose the Documents folder in the native iOS "Files" app and don't want expose "amplitude" prefixed folder, you can customize your own storage provider to persist events on initialization.
Amplitude(
configuration: Configuration(
apiKey: AMPLITUDE_API_KEY,
storageProvider: YourOwnStorage() // YourOwnStorage() should implement Storage
)
)
reset is a shortcut to anonymize users after they log out, by:
userId to nulldeviceId to a new value based on current configurationWith an empty userId and a completely new deviceId, the current user would appear as a brand new user in dashboard.
amplitude.reset()
[amplitude reset];
Plugins enable you to extend Amplitude SDK's behavior by, for example, modifying event properties (enrichment type) or sending to third-party APIs (destination type). A plugin is an object with methods setup() and execute().
This method contains logic for preparing the plugin for use and has amplitude instance as a parameter. A typical use for this method, is to instantiate plugin dependencies. This method is called when the plugin is registered to the client via amplitude.add().
This method contains the logic for processing events and has event instance as parameter. If used as enrichment type plugin, the expected return value is the modified/enriched event. If used as a destination type plugin, the expected return value is null. This method is called for each event, including Identify, GroupIdentify and Revenue events, that's instrumented using the client interface.
Here's an example of a plugin that modifies each event that's instrumented by adding extra event property.
class EnrichmentPlugin: Plugin {
let type: PluginType
var amplitude: Amplitude?
init() {
self.type = PluginType.enrichment
}
func setup(amplitude: Amplitude) {
self.amplitude = amplitude
}
func execute(event: BaseEvent?) -> BaseEvent? {
event?.sessionId = -1
if event?.eventProperties == nil {
event?.eventProperties = [:]
}
event?.eventProperties?["event prop key"] = "event prop value"
return event
}
}
amplitude.add(plugin: EnrichmentPlugin())
[amplitude add:[AMPPlugin initWithType:AMPPluginTypeEnrichment
execute:^AMPBaseEvent *_Nullable(AMPBaseEvent * _Nonnull event) {
event.sessionId = -1;
[event.eventProperties set:@"event prop key" value:@"event prop value"];
return event;
}]];
In destination plugins, you can overwrite the track(), identify(), groupIdentify(), revenue(), and flush() functions.
flush() and general execute() functions.
class TestDestinationPlugin: DestinationPlugin {
override func track(event: BaseEvent) -> BaseEvent? {
return event
}
override func identify(event: IdentifyEvent) -> IdentifyEvent? {
return event
}
override func groupIdentify(event: GroupIdentifyEvent) -> GroupIdentifyEvent? {
return event
}
override func revenue(event: RevenueEvent) -> RevenueEvent? {
return event
}
override func flush() {
}
override func setup(amplitude: Amplitude) {
self.amplitude = amplitude
}
override func execute(event: BaseEvent?) -> BaseEvent? {
return event
}
}
[amplitude add:[AMPPlugin initWithType:AMPPluginTypeDestination
execute:^AMPBaseEvent * _Nullable(AMPBaseEvent * _Nonnull event) {
if ([event.eventType isEqualToString:@"$identify"]) {
// ...
} else if ([event.eventType isEqualToString:@"$groupidentify"]) {
// ...
} else if ([event.eventType isEqualToString:@"revenue_amount"]) {
// ...
} else {
// ...
}
return nil;
} flush:^() {
// ...
}]];
Ensure that the configuration and payload are accurate and check for any unusual messages during the debugging process. If everything appears to be right, check the value of flushQueueSize or flushIntervalMillis. Events are queued and sent in batches by default, which means they are not immediately dispatched to the server. Ensure that you have waited for the events to be sent to the server before checking for them in the charts.
loggerProvider class from the LoggerProvider and implement your own logic, such as logging error message in server in a production environment.Take advantage of a Destination Plugin to print out the configuration value and event payload before sending them to the server. You can set the logLevel to debug, copy the following TroubleShootingPlugin into your project, add the plugin into the Amplitude instance.
SwiftUI TroubleShootingPlugin example.
The event callback executes after the event is sent, for both successful and failed events. Use this method to monitor the event status and message. For more information, see configuration > callback.
Amplitude starts a session when the app is brought into the foreground or when an event is tracked in the background. A session ends when the app remains in the background for more than the time set by setMinTimeBetweenSessionsMillis() without any event being tracked. Note that a session will continue for the entire time the app is in the foreground no matter whether session tracking is enabled by configuration.defaultTracking, configuration.autocapture or not.
When the app enters the foreground, Amplitude tracks a session start, and starts a countdown based on setMinTimeBetweenSessionsMillis(). Amplitude extends the session and restarts the countdown any time it tracks a new event. If the countdown expires, Amplitude waits until the next event to track a session end event.
Amplitude doesn't set user properties on session events by default. To add these properties, use identify() and setUserId(). Amplitude aggregates the user property state and associates the user with events based on device_id or user_id.
Due to the way in which Amplitude manages sessions, there are scenarios where the SDK works expected but it may appear as if events are missing or session tracking is inaccurate:
event['$skip_user_properties_sync'] to true on the session end event, which prevents Amplitude from synchronizing properties for that specific event. See $skip_user_properties_sync in the Converter Configuration Reference article to learn more.Amplitude groups events together by session. Events that are logged within the same session have the same session_id. Sessions are handled automatically so you don't have to manually call startSession() or endSession().
You can adjust the time window for which sessions are extended. The default session expiration time is five minutes.
Use the helper method getSessionId to get the value of the current sessionId.
let amplitude = Amplitude(
configuration: Configuration(
apiKey: AMPLITUDE_API_KEY,
minTimeBetweenSessionsMillis: 1000
)
)
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:AMPLITUDE_API_KEY];
configuration.minTimeBetweenSessionsMillis = 1000;
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
trackingSessionEvents is deprecated and replaced with the AutocaptureOptions.sessions option of autocapture.You can also track events as out-of-session. Out-of-session events have a sessionId of -1 and behave as follows:
sessionId for subsequent events.A potential use case is for events tracked from push notifications, which are usually external to the customers app usage.
Set the sessionId to -1 in EventOptions to mark an event as out-of-session when you call track(event, options) or identify(identify, options).
let outOfSessionOptions = EventOptions(sessionId: -1)
amplitude.identify(
event: Identify().set(property: "user-prop", value: true),
options: outOfSessionOptions
)
amplitude.track(
event: BaseEvent(eventType: "Button Clicked"),
options: outOfSessionOptions
)
AMPEventOptions *outOfSessionOptions = [AMPEventOptions new];
outOfSessionOptions.sessionId = -1;
AMPIdentify *identify = [AMPIdentify new];
[identify set:@"user-prop" value:YES];
[amplitude identify:identify options:outOfSessionOptions];
AMPBaseEvent *event = [AMPBaseEvent initWithEventType:@"Button Clicked"];
[amplitude track:event options:outOfSessionOptions];
control the level of logs that print to the developer console.
Set the log level logLevel with the level you want.
let amplitude = Amplitude(
configuration: Configuration(
apiKey: AMPLITUDE_API_KEY,
logLevel: LogLevelEnum.LOG
)
)
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:AMPLITUDE_API_KEY];
configuration.logLevel = AMPLogLevelLOG;
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
Amplitude merges user data, so any events associated with a known userId or deviceId are linked the existing user.
If a user logs out, Amplitude can merge that user's logged-out events to the user's record. You can change this behavior and log those events to an anonymous user instead.
To log events to an anonymous user:
userId to null.deviceId.Events coming from the current user or device appear as a new user in Amplitude. Note: If you do this, you can't see that the two users were using the same device.
amplitude.reset()
[amplitude reset];
By default the iOS SDK tracks several user properties such as carrier, city, country, ip_address, language, and platform.
Use the provided TrackingOptions interface to customize and toggle individual fields.
Before initializing the SDK with your apiKey, create a TrackingOptions instance with your configuration and set it on the SDK instance.
let trackingOptions = TrackingOptions()
trackingOptions.disableTrackCity().disableTrackIpAddress()
let amplitude = Amplitude(
configuration: Configuration(
apiKey: AMPLITUDE_API_KEY,
trackingOptions: trackingOptions
)
)
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:AMPLITUDE_API_KEY];
[configuration.trackingOptions disableTrackCity];
[configuration.trackingOptions disableTrackIpAddress];
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
Tracking for each field can be individually controlled, and has a corresponding method (for example, disableCountry, disableLanguage).
| Method | Description |
|---|---|
disableTrackCarrier() |
Disable tracking of device's carrier |
disableTrackCity() |
Disable tracking of user's city |
disableTrackCountry() |
Disable tracking of user's country |
disableTrackDeviceModel() |
Disable tracking of device model |
disableTrackDeviceManufacturer() |
Disable tracking of device manufacturer |
disableTrackDMA() |
Disable tracking of user's designated market area (DMA) |
disableTrackIpAddress() |
Disable tracking of user's IP address |
disableTrackLanguage() |
Disable tracking of device's language |
disableTrackIDFV() |
|
disableTrackOsName() |
Disable tracking of device's OS Name |
disableTrackOsVersion() |
Disable tracking of device's OS Version |
disableTrackPlatform() |
Disable tracking of device's platform |
disableTrackRegion() |
Disable tracking of user's region |
disableTrackVersionName() |
Disable tracking of your app's version name |
TrackingOptions only prevents default properties from being tracked on newly created projects, where data has not yet been sent. If you have a project with existing data that you want to stop collecting the default properties for, get help in the Amplitude Community. Disabling tracking doesn't delete any existing data in your project.Amplitude determines the user's mobile carrier using CTTelephonyNetworkInfo, which returns the registered operator of the sim.
COPPA (Children's Online Privacy Protection Act) restrictions on IDFA, IDFV, city, IP address and location tracking can all be enabled or disabled at one time. Apps that ask for information from children under 13 years of age must comply with COPPA.
let amplitude = Amplitude(
configuration: Configuration(
apiKey: AMPLITUDE_API_KEY,
enableCoppaControl: true
)
)
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:AMPLITUDE_API_KEY];
configuration.enableCoppaControl = true;
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
Advertiser ID (also referred to as IDFA) is a unique identifier provided by the iOS and Google Play stores. As it's unique to every person and not just their devices, it's useful for mobile attribution.
Mobile attribution is the attribution of an installation of a mobile app to its original source (such as ad campaign, app store search). Mobile apps need permission to ask for IDFA, and apps targeted to children can't track at all. Consider using IDFV, device ID, or an email login system when IDFA isn't available.
To retrieve the IDFA and add it to the tracking events, you can follow this example plugin to implement your own plugin.
The SDK initializes the device ID in the following order, with the device ID being set to the first valid value encountered:
setDeviceId()A single user may have multiple devices, each having a different device ID. To ensure coherence, set the user ID consistently across all these devices. Even though the device IDs differ, Amplitude can still merge them into a single Amplitude ID, thus identifying them as a unique user.
It's possible for multiple devices to have the same device ID when a user switches to a new device. When transitioning to a new device, users often transfer their applications along with other relevant data. The specific transferred content may vary depending on the application. In general, it includes databases and file directories associated with the app. However, the exact items included depend on the app's design and the choices made by the developers. If databases or file directories have been backed up from one device to another, the device ID stored within them may still be present. Consequently, if the SDK attempts to retrieve it during initialization, different devices might end up using the same device ID.
Use the helper method getDeviceId() to get the value of the current deviceId.
let deviceId = amplitude.getDeviceId()
NSString *deviceId = [amplitude getDeviceId];
To set the device, see custom device ID.
Amplitude converts the IP of a user event into a location (GeoIP lookup) by default. This information may be overridden by an app's own tracking solution or user data.
Users may wish to opt out of tracking entirely, which means Amplitude doesn't track any of their events or browsing history. OptOut provides a way to fulfill a user's requests for privacy.
let amplitude = Amplitude(
configuration: Configuration(
apiKey: AMPLITUDE_API_KEY,
optOut: true
)
)
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:AMPLITUDE_API_KEY];
configuration.optOut = true;
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
Implements a customized loggerProvider class from the LoggerProvider, and pass it in the configuration during the initialization to help with collecting any error messages from the SDK in a production environment.
class SampleLogger: Logger {
typealias LogLevel = LogLevelEnum
var logLevel: Int
init(logLevel: Int = LogLevelEnum.OFF.rawValue) {
self.logLevel = logLevel
}
func error(message: String) {
// TODO: handle error message
}
func warn(message: String) {
// TODO: handle warn message
}
func log(message: String) {
// TODO: handle log message
}
func debug(message: String) {
// TODO: handle debug message
}
}
let amplitude = Amplitude(
configuration: Configuration(
apiKey: AMPLITUDE_API_KEY,
loggerProvider: SampleLogger()
)
)
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:AMPLITUDE_API_KEY];
configuration.loggerProvider = ^(NSInteger logLevel, NSString * _Nonnull message) {
switch(logLevel) {
case AMPLogLevelERROR:
// TODO: handle error message
break;
case AMPLogLevelWARN:
// TODO: handle warn message
break;
case AMPLogLevelLOG:
// TODO: handle log message
break;
case AMPLogLevelDEBUG:
// TODO: handle debug message
break;
}
};
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
iOS automatically protects application data by storing each apps data in its own secure directory. This directory is usually not accessible by other applications. However, if a device is jailbroken, apps are granted root access to all directories on the device.
To prevent other apps from accessing your apps Amplitude data on a jailbroken device, Amplitude recommends setting a unique instance name for your SDK. This creates a unique database isolates it from other apps.
let amplitude = Amplitude(
configuration: Configuration(
apiKey: "API-KEY",
instanceName: "my-unqiue-instance-name"
)
)
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:@"API-KEY"
instanceName:@"my-unqiue-instance-name"];
Amplitude *amplitude = [Amplitude instanceWithConfiguration:configuration];
Beginning with version 1.3.0, the Amplitude iOS Swift SDK supports offline mode. The SDK checks network connectivity every time it tracks an event. If the device is connected to network, the SDK schedules a flush. If not, it saves the event to storage. The SDK also listens for changes in network connectivity and flushes all stored events when the device reconnects.
To disable offline mode, add offline: NetworkConnectivityCheckerPlugin.Disabled on initialization as shown below.
let amplitude = Amplitude(
configuration: Configuration(
apiKey: "API-KEY",
offline: NetworkConnectivityCheckerPlugin.Disabled
)
)
AMPConfiguration *configuration = [AMPConfiguration initWithApiKey:AMPLITUDE_API_KEY];
configuration.offline = AMPNetworkConnectivityCheckerPlugin.Disabled;
Amplitude *amplitude = [Amplitude initWithConfiguration:configuration];
You can also implement you own offline logic:
amplitude.configuration.offline by yourself.Starting December 8, 2020, Apple requires a privacy manifest file for all new apps and app updates. Apple expects to make this mandatory in the Spring of 2024. As Amplitude is a third-party to your app, you need to ensure you properly disclose to your users the ways you use Amplitude in regards to their data.
By default, Amplitude doesn't use data for tracking. Add this field and set it to true if your app does.
| Date type | Linked to user | Used for tracking | Reason for collection | Where it's tracked |
|---|---|---|---|---|
| Product interaction | Yes | No | Analytics | Such as app launches, taps, clicks, scrolling information, music listening data, video views, saved place in a game, video, or song, or other information about how the user interacts with the app. |
| Device ID | Yes | No | Analytics | Tracked by default. Learn more here |
| Coarse Location | Yes | No | Analytics | Country, region, and city based on IP address. Amplitude doesn't collect them from device GPS or location features. |
By default the SDK tracks deviceId only. You can use setUserId() to track userId as well. To do so, add the "User ID" Data type. For more information about data types, see Apple's article Describing data use in privacy manifests.
If you set NSPrivacyTracking to true then you need to provide at least one internet domain in NSPrivacyTrackingDomains based on your configuraiton.
| Domain | Description |
|---|---|
| https://api2.amplitude.com/2/httpapi | The default HTTP V2 endpoint. |
| https://api.eu.amplitude.com/2/httpapi | EU endpoint if configuration.serverZone = EU. |
| https://api2.amplitude.com/batch | Batch endpoint if configuration.useBatch = true. |
| https://api.eu.amplitude.com/batch | Batch EU endpoint if configuration.useBatch = true and configuration.serverZone = EU. |
The SDK only uses userDefaults API for identity storage.
Follow the steps on how to create your app's privacy.
July 23rd, 2024
Need help? Contact Support
Visit Amplitude.com
Have a look at the Amplitude Blog
Learn more at Amplitude Academy
© 2025 Amplitude, Inc. All rights reserved. Amplitude is a registered trademark of Amplitude, Inc.