Перейти к содержанию

Начало работы с COPPA🔗

Для интеграции COPPA необходимо выполнить несколько простых шагов

Шаг 1. Импортируйте модуль GDPR🔗

  • Добавьте модуль MRGSGDPR

    Unity:

    Добавление в проект (общая инструкция)

    Шаг 1. Добавьте источники

    Для того, чтобы добавить MRGS в проект через Unity Package Manager (доступно с Unity 2018+) просто добавьте в файл Packages/manifest.json раздел scopedRegistries, добавив в него следующую запись:

    {
        "dependencies": {
            ...
        },
        "scopedRegistries": [
                {
                    "name": "MRGS",
                    "url": "https://mrgs-nexus.my.games/repository/mrgs-uninty-plugins/",
                    "scopes": [
                        "games.my.mrgs"
                    ]
                }
        ]
    }
    

    Альтернативно, можно нажать Edit -> Project Settings -> Package Manager -> '+' in scoped registry section, и заполнить поля в соответствии с данными выше.

    Шаг 2. Добавьте зависимость

    • Нажмите Window -> Package Manager -> select 'Packages: MyRegistries' from dropdown list, выберите пакет MRGSGDPR из списка, затем нажмите "Install"
    • Импортируйте модуль: using MRGS;
    • Загрузите последнюю версию библиотеки. Распакуйте архив.
    • (Для интеграции unitypackage) В Unity нажмите Assets -> Import Package -> Custom Package, и выберите пакет games.my.mrgs.gdpr.unitypackage из скачанного архива.
    • (Для интеграции tgz) В Unity нажмите Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакет games.my.mrgs.gdpr-<version>.tgz из скачанного архива.
    • Импортируйте модуль: using MRGS;

    iOS:

    Добавление в проект (общая инструкция)

    Шаг 1. Добавьте зависимости

    Через Package collection

    • В Xcode выберите File > Add Packages
    • Выберите «+» > "Add Swift Package Collection"
    • Вставьте URL: https://mrgs-nexus.my.games/repository/ios-sdks/MRGSPackageCollection.json
    • Выберите модуль MRGSGDPR из "MRGS Package Collection".
    • Или вы можете выбрать пакет «MRGS» из "MRGS Package Collection" (содержит все модули mrgs в качестве продуктов), а затем выбрать только продукт "MRGS/GDPR".

    Отдельными пакетами

    • В Xcode выберите File > Add Packages
    • В строке поиска в правом верхнем углу вставьте URL: https://mrgs-gitea.my.games/mrgs/mrgsgdpr-ios-sdk.git
    • Добавьте модуль в свой проект
    • Или вы можете вставить URL https://mrgs-gitea.my.games/mrgs/ios-sdks.git, чтобы подключить пакет "MRGS", который содержит все модули mrgs в качестве продуктов, а затем выбрать только продукт "MRGS/GDPR".

    Шаг 2. Добавьте поддержку категорий ObjectiveC

    • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
    • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSGDPR; или #import <MRGSGDPR/MRGSGDPR.h>

    Шаг 1. Добавьте источники

    В вашем podfile добавьте источники в начало файла:

    source 'https://github.com/CocoaPods/Specs.git' # For main repo
    source 'https://mrgs-gitea.my.games/mrgs/cocoapods-specs.git'  # For MRGS repo
    

    Шаг 2. Добавьте зависимости

    В target добавьте последнюю версию MRGSGDPR:

    Чтобы добавить через subspecs:

    target 'MyProject' do
        pod 'MRGS', '~> 5.0.0', :subspecs => ['GDPR']
    end
    

    Для добавления через отдельные модули:

    target 'MyProject' do
        pod 'MRGSGDPR', '~> 5.0.0'
    end
    

    Чтобы добавить все модули mrgs:

    target 'MyProject' do
        pod 'MRGS/AllKits', '~> 5.0.0'
    end
    

    Шаг 3. Установите зависимости

    • Выполните pod install (или pod install --repo-update если необходимо)
    • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSGDPR; или #import <MRGSGDPR/MRGSGDPR.h>

    Шаг 1. Добавьте зависимости

    Добавьте зависимость в ваш Cartfile:

    binary "https://mrgs-nexus.my.games/repository/ios-sdks/MRGSGDPR/MRGSGDPR.json" ~> 5.0.0
    

    Шаг 2. Установите зависимости

    • Выполните carthage update --use-xcframeworks
    • Добавьте загруженные фреймворки в свой проект (убедитесь, что опция "do not embed" включена)
    • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
    • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSGDPR; или #import <MRGSGDPR/MRGSGDPR.h>
    • Загрузите последнюю версию библиотеки. Распакуйте архив.
    • Добавьте MRGSGDPR.xcframework из скачанного архива в ваш проект (Перетащите библиотеки в раздел "Linked frameworks and Libraries") (для совместимости в архиве также находится MRGSGDPR.framework - fat framework старого вида)

    • Добавьте bundle с ресурсами:

      • Добавьте MRGSGDPRResources.bundle в проект, перетащив его в структуру проекта.
      • Перейдите к разделу "Copy Bundle Resources" во вкладке "Build Phases", нажмите "+", и выберите необходимый бандл.
    • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".

    • Импортируйте модуль в коде: @import MRGSGDPR; или #import <MRGSGDPR/MRGSGDPR.h>
    • Также, вы можете добавить из архива файлы MRGServiceKit.h и module.modulemap в свой проект, либо в настройках проекта укажите путь до них в разделе Build Settings -> Header search paths. Теперь вместо импорта каждого из наших фреймворков по отдельности, вы можете импортировать только один заголовочный файл: @import MRGServiceKit;

    Android:

    Добавьте зависимость в build.gradle файл:

    dependencies {
        def mrgsVersion = "6.x.x"
    
        implementation "games.my.mrgs:gdpr:$mrgsVersion"
    }
    

    Скопируйте файл MRGSGDPR.aar в директорию libs вашего проекта. Добавьте необходимые зависимости в файл build.gradle

    dependencies {
        //...
        implementation(name: 'MRGSGDPR', ext:'aar')
    
        implementation 'androidx.appcompat:appcompat:1.6.1'
    }
    

Шаг 2. Подготовьте класс🔗

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

MRGSCOPPA.Instance.Setup(APP_ID, APP_SECRET);
[[MRGSCOPPA sharedInstance] setupForAppId:APP_ID andSecret:APP_SECRET];
MRGSCOPPA.getInstance().setUp(APP_ID, APP_SECRET);

Шаг 3. Настройте параметры показа🔗

Затем необходимо выставить все необходимые Вам настройки:

  • disableAccessForUnderagedUsers - запрет пользователям до 13 лет входить в игру (то есть отправлять письма родителям), они увидят окно с текстом о запрете игры(примеры есть на странице описания COPPA)
  • Вы можете переопределить стандартные окна(HTML), заменив нужные из них на свои с помощью методов setCustom<NAME>FilePath.

Пример настройки параметров:

MRGSCOPPA.Instance.Parameters.DisableAccessForUnderagedUsers = true;

MRGSCOPPA.Instance.Parameters.SetCustomBirthdayFilePath("birthday_file_path");
MRGSCOPPA.Instance.Parameters.SetCustomEmailEnterFilePath("email_file_path");
MRGSCOPPA.Instance.Parameters.SetCustomCheckFilePath("check_file_path");
MRGSCOPPA.Instance.Parameters.SetCustomRestrictFilePath("restrict_file_path");
[MRGSCOPPA sharedInstance].parameters.disableAccessForUnderagedUsers = true;

[[MRGSCOPPA sharedInstance].parameters setCustomBirthdayFilePath:[[NSBundle mainBundle] URLForResource:@"custom_coppa_birthday" withExtension:@"html"]];
[[MRGSCOPPA sharedInstance].parameters setCustomEmailEnterFilePath:[[NSBundle mainBundle] URLForResource:@"custom_coppa_email" withExtension:@"html"]];
[[MRGSCOPPA sharedInstance].parameters setCustomCheckFilePath:[[NSBundle mainBundle] URLForResource:@"custom_coppa_check" withExtension:@"html"]];
[[MRGSCOPPA sharedInstance].parameters setCustomRestrictFilePath:[[NSBundle mainBundle] URLForResource:@"custom_coppa_restrict" withExtension:@"html"]];
MRGSCOPPA.getInstance().getParameters().setRestrictEnabled(true);

MRGSCOPPA.getInstance().getParameters().setBirthdayFile("birthday_file_path");
MRGSCOPPA.getInstance().getParameters().setEmailFile("email_file_path");
MRGSCOPPA.getInstance().getParameters().setCheckFile("check_file_path");
MRGSCOPPA.getInstance().getParameters().setRestrictFile("restrict_file_path");
Куда класть кастомный HTML файл?

Для Unity:

Кастомный HTML файл необходимо положить в mainBundle приложения на iOS, и в assets на Android, в методе указать только его название с расширением(либо относительный путь от вышеуказанных директорий). Например "myFile.html" MRGSCOPPA.getInstance().Parameters.SetCustomEmailEnterFilePath("custom_coppa_email.html");

Для iOS:

Кастомный HTML файл вы можете положить в любое удобное место (обычно это mainBundle), а в метод передать полный путь к файлу в формате NSURL). Например:

[[MRGSCOPPA sharedInstance].parameters setCustomEmailEnterFilePath:[[NSBundle mainBundle] URLForResource:@"custom_coppa_email" withExtension:@"html"]];
Для Android:

В assets. В методе указать только его название с расширением(либо относительный путь от вышеуказанных директорий). Например "myFile.html"

Как правильно сверстать кастомный HTML файл?

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

Самое главное, что нужно учесть - переход далее при нажатии на кнопку. При использовании кастомного файла COPPA, мы понимаем,что пора закрывать окно и дергать колбек по GET-параметрам, то есть по наличию в строке запроса после нажатия кнопки ключа checkboxAgree. Пример: HTML/Path.html?checkboxAgree=on&checkboxContact=on. Проще всего это сделать с помощью формы, стандартный механизм позволяет добавить отмеченные поля в GET. Можно взять наш стандартный файл соглашения за основу.

Обратите внимание, что кнопка принятия соглашения должна иметь отклик (визуально реагировать на нажатие), иначе приложение может не пройти ревью.

Важная информация для тех, кто использует COPPA без MRGSGDPR

Для случаев, если проект сам работает с GDPR и не отправляет нам информацию о принятии, то для корректной работы COPPA необходимо будет это сделать - вызвать метод setUserHasAcceptedAgreement. Также обратите внимание, версия соглашения получается с сервера MRGS, поэтому если у вас отличное от MyGames соглашение, необходимо проставлять версию на сайте MRGS.

Шаг 4. Показать окно и обработать результат🔗

Затем воспользуйтесь методом для показа соглашения:

Есть два метода для показа соглашения - один отдаст результат работы в делегат, а другой в лямбда-функцию(блок)(и также в делегат, если установлен).

Получение результата в лямбда-функцию:

MRGSCOPPA.Instance.ShowCOPPAFlowIfNeeded((result, error) =>
{
    if (error == null)
    {
        Debug.Log("COPPA finished with result - " + result);
    }
    else
    {
        Debug.Log("Failed to show COPPA flow with error - " + error);
    }
});
[[MRGSCOPPA sharedInstance] showCOPPAFlowIfNeededAtViewController:controller withCompletion:^(MRGSCOPPAShowResult * _Nonnull result, NSError * _Nonnull error) {
    if(!error){
        NSLog(@"COPPA finished with result - %@", result);
    }else{
        NSLog(@"Failed to show COPPA flow with error - %@",  error);
    }
}];
MRGSCOPPA.getInstance().showCoppaFlowIfNeed(activity, new MRGSCOPPA.OnShowResultCallback() {
    @Override
    public void onShowResult(@Nullable MRGSCOPPAShowResult result, @Nullable MRGSError error) {
        if (error == null) {
            Log.d("MRGSCOPPA", "Success.");
        } else {
            Log.d("MRGSCOPPA", "Failed to show coppa flow. Need to exit app.");
        }
    }
});

Получение результата в делегат:

// 'this' conforms to 'MRGSCOPPA.IShowDelegate' protocol
MRGSCOPPA.Instance.Delegate = this;
MRGSCOPPA.Instance.ShowCOPPAFlowIfNeeded();

// ...
// Delegate implementation
#region COPPA
public void OnFinishedCOPPAFlowWithResult(MRGSCOPPAShowResult result)
{
    Debug.Log("Delegate<Unity>: OnFinishedCOPPAFlowWithResult - " + result);
}

public void OnReceivedErrorWhileShowingCOPPAFlow(MRGSError error)
{
    Debug.Log("Delegate<Unity>: OnReceivedErrorWhileShowingCOPPAFlow - " + error);
}
#endregion
[MRGSCOPPA sharedInstance].delegate = self;
[[MRGSCOPPA sharedInstance] showCOPPAFlowIfNeededAtViewController:controller];

// ...
// Delegate implementation
- (void)didFinishCOPPAFlowWithResult:(nonnull MRGSCOPPAShowResult *)showResult {
    NSLog(@"COPPA finished with result - %@", result);
}

- (void)didReceiveErrorWhileShowingCOPPAFlow:(nonnull NSError *)error {
    NSLog(@"Failed to show COPPA flow with error - %@",  error);
}
MRGSCOPPA.getInstance().setOnShowResultListener(this);
MRGSCOPPA.getInstance().showCoppaFlowIfNeed(activity);

// ...
// Delegate implementation
@Override
void onShowFinished(@NonNull MRGSCOPPAShowResult result){
    // COPPA finished with result
}

@Override
void onShowFailed(@NonNull MRGSError error){
    // Failed to show COPPA flow with error
}

Важно

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

Взаимодействие с GDPR🔗

Если у вы используете MRGSGDPR для показа пользовательского соглашения и хотите использовать MRGSCOPPA, то необходимо учесть базовую логику - показывается сначала COPPA(выбор возраста), а затем GDPR при необходимости. Поэтому нужно сначала показать процесс COPPA, а затем GDPR.

В случае, если вы используете показ GDPR нашими средствами, используя HTML-верстку, то для включения предварительного показа окна COPPA достаточно воспользоваться следующим способом:

// Setting COPPA
MRGSCOPPA.Instance.Parameters.DisableAccessForUnderagedUsers = true;
MRGSCOPPA.Instance.Parameters.SetCustomEmailEnterFilePath("custom_coppa_email.html");

MRGSGDPR.Instance.Setup("<PROJECT_ID>", "<PROJECT_SECRET>");
MRGSGDPRShowParams showParams = new MRGSGDPRShowParams
{
    AutomaticCoppaFlow = true
};
MRGSGDPR.Instance.ShowAgreement(showParams);
// Setting COPPA
MRGSCOPPA.Instance.Parameters.DisableAccessForUnderagedUsers = true;
MRGSCOPPA.Instance.Parameters.SetCustomEmailEnterFilePath("custom_coppa_email.html");

// Setting GDPR part
// ...
MRGSGDPR.getInstance().enableAutomaticCOPPAFlow(APP_ID, APP_SECRET);
// ...

// Showing GDPR
MRGSGDPR.getInstance().showDefaultAgreement(APP_ID);
// Setting COPPA
[MRGSCOPPA sharedInstance].parameters.disableAccessForUnderagedUsers = true;
[[MRGSCOPPA sharedInstance].parameters setCustomEmailEnterFilePath:[[NSBundle mainBundle] URLForResource:@"custom_coppa_email" withExtension:@"html"]];

[[MRGSGDPR sharedInstance] setupWithAppId:<PROJECT_ID> secret:@"<PROJECT_SECRET>"];
MRGSGDPRShowParams* showParams = [[MRGSGDPRShowParams alloc] init];
showParams.automaticCOPPAFlow = true;
[[MRGSGDPR sharedInstance] showAgreementAtViewController:self params:showParams];
// Setting COPPA
[MRGSCOPPA sharedInstance].parameters.disableAccessForUnderagedUsers = true;
[[MRGSCOPPA sharedInstance].parameters setCustomEmailEnterFilePath:[[NSBundle mainBundle] URLForResource:@"custom_coppa_email" withExtension:@"html"]];

// Setting GDPR part
// ...
[[MRGSGDPR sharedInstance] enableAutomaticCOPPAFlowForAppId:APP_ID andSecret:APP_SECRET];
// ...

// Showing GDPR
[[MRGSGDPR sharedInstance] showDefaultAgreementAtViewController:rootController forAppId:APP_ID];
MRGSGDPR.getInstance().showDefaultAgreement(APP_ID);
import android.app.Activity;

import games.my.mrgs.gdpr.MRGSGDPR;
import games.my.mrgs.gdpr.MRGSGDPRShowParams;

// Setting COPPA
MRGSCOPPA.getInstance().getParameters().setRestrictEnabled(true);
MRGSCOPPA.getInstance().getParameters().setEmailFile("file_path");

MRGSGDPR.getInstance().setup(Context, "<PROJECT_ID>", "<PROJECT_SECRET>");

final MRGSGDPRShowParams showParams = new MRGSGDPRShowParams();
showParams.setAutomaticCOPPAFlowEnabled(true);

MRGSGDPR.getInstance().showAgreement(Activity, showParams);
// Setting COPPA
MRGSCOPPA.getInstance().getParameters().setRestrictEnabled(true);
MRGSCOPPA.getInstance().getParameters().setEmailFile("file_path");

// Setting GDPR part
// ...
MRGSGDPR.MRGSGDPRFactory.getMRGSGDPR().enableAutomaticCOPPAFlow(APP_ID, APP_SECRET);
// ...

// Showing GDPR
MRGSGDPR.MRGSGDPRFactory.getMRGSGDPR().showDefaultAgreementAtActivity(activity, APP_ID);

В случае, если вы используете полностью кастомное окно, необходимо вручную сделать последовательный вызов COPPA и GDPR:

// COPPA setup
MRGSCOPPA.Instance.Setup(APP_ID, APP_SECRET);

// Setting COPPA
MRGSCOPPA.Instance.Parameters.DisableAccessForUnderagedUsers = true;
MRGSCOPPA.Instance.Parameters.SetCustomEmailEnterFilePath("custom_coppa_email.html");

// Showing COPPA
MRGSCOPPA.Instance.ShowCOPPAFlowIfNeeded((result, error) =>
{
    if (error == null)
    {
        // Showing GDPR flow
        <CURRENT_SHOW_GDPR_FLOW>
    }
    else
    {
        Debug.Log("Failed to show COPPA flow with error - " + error);
    }
});
// COPPA setup
[[MRGSCOPPA sharedInstance] setupForAppId:APP_ID andSecret:APP_SECRET];

// Setting COPPA
[MRGSCOPPA sharedInstance].parameters.disableAccessForUnderagedUsers = true;
[[MRGSCOPPA sharedInstance].parameters setCustomEmailEnterFilePath:[[NSBundle mainBundle] URLForResource:@"custom_coppa_email" withExtension:@"html"]];

// Showing COPPA
[[MRGSCOPPA sharedInstance] showCOPPAFlowIfNeededAtViewController:controller withCompletion:^(MRGSCOPPAShowResult * _Nonnull result, NSError * _Nonnull error) {
    if(!error){
        // Showing GDPR flow
        <CURRENT_SHOW_GDPR_FLOW>
    }else{
        NSLog(@"Failed to show COPPA flow with error - %@",  error);
    }
}];
// COPPA setup
MRGSCOPPA.getInstance().setUp(APP_ID, APP_SECRET);

// Setting COPPA
MRGSCOPPA.getInstance().getParameters().setRestrictEnabled(true);
MRGSCOPPA.getInstance().getParameters().setEmailFile("file_path");

// Showing COPPA
MRGSCOPPA.getInstance().showCoppaFlowIfNeed(activity, new MRGSCOPPA.OnShowResultCallback() {
    @Override
    public void onShowResult(@Nullable MRGSCOPPAShowResult result, @Nullable MRGSError error) {
        if (error == null) {
            // Showing GDPR flow
            <CURRENT_SHOW_GDPR_FLOW>
        } else {
            Log.d("MRGSCOPPA", "Failed to show coppa flow. Need to exit app.");
        }
    }
});

Последнее обновление: 2025-01-21
Дата создания: 2021-09-04