---
title: "Adapty на серверах в Китае"
description: "Узнайте о китайском кластере Adapty и его политике хранения данных."
---

<head>
  
  <meta name="robots" content="noindex" />
</head>

Чтобы ваше приложение не блокировалось в Китае и работало эффективно, Adapty предоставляет опцию китайского кластера. Это обеспечивает быстрый и надёжный сервис для пользователей на материковом Китае и помогает соответствовать местным требованиям.

Великий китайский файрвол может существенно влиять на подключение и производительность приложений, использующих серверы за пределами страны.

Однако китайская инфраструктура Adapty позволяет вашему приложению стабильно и надёжно работать для пользователей на материковом Китае.

:::important

В Китае приложениям требуется явное разрешение пользователя на доступ в интернет. До получения этого разрешения **никакие сетевые запросы не будут работать**. Убедитесь, что ваше приложение:
- Запрашивает разрешение на доступ в интернет в нужный момент.
- Обрабатывает случаи, когда разрешение отклонено или ещё не предоставлено.
- Понятно объясняет пользователю, зачем нужен доступ в интернет.
:::

## Шаг 1. Настройте SDK Adapty для региона Китай \{#step-1-configure-adapty-sdk-for-china-region\}

<InlineTooltip tooltip="Установите SDK Adapty согласно инструкции по установке">[iOS](sdk-installation-ios), [Android](sdk-installation-android), [React Native](sdk-installation-reactnative), [Flutter](sdk-installation-flutter) и [Unity](sdk-installation-unity)</InlineTooltip>.

Для региона Китай при настройке SDK в процессе установки следуйте инструкциям в зависимости от вашего фреймворка:

<Tabs groupId="current-os" queryString> 
<TabItem value="swift" label="iOS"> 

При настройке добавьте китайский кластер следующим образом:

Укажите кластер как `.with(serverCluster: .cn)` в вашей конфигурации.

<Tabs groupId="current-os" queryString>

<TabItem value="swift" label="Swift" default>

```swift showLineNumbers
// In your AppDelegate class:

let configurationBuilder =
    AdaptyConfiguration
        .Builder(withAPIKey: "PUBLIC_SDK_KEY")
        .with(observerMode: false)
        .with(customerUserId: "YOUR_USER_ID")
        // highlight-next-line
        .with(serverCluster: .cn)

Adapty.activate(with: configurationBuilder.build()) { error in
  // handle the error
}
```

</TabItem>
<TabItem value="swiftui" label="SwiftUI" default>

```swift showLineNumbers

@main
struct SampleApp: App {
    init() 
      let configurationBuilder =
        AdaptyConfiguration
          .Builder(withAPIKey: "PUBLIC_SDK_KEY")
          .with(observerMode: false) // optional
          .with(customerUserId: "YOUR_USER_ID") // optional
          // highlight-next-line
          .with(serverCluster: .cn)
  
        Adapty.activate(with: configurationBuilder.build()) { error in
          // handle the error
        }
    }

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

</TabItem>
</Tabs>

Параметры:

| Параметр          | Описание                                                                                    |
| ------------------ | ------------------------------------------------------------------------------------------- |
| **serverCluster** | Используйте значение `.cn`, чтобы подключить приложение к серверам Adapty в Китае. |

</TabItem> 

<TabItem value="kotlin" label="Android" default> 
При настройке добавьте китайский кластер следующим образом:

Используйте метод `.withServerCluster` в вашей конфигурации:

<Tabs groupId="current-os" queryString>
  <TabItem value="kotlin" label="Kotlin" default>

```kotlin showLineNumbers
override fun onCreate() {
    super.onCreate()
    Adapty.activate(
      applicationContext,
      AdaptyConfig.Builder("PUBLIC_SDK_KEY")
          .withObserverMode(false) //default false
          .withCustomerUserId(customerUserId) //default null
          // highlight-next-line
          .withServerCluster(AdaptyConfig.ServerCluster.CN)
          .build()
    )  
}
```

  </TabItem>
  <TabItem value="java" label="Java" default>

```java showLineNumbers
@Override
public void onCreate() {
    super.onCreate();
    Adapty.activate(
      applicationContext,
      new AdaptyConfig.Builder("PUBLIC_SDK_KEY")
          .withObserverMode(false) //default false
          .withCustomerUserId(customerUserId) //default null
          // highlight-next-line
          .withServerCluster(AdaptyConfig.ServerCluster.CN)
          .build()
    );
}
```

  </TabItem>
</Tabs>

Добавленный метод:

| Метод                | Описание                                                                                                                     |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| **withServerCluster** | Передайте значение `AdaptyConfig.ServerCluster.CN`, чтобы подключить приложение к серверам Adapty в Китае. |

</TabItem>

<TabItem value="react-native" label="React Native">

Для React Native приложений настройте китайский кластер следующим образом:

```javascript showLineNumbers

// Initialize Adapty with China servers
await Adapty.activate({
  sdkKey: 'PUBLIC_SDK_KEY',
  observerMode: false, // optional, default false
  customerUserId: 'YOUR_USER_ID', // optional
  // highlight-next-line
  serverCluster: 'cn', // Use 'cn' for China servers
});
```

Параметры:

| Параметр         | Описание                                                        |
| ----------------- | --------------------------------------------------------------- |
| **serverCluster** | Используйте значение `'cn'` для подключения к серверам в Китае. |

</TabItem>

<TabItem value="flutter" label="Flutter">

Для Flutter приложений настройте китайский кластер следующим образом:

```dart showLineNumbers

await Adapty().activate(
    configuration: AdaptyConfiguration(apiKey: 'PUBLIC_SDK_KEY')
      ..withServerCluster(AdaptyServerCluster.cn)
      ..withCustomerUserId('YOUR_USER_ID'),
);
```

Параметры:

| Параметр         | Описание                                                              |
| ----------------- | --------------------------------------------------------------------- |
| **serverCluster** | Используйте значение `AdaptyServerCluster.cn` для серверов в Китае. |

</TabItem>

</Tabs>

После настройки китайского кластера вы можете пользоваться дашбордом Adapty как обычно по адресу `app.adapty.io`. Интерфейс дашборда одинаков вне зависимости от того, какой кластер серверов вы используете.

## Шаг 2. Определите, когда использовать серверы в Китае \{#step-2-detect-when-to-use-china-servers\}

Важно динамически выбирать между глобальными и китайскими серверами в зависимости от местоположения пользователя. Вот два подхода:

### Вариант 1: Определение по региону/стране \{#option-1-detect-by-regioncountry\}

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS">

```swift showLineNumbers
func shouldUseChinaServers() -> Bool {
  Locale.current.regionCode == "CN"
}

// In your configuration
let configurationBuilder = AdaptyConfiguration
    .Builder(withAPIKey: "PUBLIC_SDK_KEY")

if shouldUseChinaServers() {
    configurationBuilder.with(serverCluster: .cn)
}
// other configuration options
```

</TabItem>

<TabItem value="react-native" label="React Native">

```javascript showLineNumbers

async function initializeAdapty() {
  // Determine if user is in China
    const shouldUseChinaServers = () => getCountry() === "CN";
  // Initialize with appropriate server
  await Adapty.activate({
    sdkKey: 'PUBLIC_SDK_KEY',
    serverCluster: shouldUseChinaServers ? 'cn' : 'default',
    // other configuration options
  });
}

// Call the initialization function
initializeAdapty();
```

</TabItem>

<TabItem value="kotlin" label="Android">

```kotlin
// Define the helper function
private fun shouldUseChinaServers() = Locale.getDefault().country == "CN"

// Use it in configuration
private fun setupAdapty() {
    val serverCluster = if (shouldUseChinaServers())
        AdaptyConfig.ServerCluster.CN
    else
        AdaptyConfig.ServerCluster.DEFAULT

    Adapty.activate(
        context,
        AdaptyConfig.Builder("PUBLIC_SDK_KEY")
            // other configuration options
            .withServerCluster(serverCluster)
            .build()
    )
}
```

</TabItem>

</Tabs>

### Вариант 2: Определение по стору \{#option-2-detect-by-app-store\}

Для приложений, распространяемых через разные сторы, можно определять нужный сервер по источнику установки:

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS">

```swift showLineNumbers

func shouldUseChinaServers() async -> Bool {
    let code: String?
    
    if #available(iOS 15.0, *) {
        code = await Storefront.current?.countryCode
    } else {
        code = SKPaymentQueue.default().storefront?.countryCode
    }
    
    return code == "CHN"
}

// In your configuration
let configurationBuilder = AdaptyConfiguration
    .Builder(withAPIKey: "PUBLIC_SDK_KEY")

// Only set server cluster if it's China
if await shouldUseChinaServers() {
    configurationBuilder.with(serverCluster: .cn)
}
// other configuration options
```

</TabItem>

<TabItem value="react-native" label="React Native">

```javascript showLineNumbers

async function initializeAdapty() {
  // For Android, determine if the app was installed from a Chinese app store
  // For iOS, you might check the storefront country
  const shouldUseChinaServers = Platform.OS === 'android' 
    ? await isChineseStore() 
    : await isChineseStorefront();
  
  // Initialize with appropriate server
  await Adapty.activate({
    sdkKey: 'PUBLIC_SDK_KEY',
    serverCluster: shouldUseChinaServers ? 'cn' : 'default',
    // other configuration options
  });
}

// Example implementation for Android (simplified)
async function isChineseStore() {
  try {
    // Check if the app was installed from a Chinese app store
    // This is a simplified example - implement proper store detection based on your distribution channels
    const { installerPackageName } = await NativeModules.InstallerInfo.getInstallerInfo();
    
    const chineseStores = [
      'com.huawei.appmarket',  // Huawei AppGallery
      'com.xiaomi.market',     // Xiaomi GetApps
      'com.oppo.market',       // OPPO App Market
      'com.vivo.appstore',     // Vivo App Store
      // Add other Chinese app stores as needed
    ];
    
    return chineseStores.includes(installerPackageName);
  } catch (error) {
    console.error('Error detecting store:', error);
    return false;
  }
}

// Example implementation for iOS (simplified)
async function isChineseStorefront() {
  // Implementation depends on how you detect the App Store region
  // This would typically involve checking receipt information or other store data
  
  // Simplified example:
  return await NativeModules.StoreHelper.isChineseStorefront();
}

// Call the initialization function
initializeAdapty();
```

</TabItem>

</Tabs>