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

Sign in with Apple🔗

Sign in with Apple

Sign in with Apple облегчает пользователям вход в ваши приложения и веб-сайты с использованием их Apple ID. Вместо того чтобы заполнять формы, проверять адреса электронной почты и выбирать новые пароли, они могут использовать Вход в Apple, чтобы создать учетную запись и сразу начать использовать ваше приложение. Для обеспечения максимальной безопасности все учетные записи защищены двухфакторной аутентификацией, и Apple не будет отслеживать активность пользователей в вашем приложении или на веб-сайте.

Sign in with Apple обязателен для внедрения

Согласно Apple App store guidelines, в случаях, если у Вас в проекте есть возможность авторизации через любой сторонний сервис (например, Facebook), то Sign in with Apple должен быть обязательно интегрирован в Ваше приложение.

Чтобы использовать Sign in with Apple, пользователи должны:

  • Иметь iOS 13 и выше.
  • Иметь Apple ID с включенной двухфакторной аутентификацией (2FA).
  • Войти в iCloud на устройстве.

Подробнее смотрите на официальном сайте Apple

Предварительная настройка🔗

Перед началом работы, Вам необходимо настроить сертификаты и ключи в своей учетной записи Apple Developer, чтобы активировать функционал Sign in with Apple. Добавьте Sign in with Apple для своего приложения на странице Certificates, Identifiers & Profiles в личном кабинете разработчика.

Если вы хотите отправлять сообщения электронной почты пользователям

Если вы хотите отправлять сообщения электронной почты пользователям, которые при входе скрыли свой email через службу ретрансляции Apple, вам необходимо зарегистрировать свои исходящие почтовые домены, субдомены или адреса электронной почты. Подробнее читайте на официальном сайте

Также, в XCode проекте во вкладке 'Signing & Capabilities' необходимо добавить Sign in with Apple, для этого:

В Unity

Добавьте код в Unity post build process:

    public class PostBuildProcessSample
    {
        [PostProcessBuild]
        public static void PostProcessBuild(BuildTarget target, string path)
        {
            if (target == BuildTarget.iOS)
            {
#if UNITY_IOS
                string projPath = PBXProject.GetPBXProjectPath(path);
                PBXProject proj = new PBXProject();
                proj.ReadFromString(File.ReadAllText(projPath));

#if UNITY_2019_3_OR_NEWER
                string projectTarget = proj.GetUnityMainTargetGuid();
#else
                string targetName = PBXProject.GetUnityTargetName();
                string projectTarget = proj.TargetGuidByName(targetName);
#endif
                //Adding capabilities
#if UNITY_2019_3_OR_NEWER
                ProjectCapabilityManager projectManager = new ProjectCapabilityManager(projPath, "ios.entitlements", targetGuid: projectTarget);
#else
                ProjectCapabilityManager projectManager = new ProjectCapabilityManager(projPath, "ios.entitlements", targetName);
#endif
                projectManager.AddSignInWithApple();
                projectManager.WriteToFile();
#endif

            }
        }
    }

Или вручную включите его в уже сгенерированном проекте:

Sign in with Apple capability enable

В iOS

В проекте XCode:

Sign in with Apple capability enable

Добавление зависимостей🔗

Далее необходимо добавить в проект MRGS SDK:

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, выберите пакет MRGSAuthentication из списка, затем нажмите "Install"
  • Импортируйте модуль: using MRGS;
  • Загрузите последнюю версию библиотеки. Распакуйте архив.
  • (Для интеграции unitypackage) В Unity нажмите Assets -> Import Package -> Custom Package, и выберите пакет games.my.mrgs.authentication.unitypackage из скачанного архива.
  • (Для интеграции tgz) В Unity нажмите Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакет games.my.mrgs.authentication-<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
  • Выберите модуль MRGSAuthentication из "MRGS Package Collection".
  • Или вы можете выбрать пакет «MRGS» из "MRGS Package Collection" (содержит все модули mrgs в качестве продуктов), а затем выбрать только продукт "MRGS/Authentication".

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

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

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

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".
  • Импортируйте модуль в коде: @import MRGServiceKit; или @import MRGSAuthentication; или #import <MRGSAuthentication/MRGSAuthentication.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 добавьте последнюю версию MRGSAuthentication:

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

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

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

target 'MyProject' do
    pod 'MRGSAuthentication', '~> 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 MRGSAuthentication; или #import <MRGSAuthentication/MRGSAuthentication.h>

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

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

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

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

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

  • В настройках проекта установите флаг -ObjC в поле "Other linker Flags".

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

Добавление кнопки🔗

Затем, Вам необходимо добавить на экран входа кнопку 'Sigh in with Apple', в соответствии с Human interface guidelines.

Пример добавления нативного объекта кнопки (только для iOS)

Пример добавления нативного объекта кнопки:

ASAuthorizationAppleIDButton *appleIDButton = [ASAuthorizationAppleIDButton new];
appleIDButton.frame =  CGRectMake(.0, .0, 200, 100.0);
appleIDButton.cornerRadius = 10;
[self.view addSubview:appleIDButton];
[appleIDButton addTarget:self action:@selector(handleAuthrization:) forControlEvents:UIControlEventTouchUpInside];

Обратите внимание, что Sign in With Apple работает только на iOS 13 и выше, так что перед показом кнопки, необходимо проверить, доступен ли данный функционал на устройстве:

bool isAvailable = MRGSAuthenticationSignInWithApple.Instance.IsFeatureAvailable();
if(isAvailable){
    // Show button
}
bool isAvailable = [[MRGSAuthenticationSignInWithApple sharedInstance] isFeatureAvailable];
if(isAvailable){
    // Show button
}

Работа с MRGSAuthentication интерфейсом🔗

Для работы с Sign in with Apple воспользуйтесь классом MRGSAuthenticationSignInWithApple. Обращаем внимание, что данный класс реализует наш основной протокол MRGSAuthentication, то есть имеет все методы этого протокола. Далее описана стандартная реализация интерфейса MRGSAuthentication:

Делегат🔗

Перед началом работы с API, необходимо установить и реализовать делегат, принимающий обратные вызовы:

// Setting
// 'this' conforms to 'IMRGSAuthenticationDelegate' protocol
MRGSAuthenticationSignInWithApple.Instance.Delegate = this;

// Implementation
// The method that is called when the user has logged out of the social network remotely, or his session has ended.
public void OnAuthenticationProviderDidLogoutUser(MRGSAuthentication provider, MRGSAuthenticationUser user){
    Debug.Log("MRGSAuthentication<Unity> - OnAuthenticationProviderDidLogoutUser: " + user + "\nNetwork: " + provider.SocialId().ToString());
}
// Установка
[MRGSAuthenticationSignInWithApple sharedInstance].delegate = self;

//Реализация
// Метод, который вызывается, когда пользователь удаленно вышел из социальной сети, или его сессия закончилась.
- (void)authenticationProvider:(id<MRGSAuthentication>)provider didLogoutUser:(MRGSAuthenticationUser *)user{
    NSLog(@"User did logout: \n%@", user);
}
// Метод, который вызывается в случае необходимости отображения контроллера для авторизации пользователя.
- (void)shouldPresentAuthorizationController:(UIViewController *)viewController {
    UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
    [rootVC presentViewController:viewController animated:YES completion:nil];
}

Статус🔗

Затем, необходимо проверить статус авторизации (залогинен ли пользователь):

bool isLoggedIn = MRGSAuthenticationSignInWithApple.Instance.IsLoggedIn();
BOOL isLoggedIn = [[MRGSAuthenticationSignInWithApple sharedInstance] isLoggedIn];

Вход🔗

Для обычного входа воспользуйтесь одним из методов:

// If error occured, error object will be non-null
MRGSAuthenticationSignInWithApple.Instance.Login((MRGSError error) => {
    if (error == null) {
        // Auth success
    } 
});

// The response will include an object describing the user and the token, and an error object, if any.
MRGSAuthenticationSignInWithApple.Instance.Login((MRGSAuthenticationCredential credentials, MRGSError error) => {
    Debug.Log("MRGSAuthenticationSignInWithApple:\nCredentials: " + credentials + "\nError:\n" + error);
    if (error == null) {
        // Auth success
    }
});
// В ответе придет только объект ошибки, если она случилась
[[MRGSAuthenticationSignInWithApple sharedInstance] login:^(NSError *error) {
    if (!error) {
        // Auth success
    }
}];

// В ответе придет объект, описывающий пользователя и токен, и объект ошибки, если она случилась
[[MRGSAuthenticationSignInWithApple sharedInstance] loginWithCompletionHandler:^(MRGSAuthenticationCredential *credentials, NSError *error) {
    NSLog(@"Result - %@. Error - %@", credentials, error);
    if (!error) {
        // Auth success
    }
}];

Вход с доп. разрешениями🔗

Также у пользователя можно запросить дополнительные данные:

  • Email
  • Имя

Описание enum'a:

* Email - MRGSAuthenticationSignInWithApple.Scopes.Email
* Имя - MRGSAuthenticationSignInWithApple.Scopes.FullName
* Email - kMRGSAuthenticationSIWAScopeEmail
* Имя - kMRGSAuthenticationSIWAScopeFullName

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

var scopes = new List<string>();
scopes.Add(MRGSAuthenticationSignInWithApple.Scopes.Email);
scopes.Add(MRGSAuthenticationSignInWithApple.Scopes.FullName);

MRGSAuthenticationSignInWithApple.Instance.Login(scopes, (MRGSAuthenticationCredential credentials, MRGSError error) => {
    Debug.Log("MRGSAuthenticationSignInWithApple:\nCredentials: " + credentials + "\nError:\n" + error);
    if (error == null) {
        // Auth success
    }
});
[[MRGSAuthenticationSignInWithApple sharedInstance] loginWithScopes:@[kMRGSAuthenticationSIWAScopeEmail, kMRGSAuthenticationScopeSIWAFullName] completionHandler:^(MRGSAuthenticationCredential *credentials, NSError *error) {
    NSLog(@"Result - %@. Error - %@", credentials, error);
}];

Важно

Поскольку у Sign in with Apple нет метода "выхода", а разрешения нельзя перезапросить пока пользователь не вышел из аккаунта (на момент написания документации механизм таков), то примите во внимание, что лучше сразу запрашивать те данные, которые вам нужны, иначе потом при обновлении у вас не получится дозапросить их.

Валидация полученных данных

После входа через Sign in with Apple приложение получает identityToken (хранится в MRGSAuthenticationAccessToken.AccessToken) и authorizationCode (хранится в MRGSAuthenticationAccessToken.TokenSecret), с помощью токена можно проверить полученные данные(действует 600 секунд), а с помощью кода можно получить refresh token для обновления токена. Данная операция должна производится на стороне проекта. Подробнее можно прочитать на сайте Apple, полезные ссылки также можно посмотреть тут.

Статус авторизации🔗

Чтобы получить всю информацию о текущем состоянии авторизации, информацию пользователя, статусе авторизации, воспользуйтесь методами:

// The information about the user, identifier, name, email, etc.
MRGSAuthenticationSignInWithApple.Instance.GetCurrentUser((MRGSAuthenticationUser user, MRGSError error) => {
    Debug.Log("MRGSAuthenticationSignInWithApple:\User: " + user + "\nError:\n" + error);
    if (error == null) {
        // Work with user data
    }
});

// Information about the token, lifetime, etc.
MRGSAuthenticationSignInWithApple.Instance.GetAccessToken((MRGSAuthenticationAccessToken token, MRGSError error) => {
    Debug.Log("MRGSAuthenticationSignInWithApple:\Token: " + token + "\nError:\n" + error);
    if (error == null) {
        // Work with token info
    }
    else if (error.Code == (int)MRGSAuthenticationErrorCode.ConnectionFailed)
    {
        // No network, try later     
    }
    else
    {
        // Logout user from app (MRGS will logout automatically in SDK)
    }
});
// Возвращается объект, объединяющий в себе информацию о пользователе(идентификатор, имя, email, и др) и о токене.
[[MRGSAuthenticationSignInWithApple sharedInstance] getCredentials:^(MRGSAuthenticationCredential *credentials, NSError *error) {
    NSLog(@"Result - %@. Error - %@", credentials, error);
    if(!error){
        // Credentials data work
    }
}];

// Возвращается отдельно информация о пользователе, идентификатор, имя, email, и др.
[[MRGSAuthenticationSignInWithApple sharedInstance] getCurrentUser:^(MRGSAuthenticationUser *user, NSError *error) {
    NSLog(@"User - %@. Error - %@", user, error);
    if(!error){
        // User data work
    }
}];

// Возвращается отдельно информация о токене, времени жизни и др.
[[MRGSAuthenticationSignInWithApple sharedInstance] getAccessToken:^(MRGSAuthenticationAccessToken *token, NSError *error) {
    if (!error) {
        NSLog(@"getAccessToken result - %@", token);
    } else {
        NSLog(@"getAccessToken error - %@", error);
    }
}];

Выход🔗

Для того, чтобы "выйти" из аккаунта пользователя, воспользуйтесь методом:

MRGSAuthenticationSignInWithApple.Instance.Logout();
[[MRGSAuthenticationSignInWithApple sharedInstance] logout];

Важно

Поскольку у Sign in with Apple нет метода "выхода", то выход осуществляется с помощью удаления данных о сессии у нас. То есть фактически пользователь остается залогинен, но мы считаем, что нет. Единственная возможность выйти - это зайти в настройки системы, и в соответствующем разделе деавторизовать приложение (в таком случае мы вызовем метод делегата didLogoutUser).


Последнее обновление: 2023-10-25
Дата создания: 2020-03-02