Local-only чтение страны — не «collection» для Google и Apple, но ePrivacy Art.5(3) всё равно требует осторожности в ЕС

Asked: «Research по нормативке и техническим ограничениям определения страны пользователя на клиенте в мобильной MMO (Unity 6000.4.10f1; Google Play/Android и App Store/iOS). При первом запуске страна нужна только для рекомендации сервера (Казахстан → выделенный сервер), игрок может сменить сервер; код страны остаётся на устройстве, наружу уходит только integer server ID; рассматриваются Android TelephonyManager.getSimCountryIso/getNetworkCountryIso, Locale.getDefault().getCountry(), .NET RegionInfo.CurrentRegion, TimeZoneInfo.Local.Id, iOS NSLocale.countryCode и локальный PlayerPrefs. Нужны первоисточники, точные актуальные формулировки, enforcement, ePrivacy Art.5(3), индустриальная практика, матрица и checklist».

Дата среза — 2026-09-01. Разобраны 6 клиентских сигналов страны и локальный кэш по официальным первоисточникам: Android SDK reference (2 метода TelephonyManager, 14 подтверждающих записей), 32 записи политик Google Play, 21 запись Apple, 48 записей по ePrivacy/EDPB/CJEU и 95 кандидатов enforcement- и индустриальной практики из 1 551 уникального веб-результата.

[ПРАВИЛО] — прямой официальный текст[ПРАКТИКА] — наблюдаемое поведение индустрии[ИНТЕРПРЕТАЦИЯ] — наша оценка, не правило

Risk-matrix: сигнал → разрешение → Play → Apple → ePrivacy → надёжность → итог

Цвет — уровень риска/статус: low low/medium medium / условие medium-high high ок при local-only N/A. Наведите на строку — детали. Оценки колонок ePrivacy и «итог» — [ИНТЕРПРЕТАЦИЯ] на основе цитируемых правил.
[ПРАВИЛО] Google Play: “Collect means transmitting data from your app off a user’s device… The term ‘collect’ does not apply to data that is accessed by your app and processed locally on a user’s device, as long as the data is never transmitted off device.”support.google.com
[ПРАВИЛО] Apple App Privacy: “Data that is processed only on the device is not ‘collected’ and does not need to be disclosed in your answers.” — но декларация всего приложения обязана включать practices третьих сторон (Firebase/AdMob) — developer.apple.com, developer.apple.com
[ПРАВИЛО] ePrivacy Art.5(3): storage или gaining access к информации в терминале допустимы только с согласием после clear/comprehensive information, кроме strictly necessary для явно запрошенной услуги — eur-lex.europa.eu; CJEU Planet49: активное согласие, персональность данных не решающая — curia.europa.eu
[ПРАКТИКА] За 95 кандидат-строк enforcement не найден надёжный кейс, где Play требовал Approximate location только за getSimCountryIso/getNetworkCountryIso без передачи; известные rejections связаны с GPS/location APIs — github.com, stackoverflow.com

1. Android: TelephonyManager и Locale

[ПРАВИЛО] Текущая SDK reference: getSimCountryIso — “Returns the ISO-3166-1 alpha-2 country code equivalent for the SIM provider's country code.”; getNetworkCountryIso — “Returns the ISO-3166-1 alpha-2 country code equivalent of the MCC (Mobile Country Code) of the current registered operator or the cell nearby, if available.” В декларациях этих методов на текущей reference нет @RequiresPermission — в отличие от защищённых методов той же страницы; runtime/manifest permission не документировано. Формулируем это как «current SDK reference/declaration has no annotation», а не как абсолютное доказательство «из отсутствия текста». Дата обновления на странице не отображается; проверено 2026-09-01 — developer.android.com.

[ИНТЕРПРЕТАЦИЯ] getSimCountryIso — домашняя страна SIM-провайдера, не текущая физическая; ошибается при roaming/foreign SIM, при no SIM/inactive subscription обычно пусто. getNetworkCountryIso — страна MCC текущего оператора или соседней соты: ближе к физической, но недоступна на Wi-Fi-only/airplane/emulator и может ошибаться в погранзонах/роуминге. Ограничения Android 10 касаются non-resettable идентификаторов (IMEI/MEID/IMSI/SIM serial/subscriber ID) — country-ISO к ним не относится; в списках non-SDK-ограничений упоминается лишь скрытая subscription-перегрузка — developer.android.com. В официальных behavior changes Android 12–16 изменений именно этих методов не найдено; объявленных будущих ограничений на 2026-09-01 не найдено.

[ИНТЕРПРЕТАЦИЯ] Edge-матрица no-SIM/dual-SIM/eSIM/work-profile/emulator в официальных доках неполна: default TelephonyManager привязан к default subscription/device context; для конкретной активной подписки нужен createForSubscriptionId; eSIM — это subscription; на no-SIM/emulator возможна пустая/статическая конфигурация. Work profile не делает сигнал profile-specific: telephony state обычно device/subscription-scoped — техническая интерпретация, не обещание API. Не выбирать KZ-сервер по первому произвольному SIM в dual-SIM: конфликт сигналов → fallback/ручной выбор.

[ИНТЕРПРЕТАЦИЯ] Locale.getDefault().getCountry() и .NET RegionInfo.CurrentRegion — пользовательская настройка региона, не физическая страна; permission не нужны. На Unity/IL2CPP проверьте фактический mapping RegionInfo к platform locale и возможные исключения. TimeZoneInfo.Local.Id — corroboration-сигнал: таймзона не уникальна стране, есть алиасы и платформенные различия.

2. Google Play: Data safety, ephemeral, Approximate location

[ПРАВИЛО] Определение collection и local-only исключение — см. цитату выше (support.google.com; страница не показывает last-updated; проверено 2026-09-01). Ephemeral processing — иное: это off-device передача, обработанная в памяти не дольше, чем нужно real-time запросу; её всё равно указывают в форме, хотя пользователю она может не показываться. Наш сценарий — не ephemeral: SharedPreferences/PlayerPrefs — локальная персистентность, но она вовсе не collection, пока данные никогда не уходят с устройства.

[ПРАВИЛО] Approximate location: “User or device physical location to an area greater than or equal to 3 square kilometers…”; inferred approximate location, включая via IP address или Access Point Name, must be disclosed — support.google.com.

[ИНТЕРПРЕТАЦИЯ] Документация не классифицирует SIM-country/locale-country/timezone по источнику. Семантика решает: network MCC, переданный как proxy текущей страны — safest Approximate location; SIM home country при роуминге — не physical location, классификация спорна, но если продукт называет её местоположением — safest Approximate location; locale/timezone как настройки — не обязательно Location, но при передаче именно для вывода физического местоположения — консервативно Location. В local-only сценарии спор не меняет ответ Data safety.

[ПРАВИЛО] User Data policy запрещает linking persistent identifiers (IMEI/IMSI/SIM serial) с sensitive data вне узких случаев — country ISO не persistent identifier, и эти методы не возвращают IMSI/serial — support.google.com. Device and Network Abuse не содержит отдельного запрета на чтение country ISO — support.google.com. INTERNET-only manifest достаточен для этих вызовов.

3. Apple: App Privacy, privacy manifest, CTCarrier

[ПРАВИЛО] Apple определяет collection как off-device передачу, доступную разработчику/третьей стороне дольше, чем нужно для обслуживания real-time запроса; on-device-only данные не «collected» и не декларируются — developer.apple.com (страница без даты обновления; checked 2026-09-01). App privacy details обязаны включать third-party partners: нельзя выбрать «Data Not Collected» для всего приложения при AdMob/Firebase — локальный сигнал лишь не добавляет data type — developer.apple.com.

[ПРАВИЛО] Required Reason API: approved reasons обязательны с 1 мая 2024 — developer.apple.com; с 12 февраля 2025 privacy-impacting SDK обязаны нести собственный манифест (ITMS-91061) — developer.apple.com/forums. Категории (осторожно, текущий список): file timestamp, system boot time, disk space, active keyboards, user defaults; canonical-список и коды — developer.apple.com. Carrier info, NSLocale и timezone в категории не входят; NSUserDefaults входит — для defaults собственного приложения обычно reason CA92.1. Unity PlayerPrefs на iOS обычно реализован через NSUserDefaults: проверьте сгенерированный PrivacyInfo.xcprivacy своей версии Unity и манифесты интегрированных SDK.

[ПРАВИЛО] CTCarrier deprecated в iOS 16 с аннотацией “Deprecated with no replacement”; сборки с iOS 16.4 SDK+ получают статические значения (документированные плейсхолдеры: carrierName/isoCountryCode “--”, MCC/MNC “65535”) — developer.apple.com. Замены для carrier-country нет → использовать NSLocale.region/countryCode, не CTCarrier.

[ИНТЕРПРЕТАЦИЯ] App Review: правила о consent/purpose касаются Location Services и location data; отдельного запрета на locale/timezone-based suggestion без Core Location permission не найдено. Но скрытый misleading вывод физического местоположения может вызвать privacy concerns. Разделяйте system permission и store disclosure — это разные плоскости.

4. ЕС: ePrivacy Art.5(3), EDPB, Planet49

[ПРАВИЛО] Консолидированный Art.5(3): storing of information, or the gaining of access to information already stored, in the terminal equipment допускается только с согласием после clear and comprehensive information; исключения — solely for carrying out the transmission и “strictly necessary in order for the provider of an information society service explicitly requested by the subscriber or user to provide the service”eur-lex.europa.eu. Planet49 (CJEU): активное согласие для storage/access; персональность данных не решающая — curia.europa.eu.

[ПРАВИЛО] EDPB Guidelines 2/2023 о технической сфере Art.5(3) — technology-neutral, применяются к «information», не только к персональным данным; консультационная версия adopted 2023-11-14 — edpb.europa.eu. В более поздней переписке EDPB guidelines цитируются как «adopted on 7 October 2024» — edpb.europa.eu; точную финальную версию/дату из имеющихся строк подтвердить полностью нельзя — отмечаем пробел; проверено 2026-09-01.

[ИНТЕРПРЕТАЦИЯ] Ключевой спор: консервативная трактовка — native app, читающее OS/SIM/locale/timezone, «gains access» к информации терминала даже без сетевой передачи; узкая — provider не «gains access», если результат не покидает локальный execution context. Technology-neutral scope EDPB поддерживает первую; прямого примера local-only server recommendation нет; национальная имплементация и enforcement различаются. Strictly necessary: pro — правильный региональный endpoint часть запрошенной MMO-сессии; contra (сильнее) — игра работает с обычным default/QoS/ручным выбором, автострана лишь удобство → не strictly necessary. Не полагаться на exemption без local counsel. Safest EU path: явный first-run выбор сервера/страны либо предварительное информированное opt-in на автоопределение; минимум — прозрачно описать local-only логику в privacy notice: если никакой controller данные не получает, GDPR-transparency может не срабатывать, но информирование/consent по ePrivacy и fairness остаются; добровольное короткое раскрытие — дешёвый риск-редьюсер.

5. Enforcement и индустриальная практика

[ПРАКТИКА] Из 95 кандидат-строк (1 551 уникальный веб-результат): не найден надёжно задокументированный официальный или first-person кейс, где Google потребовал Approximate location именно из-за getSimCountryIso/getNetworkCountryIso без передачи. Это не доказывает отсутствие таких кейсов; анонимные форумные анекдоты — не policy. Generic-риск реален: несоответствие Data safety фактическому SDK/network traffic ведёт к rejection/suspension, но виновники — IP/GPS/SDK, не country-ISO getter.

СвидетельствоТип / качествоЧто показываетИсточник
Rejection «Data Safety Section: Location — Approximate Location»First-person, публичный трекер — высокоеТриггер — location APIs, декларация не совпала с фактомgithub.com
Rejection Data safety при local-only хранении location из Google Location APIFirst-person Q&A — среднееТриггер — GPS/Location API, не country-ISOstackoverflow.com
Регион-локи по SIM MCC/IP в играхАнонимный блог — низкоеПрактика cross-referencing сигналов, не policyworld.taobao.com

[ПРАКТИКА] Индустрия: Unity Relay по умолчанию использует QoS-замеры; если region omitted — origin network address как heuristic; игрок может выбрать регион — docs.unity.com. Photon-style системы выбирают best region по ping/QoS — doc.photonengine.com. INTLGame queryMyRegion определяет регион/страну по IP — docs.playernetwork.intlgame.com. Практический ranking: latency → client QoS/ping; regulatory/commercial страна → server-side IP/account/store country; zero-server локальная подсказка → locale + timezone; SIM MCC — supplementary, хуже на планшетах/роуминге/dual-SIM и практически недоступен на современном iOS.

6. Изменения за 12 месяцев и горизонт

[ИНТЕРПРЕТАЦИЯ] За период 2025-09-01 — 2026-09-01 подтверждённых изменений именно для данного сценария не найдено. Изменений Android 12–16 и анонсированных будущих ограничений этих country-методов не найдено (на 2026-09-01). Apple CTCarrier/iOS 16.4 и Required Reason enforcement (2024-05-01) старше 12 месяцев. В данных есть Preview-страница политики Play о sensitive permissions/APIs — прямого текста о local-only getter в ней нет, поэтому не связываем — support.google.com.

Checklist перед публикацией

  1. Сначала locale/RegionInfo; timezone — только corroboration; без CTCarrier; telephony — опциональный Android-only сигнал, конфликт → ручной выбор.
  2. Экран первого запуска называет рекомендованный сервер и позволяет сменить.
  3. Кэшировать только serverId + флаг selectionMade; никогда не логировать raw-входы.
  4. Статический/динамический аудит: logcat/proxy/Charles, события Firebase/Analytics/Crashlytics/AdMob, Remote Config, custom headers, crash dumps.
  5. Тесты: no SIM, Wi-Fi-планшет, dual SIM, eSIM, roaming, airplane, work profile, emulator, VPN, KZ-локаль за рубежом и иностранная локаль в KZ.
  6. Ответ Play Data safety — по полному трафику app/SDK; локальный сигнал сам по себе не collection; при последующей передаче переоценить как Approximate location.
  7. App Privacy включает practices SDK; локальный сигнал не даёт label; проверить merged PrivacyInfo.xcprivacy и задекларировать User defaults/CA92.1 при необходимости.
  8. Privacy notice: одна фраза — регион/таймзона устройства читаются и обрабатываются локально исключительно для подсказки начального сервера, наружу уходит только выбранный server ID; данные SDK раскрыть отдельно.
  9. Запуск в ЕС: ручной выбор или предварительное opt-in, либо заключение counsel по национальному Art.5(3).
  10. CI regression guard: запрет полей country/locale/timezone в analytics/network-схемах; повторный policy review каждый релиз.

Рекомендуемая архитектура

  • Android: Locale.getDefault().getCountry() / RegionInfo.CurrentRegion, timezone как fallback-подтверждение; telephony — не использовать без необходимости.
  • iOS: NSLocale.region/countryCode; CTCarrier — никогда.
  • Local-only: код страны не покидает устройство; наружу — только integer serverId.
  • PlayerPrefs хранит serverId + selectionMade, не raw country.
  • Всегда ручная смена сервера; ЕС — явный first-run выбор или opt-in.

Red flags

  • Передача country/locale/timezone в аналитику «на всякий случай» — мгновенно меняет ответ Data safety/App Privacy.
  • Выбор KZ по первому SIM в dual-SIM без подтверждения.
  • «Data Not Collected» для приложения с Firebase/AdMob.
  • Опора на strictly necessary exemption в ЕС без local counsel.
  • Несовпадение merged PrivacyInfo.xcprivacy и фактических вызовов NSUserDefaults.

Метод: compliance-research по первоисточникам на дату среза 2026-09-01. Основа: официальная Android TelephonyManager reference (2 записи + 14 подтверждающих), 32 записи Google Play Help/Policy, 21 запись Apple (App Store Connect, forums, upcoming requirements), 48 записей ePrivacy/EDPB/CJEU, 95 кандидат-строк enforcement/практики из 1 551 уникального веб-результата. Оценки колонок «ePrivacy» и «итоговый риск» в матрице — интерпретация авторов на базе цитируемых правил, не официальная классификация. Страницы без видимой даты обновления помечены как «проверено 2026-09-01». За кадром: языковые дубликаты страниц политик и низкокачественные форумные анекдоты.

This report was generated automatically by Keenable SELECT at a user's request, from publicly available web sources linked herein. Keenable does not review, verify, or endorse its contents and makes no representation as to accuracy, completeness, or timeliness; AI-based extraction may contain errors. Nothing in this report is investment, legal, financial, or other professional advice. All trademarks and referenced content remain the property of their respective owners; no affiliation or endorsement is implied. To report an error, rights concern, or request removal: legal@keenable.ai.

Made withKeenable SELECT · 5,134 pages in 7m 12s · Ask your own questionShare:XLinkedInReddit
Made with Keenable SELECT