Чтобы ваше приложение не блокировалось в Китае и работало эффективно, Adapty предоставляет опцию китайского кластера. Это обеспечивает быстрый и надёжный сервис для пользователей на материковом Китае и помогает соответствовать местным требованиям.
Великий китайский файрвол может существенно влиять на подключение и производительность приложений, использующих серверы за пределами страны.
Однако китайская инфраструктура Adapty позволяет вашему приложению стабильно и надёжно работать для пользователей на материковом Китае.
В Китае приложениям требуется явное разрешение пользователя на доступ в интернет. До получения этого разрешения никакие сетевые запросы не будут работать. Убедитесь, что ваше приложение:
Запрашивает разрешение на доступ в интернет в нужный момент.
Обрабатывает случаи, когда разрешение отклонено или ещё не предоставлено.
Понятно объясняет пользователю, зачем нужен доступ в интернет.
Используйте значение AdaptyServerCluster.cn для серверов в Китае.
После настройки китайского кластера вы можете пользоваться дашбордом Adapty как обычно по адресу app.adapty.io. Интерфейс дашборда одинаков вне зависимости от того, какой кластер серверов вы используете.
Шаг 2. Определите, когда использовать серверы в Китае
Важно динамически выбирать между глобальными и китайскими серверами в зависимости от местоположения пользователя. Вот два подхода:
Вариант 1: Определение по региону/стране
func shouldUseChinaServers() -> Bool { Locale.current.regionCode == "CN"}// In your configurationlet configurationBuilder = AdaptyConfiguration .Builder(withAPIKey: "PUBLIC_SDK_KEY")if shouldUseChinaServers() { configurationBuilder.with(serverCluster: .cn)}// other configuration options
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 functioninitializeAdapty();
// Define the helper functionprivate fun shouldUseChinaServers() = Locale.getDefault().country == "CN"// Use it in configurationprivate 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() )}
Вариант 2: Определение по стору
Для приложений, распространяемых через разные сторы, можно определять нужный сервер по источнику установки:
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 configurationlet configurationBuilder = AdaptyConfiguration .Builder(withAPIKey: "PUBLIC_SDK_KEY")// Only set server cluster if it's Chinaif await shouldUseChinaServers() { configurationBuilder.with(serverCluster: .cn)}// other configuration options
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 functioninitializeAdapty();