> For the complete documentation index, see [llms.txt](https://docs.devtodev.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devtodev.com/integration/integration-of-sdk-v2/sdk-integration/macos.md).

# macOS

## Manual installation

1\. [Download the latest version of devtodev SDK from the repository  ](https://github.com/devtodev-analytics/macos-sdk-2.0)

2\. Add **`DTDAnalytics.xcframework`** to the project  (with ***Do Not Embed*** specified)![](blob:https://devtodev.atlassian.net/d3f72139-cd7c-442c-b432-817431ec55a2#media-blob-url=true\&id=922697d7-c4b5-4416-9bea-75ee0236eeb6\&collection=contentId-2520907789\&contextId=2520907789\&mimeType=image%2Fpng\&name=%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202021-05-19%20%D0%B2%2017.39.13.png\&size=40783\&width=628\&height=168)

![](https://2105883905-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnGcP_ZeRJ1ipj9O8dF%2F-MgLv7dxwlGDbqwdSerK%2F-MgLxU1obl_4w8P4aKIH%2Fimage.png?alt=media\&token=b575859b-fe56-48aa-b689-8fbd4538ff06)

3\. Add frameworks:

* **`AppTrackingTransparency.framework`**
* **`AdSupport.framework`**

4\. Add initialization t&#x6F;**`didFinishLaunchingWithOptions`** method:

{% tabs %}
{% tab title="Swift" %}

```swift
let config = DTDAnalyticsConfiguration()
config.logLevel = .error
DTDAnalytics.initialize(applicationKey: "App ID", configuration: config)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
DTDAnalyticsConfiguration *config;
config.logLevel = DTDLogLevelError;
[DTDAnalytics applicationKey:@"App ID" configuration:config];
```

{% endtab %}
{% endtabs %}

You can find the `App ID` in the settings of the respective app in devtodev (Settings → SDK → Integration → [Credentials](/reports-and-functionality/project-related-reports-and-fuctionality/settings.md#integration)).&#x20;

For [Cross-platform type projects](/getting-started/adding-an-app-to-the-space/cross-platform-application.md) use `App ID + Platform ID` .

* **`config`** - an object instance of **`DTDAnalyticsConfiguration`**, which is used for specifying additional properties during the initialization.

**`DTDAnalyticsConfiguration`**

| **Parameter**              | **Type**                 | **Description**                                                                                                                                                                                                                                                                                                                                  |
| -------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **`currentLevel`**         | int                      | The player level at the moment of devtodev SDK initialization. It is recommended (but optional) to use to improve data precision.                                                                                                                                                                                                                |
| **`userId`**               | string                   | <p>A custom user identifier provided by the developer. If you utilize the default calculation by the device ID, this identifier can be used for finding a user in devtodev.</p><p>In case your project utilizes the calculation by the user identifier, you must set this parameter because it becomes the main user identifier in devtodev.</p> |
| **`trackingAvailability`** | DTDTrackingStatus (enum) | The property allows or disallows devtodev tracking of the user. By default, it is set to ***`DTDTrackingStatus.enable`***. SDK stores the previously assigned value. Pass ***`DTDTrackingStatus.disable`*** if the user opted out of tracking in line with GDPR.                                                                                 |
| **`logLevel`**             | DTDLogLevel (enum)       | The level of logging the SDK activity. The ***`DTDLogLevel.no`*** value is used by default. For troubleshooting during integration it is recommended to set it to ***`DTDLogLevel.debug`***, and either switch it off ***`DTDLogLevel.no`***. Use ***`DTDLogLevel.no`*** in the release version.                                                 |

Example:

{% tabs %}
{% tab title="Swift" %}

```swift
let config = DTDAnalyticsConfiguration()
config.currentLevel = 1
config.userId = "CustomUserID"
config.trackingAvailability = .enable
config.logLevel = .no
DTDAnalytics.initialize(applicationKey: "App ID", configuration: config)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
DTDAnalyticsConfiguration *config;
config.currentLevel = @1;
config.userId = @"CustomUserID";
config.trackingAvailability = DTDTrackingStatusEnable;
config.logLevel = DTDLogLevelNo;
[DTDAnalytics applicationKey:@"App ID" configuration:config];
```

{% endtab %}
{% endtabs %}

### Integration features

#### **For Objective-C**

1. Create Bridging-Header. To do this, you need to add any swift file to the project (don’t delete it later) and choose ‘Create Bridging Header’ in the offered dialog box. &#x20;
2. Make sure that the ‘Build Settings’ for ‘Defines Module’ value evaluates to ‘YES’. &#x20;
3. While importing, use: **`#import <DTDAnalytics/DTDAnalytics-Swift.h>`**

#### **For SwiftUI**&#x20;

For SDK to function properly, it needs to be integrated at the earliest moment of the app launch. It is recommended that you use the following method of main entry point initialization:

```swift
@main
struct TestSwiftUIApp: App {
    init() {
        let config = DTDAnalyticsConfiguration()
        config.logLevel = .debug
        DTDAnalytics.initialize(applicationKey: "App ID", configuration: config)
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

## **Apps targeted at children**

When developing and publishing apps targeted at children under 13 years old, you need to ensure special conditions for data processing. Any mobile app aimed at children or intended for users in a region with strict regulations on child online protection, must comply with current laws.

{% hint style="info" %}
Please study the following requirements:

* USA: [Children’s Online Privacy Protection Act (COPPA)](https://www.ftc.gov/tips-advice/business-center/privacy-and-security/children%27s-privacy)&#x20;
* EU: [General Data Protection Regulation (GDPR) Article 8](https://gdpr-info.eu/art-8-gdpr/)
  {% endhint %}

If your app has to comply with the legal requirements (COPPA), use the following recommendations:

1. Implement the `coppaControlEnable` method. The method disables collection of ad IDs and vendor IDs (IDFA, IDFV).
2. To comply with [Apple’s guidelines](https://developer.apple.com/news/?id=091202019a)
   1. Remove `AppTrackingTransparency.framework` and all the links pointing to it.
   2. Remove `AdSupport.framework` all the links pointing to it.

{% hint style="warning" %}
Call the `coppaControlEnable` method before SDK initialization. If the method was not called, the SDK will work as before.
{% endhint %}

{% tabs %}
{% tab title="Swift" %}

```swift
DTDAnalytics.coppaControlEnable()
DTDAnalytics.initialize(applicationKey: "App ID", configuration: config)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[DTDAnalytics coppaControlEnable];
[DTDAnalytics applicationKey:@"App ID" configuration:config];
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.devtodev.com/integration/integration-of-sdk-v2/sdk-integration/macos.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
