目录
此内容是否有帮助?

# iOS SDK User Guide

TIP

Before accessing, please read the preparation before accessing .

You can get iOS SDK source code on GitHub (opens new window).

iOS SDK requires a minimum system version of iOS 8.0

iOS SDK (Framework format) size is approximately 5.5 MB

**The latest version is: **2.7. 4

**Updated: **202 2 - 01 - 18

Download address (opens new window)

# I. Integration and Initialization of SDK

# 1.1 Automatic SDK integration

  • Installing the SDK using CocoaPods
  1. Create and edit the Podfile content (if existing, edit directly):

Create Podfile, project project ( .xcodeproj) file with the command line in the same directory to execute commands:

pod init

Edit the content of the Podfile as follows:

platform :ios, '9.0'
target 'YourProjectTarget' do
  pod 'ThinkingSDK'  #ThinkingSDK
end
  1. Execute the installation command
pod install

After success, the following records will appear:

  1. The import is successful and the project is started

After the command is executed successfully, a .xcworkspacefile is generated, indicating that you have successfully imported the iOS SDK. Open the .xcworkspacefile to start the project (note: the .xcodeprojfile cannot be opened at the same time)

  • Installing the SDK using Carthage
  1. Add the following configuration to the Cartfile file:
github "ThinkingDataAnalytics/ios-sdk"
  1. Perform carthage update --platform iOSand add ThinkingSDK.frameworkto your project

# 1.2 Manual Integration SDK

  1. Download and extract the iOS SDK (opens new window)

  2. Drag ThinkingSDK.frameworkinto the XCode Project Workspace project

  3. Modify the settings of Other linker flags in the Build Settings tab under the Targets option of the project, add -ObjC

  1. Switch to the Build Phases tab and add the following dependencies under the Link Binary With Libraries column:

libz.dylibSecurity.frameworkSystemConfiguration.frameworklibsqlite3.tbd

# 1.3 Initialize SDK

In v1.2.0 version, the feature of multiple APP ID instances is added. For guidelines on the use of multiple APPIDs, please refer to the iOS SDK Multi APPID Guide section

Add in AppDelegate.m #import < ThinkingSDK/ThinkingAnalyticsSDK.h >

Then in application: didFinishLaunchingWithOptions:add initialization

As follows

Parameters APP_IDare the APP_ID of your project and will be given when you apply for the project. Please fill in here.

The parameter SERVER_URLis the URL of the data upload

If you are using Cloud as a Service, enter the following URL:

https://receiver.ta.thinkingdata.cn

If you are using the version of private deployment, enter the following URL:

https://Data Acquisition Address

Using the https protocol, please apply for the domain name with the SSL certificate yourself, and the TA staff will assist in port configuration.

After initialization, you can use the SDK as follows:

In v2.7.3, the instance name feature is added to identify the instance when the instance is initialized. You can also obtain the instance according to the instance name.

# 1.4 Background Self-Start Event Description

iOS 12 and below (iOS 13 does not use EnableSceneSupport), the background self-start event is not counted by default. It is configured by trackRelaunchedInBackgroundEvents. YESmeans collection, and NOmeans no collection.

iOS 13 uses EnableSceneSupportand must pass in the launchOptionsparameter.

# 1.5 Open Access to H5 page (optional)

If you need to get through with the JavaScript SDK that collects H5 page data, please call the following interface. For details, please refer to the H5 and APP SDK get through section

# II. Set User ID

The SDK instance will use random UUID as the default guest ID for each user, which will be the user's identification ID when the user is not logged in. It should be noted that the guest ID will change when the user reinstates the app and changes the device.

# 2.1 Set Visitor ID (optional)

If the user can be used in your product without logging in, and you need to configure the user's guest ID in the unlogged state, you can call identify:to set it up:

If you need to replace the visitor ID, you should use it immediately after the end of the initialization SDK. Do not use it multiple times to avoid creating useless accounts.

If you need to get the current visitor ID, you can use getDistinctIdto get:

# 2.2 Set Account ID

When the user logs in, you can call login:to set the user's account ID. The TA platform preferentially uses the account ID as the identity, and the set account ID will be saved. Multiple calls to login:will overwrite the previous account ID:

Note that this method does not upload events for user logins

# 2.3 Empty Account ID

After the user produces login behavior, you can call logoutto clear the account ID. Before the next call to login:, it will be identified as the guest ID

We recommend that you call logoutduring explicit logout events, such as when the user logs out, instead of when the app is closed.

Note that this method does not upload user logged-out events

# III. Send Events

After the SDK initialization is completed, you can use track:, track: properties:to upload events. In general, you may need to upload 20 to 100 different events. If you are using TA for the first time, we recommend that you upload a few key events first.

# 3.1 Send events

You can use track:, track: properties:to upload events. It is recommended that you set the attributes of the event and the conditions for sending information according to the previously combed doc:

The name of the event is of type NSString, can only begin with a letter, can contain numbers, letters and an underscore '_', is up to 50 characters in length, and is not case sensitive to letters.

  • The attribute of the event is an NSDictionaryobject where each element represents an attribute.
  • The value of Key is the name of the attribute, which is of NSStringtype. It is stipulated that it can only start with letters, contain numbers, letters and underscore '_', and is up to 50 characters in length. It is not sensitive to letter case.
  • Value is the value of the property, which can be NSString, NSNumber, NSDate, NSDate , NSArray, object, and object group .
  • **If you need to upload Boolean attributes, assign values **@YES**with **@NO**or **[NSNumber numberWithBool: YES]with [NSNumber numberWithBool: NO].

You cannot assign Boolean data using @true, @false, @TRUE, and @FALSE.

Note:

NSArray type is supported in v2.4.0 version, and needs to be used with TA background v2.5 and subsequent versions.

V2.7.3 version starts to support objects and object groups

In v2.2.0 version, the method overload of setting event trigger time and time offset is added. It supports passing in parameters of type NSDate to set event trigger time, and parameters of type NSTimeZone to set time offset. If this parameter is not passed in, track: local time and offset when called are taken as event trigger time and time zone offset:

Note: Although the trigger time can be set for the event, the receiving end will only receive data from the first 10 days to the last 3 days relative to the server time. Data exceeding the time limit will be regarded as abnormal data and the whole data cannot be stored.

Since v2.3.1, you can align event times across multiple time zones by setting the SDK Default Time Zone, see the Setting Default Time Zone section.

Since v2.5.0, you can calibrate the SDK time interface to uniformly use server level time to complete data collection. Please refer to the calibration time section.

# 3.2 Set Public Event Properties

For some important attributes, such as the user's membership level, source channel, etc., these attributes need to be set in each event. At this time, you can set these attributes as public event attributes. Public event properties refer to the properties that each event will carry. You can call setSuperProperties:to set public properties. We recommend that you set public event properties before sending events.

Format requirements for public event properties are consistent with event properties.

The public event properties will be saved to the cache and need not be called every time the app is started. If a call to setSuperProperties:sets a previously set public event property, the previous property is overwritten. If the public event property and the Key of a property uploaded by track: properties:duplicate, the property of the event overrides the public event property:

If you need to delete a public event property, you can call unsetSuperProperty:clear the specified public event property; if you want to empty all public event properties, you can call clearSuperProperties; if you want to get all public event properties, you can call currentSuperProperties;

# 3.3 Set Dynamic Public Properties

In v1.2.0, the feature of dynamic public attributes is added, that is, public attributes can obtain the current value when reporting, so that variable public attributes such as membership level can be easily reported. After setting the dynamic public property class through registerDynamicSuperProperties, the SDK will automatically execute when the event is reported and obtain the properties in the return value and add them to the triggered event. The following example is that each time the report is reported, the current time will be obtained and the time zone will be switched. When any event is triggered, the SDK will add the returned time to the attributes of the event.

# 3.4 Record the Duration of the Event

If you need to record the duration of an event, you can call timeEventto start timing, configure the event type you want to time, and when you upload the event, you will automatically add #durationto your event attribute to indicate the duration of the recording, in seconds.

# IV. User Features

The TA platform currently supports the user feature setting interface as user_set:, user_setOnce:, user_add:, user_unset:, user_deleteand user_append

# 4.1 User_set

For general user features, you can call user_set:to set it up. The attributes uploaded using this interface will overwrite the original attribute values. If the user feature does not exist before, the new user feature will be created. The type is the same as the type of the passed-in attribute

user_set: The user feature set is an NSDictionary object where each element represents an attribute.

The user feature format set by user_set requires consistency with event properties.

# 4.2 User_setOnce

If the user feature you want to upload only needs to be set once, you can call user_setOnce:to set it. When the attribute has a value before, this information will be ignored.

The user feature format set by user_setOnce requires consistency with event properties.

# 4.3 User_add

When you want to upload a numeric attribute, you can call user_add:to accumulate the attribute. If the attribute has not been set, a value of 0 will be assigned before calculation

user_add: The property types and key values are set with the same limits as user_set:, but Value only allows NSNumbers.

# 4.4 User_unset

When you want to empty a user feature value of a user, you can call user_unset:to empty the specified attribute. If the attribute has not been created in the cluster, then user_unset: **will not **create the attribute

The incoming value of user_unset: is the Key value of the emptied property.

# 4.5 User_delete

If you want to delete a user, you can call user_deleteto delete the user. You will no longer be able to query the user features of the user, but the events generated by the user can still be queried

# 4.6 User_append

Starting with v2.4.0, you can call user_appendto append to user features of type NSArray.

# V. Automatic Acquisition Events

Please refer to the chapter iOS SDK Auto Capture Guide for details on how to use auto capture events.

# VI. SDK Configuration

# 6.1 Set Uploaded Network Conditions

By default, the SDK will upload data in 2G, 3G, 4G, 5G and Wifi. You can modify the network conditions that allow uploading by the following methods:

# 6.2 Pause/stop Data Reporting

In v2.1.0 version, the function of stopping SDK reporting data has been added. There are two types of interfaces to stop SDK reporting:

# 6.2.1 Pause SDK reporting (enableTracking)

You may want to temporarily stop SDK data collection and reporting in some scenarios, such as the user is in a test environment, or the user logged in to a test account. At this time, you can call the following interfaces to temporarily stop SDK reporting.

You can call enableTracking:through an instance (including the main instance and the light instance) to pause the reporting of the SDK by passing in false. The #distinct_id, #account_id, public attributes that have been set by the instance will be retained; the data that has been collected but has not been successfully reported by the instance will continue to try to report; the subsequent instance cannot collect and report any new data, cannot set visitor ID, account ID, and public attributes, etc., but can read the instance The public attributes and device ID, visitor ID, account ID and other information that have been set.

The stop state of the instance will be saved in the local cache until the call to enableTracking:and the incoming true, the SDK instance will resume data collection and reporting. It should be noted that the light instance is not cached, so every time after opening the APP, the pause state of the light instance will not be retained, and the reporting will be reopened.

# 6.2.2 Stop SDK Reporting (optOutTracking)

In some special situations, you may need to completely stop the functions of the SDK. For example, in areas where GDPR is applicable, users choose not to provide data collection permissions, you can call the following interface to completely turn off the functions of the SDK.

OptOutTrackingcan only be called through the main instance. The biggest difference with enableTrackingis that it will empty the local cache of this instance, including the guest ID, account ID, public attributes, and unreported data queues of this instance. Then turn off the collection and reporting functions of this instance.

If you want to delete the user's user data in the TA group while turning off the SDK function, you can use optOutTrackingAndDeleteUser, which will report a piece of user_deldata before stopping the function of the SDK instance to delete the user's user data.

The stop state of the instance will also be saved in the local cache until the optInTrackingis called, and subsequent reports can continue, but this is equivalent to a completely new instance

# 6.3 Print Data Log

You can use setLogLevelto turn it on (it is off by default):

# 6.4 Get the Device ID

In v2.0.0, an interface was added to get the device ID (that is, the preset attribute #device_id). You can get the device ID by calling getDeviceId:

[instance getDeviceId];

 // If you need to set the device ID to the visitor ID, you can call it as follows
 // [instance identify:[instance getDeviceId]];

# 6.5 Configure HTTPS Verification Method:

Starting from v2.3.0, the SDK can configure HTTPS verification methods. You need to first obtain the TDConfig instance during initialization, and then use TDConfig to complete the initialization.

# 6.6 Set the Default Time Zone

By default, if the user does not specify an event occurrence time, the SDK reports the event occurrence time by default using the native time of the interface call. Since v2.3.1, you can also specify the default time zone by setting the default time zone interface, so that all events (including automatic collection events) will align the event time according to the time zone you set:

// Get an example of TDConfig
TDConfig *config = [[TDConfig alloc] init];
// Set default time zone to UTC
config.defaultTimeZone = [NSTimeZone timeZoneWithName:@"UTC"];
// Initialise SDK
ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK startWithAppId:@"YOUR_APPID" withUrl:@"YOUR_SERVER_URL" withConfig:config];

Note: Aligning the event time with the specified time zone will lose the device native time zone information. If you need to retain the device native time zone information, you currently need to add relevant attributes for the event yourself.

# 6.7 Turn on Debug mode

Starting from v2.4.0, the client side SDK supports Debug mode and needs to be used with TA platform versions after 2.5.

Debug mode may affect the quality of data collection and the stability of the app. It is only used for data verification during the integration phase and should not be used in online environments.

The current SDK instance supports three operating modes, defined in TDConfig:

/**
Debug Mode

- ThinkingAnalyticsDebugOff : Default does not open Debug mode
*/
typedef NS_OPTIONS(NSInteger, ThinkingAnalyticsDebugMode) {
    /**
     Default does not open Debug mode
     */
    ThinkingAnalyticsDebugOff      = 0,

    /**
     Open Debug_ Only mode, only verify the data, will not be stored
     */
    ThinkingAnalyticsDebugOnly     = 1 << 0,

    /**
     Debug mode, data is reported item by item. Alert users with logs and exceptions when problems occur
     */
    ThinkingAnalyticsDebug         = 1 << 1
};

To set the SDK instance running mode, use TDConfigto complete the SDK initialization:

// Get an example of TDConfig
TDConfig *config = [[TDConfig alloc] init];
// Set Running Mode to Debug Mode
config.debugMode = ThinkingAnalyticsDebug;
// Initialise SDK
ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK startWithAppId:@"YOUR_APPID" withUrl:@"YOUR_SERVER_URL" withConfig:config];

In order to prevent Debug mode from going live in the production environment, it is stipulated that only specified devices can turn on Debug mode. Debug mode can only be enabled on the client side, and the device ID is configured in the "Debug Data" section of the 'Event tracking management' page in the background of the TA.

The device ID can be obtained in three ways:

  • #device_id attribute in event data in TA platform
  • Client side log: The device DeviceId will be printed after the SDK initialization is completed
  • Called through the instance interface: get device ID

# 6.8 Calibration Time

The SDK will use the original time as the event occurrence time by default. If the user manually modifies the device time, it will affect your business analysis. Starting from version v2.5.0, you can use the current timestamp obtained from the server level to calibrate the SDK's time. After that, all calls to the specified time, including event data and user feature setting operations, use the calibrated time as the time of occurrence.

We also provide the ability to get time-to-SDK calibration from NTP. You need to pass in an NTP server address that your users can access. The SDK then tries to get the current time from the incoming NTP service address and calibrates the SDK time. If the correct return result is not obtained within the default timeout time (3 seconds), the data will be reported using the local time later.

Note:

  • You need to choose your NTP server address carefully to ensure that the user equipment can get the server time quickly when the network is in good condition.
  • There is some uncertainty in using the NTP service for time calibration. It is recommended that you give priority to using timestamp calibration.

In addition to the above calibration time interface, v2.5.0 provides time function overloading for all user feature interfaces. When you call the user feature related interface, you pass in the Date object, and the system will use the incoming Date object to set the data #timefield.

# VII. Relevant Preset Attributes

# 7.1 Preset Properties for All Events

The following preset properties are the preset properties that all events in the iOS SDK, including AutoCollect events, carry

Attribute name
Chinese name
Description
#ip
IP address
The user's IP address, which the TA will use to obtain the user's geographic location information
#country
Country
User's country, generated according to IP address
#country_code
Country code
The country code of the country where the user is located (ISO 3166-1 alpha-2, that is, two uppercase English letters), generated based on the IP address
#province
Province
The user's province is generated according to the IP address
#city
City
The user's city is generated according to the IP address
#os_version
Operating system version
iOS 11.2.2、Android 8.0.0 等
#manufacturer
Equipment manufacturer
Manufacturers of user equipment, such as Apple, vivo, etc
#os
Operating system
Such as Android, iOS, etc
#device_id
Device ID
The user's device ID, iOS take the user's IDFV or UUID, Android takes androidID
#screen_height
Screen height
The screen height of the user equipment, such as 1920, etc
#screen_width
Screen width
The screen height of the user equipment, such as 1080, etc
#device_model
Equipment model
The model of the user equipment, such as iPhone 8, etc
#app_version
App version
Version of your app
#bundle_id
Application unique identification
Application package name
# lib
SDK type
The type of SDK you access, such as Android, iOS, etc
#lib_version
SDK version
The version you access to the SDK
#network_type
Network status
Network status when uploading events, such as WIFI, 3G, 4G, etc
#carrier
Network Operator
Network operators of user equipment, such as China Mobile, China Telecom, etc
#zone_offset
Time zone offset
The number of hours the data time is offset from UTC time

# 7.2 Preset Properties for Automatic Acquisition Events

The following preset properties are unique to each AutoCapture event

  • Preset properties for APP launch event (ta_app_start)
Attribute name
Chinese name
Description
#resume_from_background
Whether to wake up from the background
Indicates whether the APP is turned on or woken up from the background, the value of true indicates waking up from the background, and false is directly turned on
  • Preset properties for APP shutdown events (ta_app_end)
Attribute name
Chinese name
Description
#duration
Event duration
Represents the duration of the APP access (from start to end) in seconds
  • Preset properties for APP browsing page events (ta_app_view)
Attribute name
Chinese name
Description
#title
Page Title
For the title of the View Controller, take the value of the
controller.navigation I tem.title
attribute
#screen_name
Page name
Class name for View Controller
#url
Page address
The address of the current page, you need to call
getScreenUrl
to set the url
#referrer
Forward address
The address of the page before the jump, the page before the jump needs to call
getScreenUrl
to set the url
  • Preset properties for APP control click events (ta_app_click)
Attribute name
Chinese name
Description
#title
Page Title
For the title of the View Controller, take the value of the
controller.navigation I tem.title
attribute
#screen_name
Page name
Class name for View Controller
#element_id
Element ID
Control ID, need
thinkingAnalyticsViewID
to set
#element_type
Element type
Type of control
#element_selector
Element selector
Splicing for the
viewPath
of a control
#element_position
Element position
Control location information, only if the widget type is
UITableView
or
UICollectionView
will exist, indicating the position where the control was clicked, the value is
Group Number (Section): Line Number (Row)
#element_content
Element content
Content on the control
  • Preset properties for APP crash events (ta_app_crash)
Attribute name
Chinese name
Description
#app_crashed_reason
Abnormal information
Character type to record the stack trajectory when crashing

# 7.3 Other Preset Properties

In addition to the preset attributes mentioned above, there are also some preset attributes that need to call the corresponding interface to be recorded:

Attribute name
Chinese name
Description
#duration
Event duration
You need to call the timing function interface
timeEvent:
to record the duration of the event, in seconds
#background_duration
Duration of backstage stay
#background_duration v2.7.4, new attribute. This attribute will only exist in startup events and duration events,
in seconds

# 7.4 Get Preset Properties

V2.7.0 and later can call the getPresetPropertiesmethod to obtain preset properties.

When server level event tracking requires some preset properties of the App side, you can obtain the preset properties of the App side through this method and then pass them to the server level.

IP, country city information is generated by server level parsing, and the client side does not provide an interface to obtain these attributes

# 7.5 Performance Indicators Prefabricated Attributes

Starting with v2.7.4, the SDK reports performance-related prefab attributes by default:

Attribute name
Chinese name
Description
#ram
Available memory size/total memory
Unit is GB
#disk
Available disk capacity/total disk volume
Unit is GB
# fps
FPS
Plastic surgery
#simulator
Is it a mobile emulator?
Boolean value
#install_time
Application installation time

# 7.6 Prefabricated Attribute Switches

Starting with v2.7.4, the SDK supports masking reports of specified prefab attributes.

Add the **TDDisPresetProperties **field to the info.plist file of the project, the type is Array, and the preset properties corresponding to the added fields will not be uploaded.

Such as shielding "#fps", @"#ram", @"#disk", @"#start_reason", @"#simulator" and other prefabricated attributes, the configuration is as follows:

# VIII. Advanced Functions

Starting from v2.6.0, the SDK supports the reporting of three special types of events: first events, updatable events, and rewritable events. These three events need to be used in conjunction with TA system 2.8 and later versions. Since special events are only applicable in certain specific scenarios, please use special events to report data with the help of Count Technology's customer success and analysts.

# 8.1 First Incident

First-time events are events that are recorded only once for an ID of a device or another dimension. For example, in some scenarios, you may want to record the first event on a device, so you can use first-time events to report data.

If you want to determine whether it is the first time in a dimension other than the device, you can set FIRST_CHECK_ID for the first event. For example, if you need to record the first event of an account, you can set the account ID to the FIRST_CHECK_ID of the first event:

Note: Due to the completion of the verification of whether it is the first time at the server level, the first event will be delayed for 1 hour.

# 8.2 Updatable Events

You can implement the need to modify event data in a specific scenario through updatable events. Updatable events need to specify an ID that identifies the event and pass it in when you create an updatable event object. The TA will determine the data that needs to be updated based on the event name and event ID.

# 8.3 Rewritable Events

Rewritable events are similar to updatable events, except that rewritable events will completely cover historical data with the latest data, which is equivalent to deleting the previous data and storing the latest data in effect. The TA background will determine the data that needs to be updated based on the event name and event ID.

# ChangeLog

# v2.7.4 2022/01/18

  • Code optimization
  • Add prefabricated attributes such as startup reason and performance indicators

# v2.7.3 2021/11/09

  • Support for complex data types

# v2.7.2 2021/08/18

  • Code optimization
  • Optimize installation event acquisition logic

# v2.7.1 2021/07/21

  • Code optimization

# v2.7.0 2021/06/16

  • Support preset attribute acquisition
  • Code optimization

# v2.6.5 2021/04/19

  • Code optimization

# v2.6.4 2021/03/15

  • Added preset property #bundle_id (application package name)
  • Adaptation iOS 14

# v2.6.3 2021/01/18

  • Optimized to get network type logic

# v2.6.2 2020/10/29

  • Adapt to 5G network
  • Optimize install, start event reporting logic
  • Optimized data transfer format
  • Default network reporting policy adjusted to 2G/3G/4G/5G/WIFI

# v2.6.1 2020/08/25

  • Fix the logic of setting timeZone for special events. Now the data reported without timeZone will no longer have #zone_offset = 0.

# v2.6.0 2020/08/24

  • Supports first-time events, allowing custom ID checks to be passed in to verify whether it is reported for the first time
  • Supports updatable, rewritable events

# v2.5.6 2020/08/11

  • Optimize the time calibration API, now multiple calls will take effect multiple times.

# v2.5.5 2020/06/23

  • Fix some models #system_language anomalies

# v2.5.4 2020/06/22

  • 修复 v2.5.3 undeclared selector 'applicationWillTerminateNotification:' [-Wundeclared-selector]

# v2.5.3 2020/06/22

  • Added preset property #system_language
  • Fixed preset property #os to "iOS"
  • Optimize code

# v2.5.2 2020/05/15

  • Fix the problem that Debug mode will be degraded due to data format errors in v2.5.1

# v2.5.1 2020/05/14

  • Adapt TA version 2.7 shielding event configuration interface
  • Adjust DEBUG mode to remove client side exception throwing logic

# v2.5.0 2020/04/03

  • Support time calibration function of client SDK
  • Added user feature interface for specified time
  • Code optimization

# v2.4.3 2020/03/11

  • Remove UIWebView related code

# v2.4.2 2020/03/09

  • Data is normally reported at intervals during delayed initialization
  • Code optimization

# v2.4.1 2020/02/21

  • Fix the bug introduced by v2.3.0, v2.3.1, v2.4.0

# v2.4.0 2020/02/10

  • Supports NSArray types
  • Add user_append interface
  • Remove the client attribute format check

# v2.3.1 2020/01/07

  • Support configuring default time zone

# v2.3.0 2019/12/31

  • Support Debug mode: need to cooperate with the background Debug device whitelist to open together
  • H5 and original SDK open support multiple instances
  • Optimize SDK configuration: increase global settings; reporting policy allows configuration for different projects
  • Support for configuring HTTPS certificate verification

# v2.2.2 2019/12/01

  • Fix the problem that when using EnableSceneSupport, the attribute #resume_from_backgroundin the APP startup event ( ta_app_install) has an abnormal value

# v2.2.1 2019/11/22

  • Remove UIWebView related content by default according to Appstore ITMS-90809

# v2.2.0 2019/10/21

  • Added user_unsetinterface to clear a user feature
  • Added preset property #zone_offsetin hours. By default, the offset of the local time zone is reported to the server level, which is affected by daylight saving time. The following formula is satisfied:
utc_time + #zone_offset = #event_time

# v2.1.1 2019/10/11

  • Optimize the reporting logic to solve the problem of abnormal data reporting in extreme cases

# v2.1.0 2019/09/16

  • Supports lightweight instances to facilitate reporting of passive events and other requirements
  • Added enableTracking interface, you can turn on or off the instance reporting function
  • Added optOutTracking/optInTracking interface
  • Other code optimizations

# v2.0.1 2019/07/15

  • Adjusted the trigger sequence of the ta_app_install (APP installation event) in the automatic collection event, which will now be triggered before the ta_app_start (APP startup event)

# v2.0.0 2019/07/12

  • Automatic collection of events Add APP installation events
  • By default, the data generated when the background self-start is not collected, and the background self-start interface will be added later to control whether to collect the data generated when the background self-start

# v1.2.0 2019/06/20

  • Add multiple APPID instance function
  • Added dynamic public attribute feature
  • Automatically collect events Add APP crash events