Поделиться через


Использование клиентской библиотеки iOS для мобильных приложений Azure

Обзор

В этом руководстве вы узнаете, как выполнять распространенные сценарии с помощью последних пакета SDK для мобильных приложений Azure для iOS. Если вы не знакомы с мобильными приложениями Azure, сначала выполните краткий запуск мобильных приложений Azure для создания серверной части, создания таблицы и скачивания предварительно созданного проекта iOS Xcode. В этом руководстве мы сосредоточимся на клиентском пакете SDK для iOS. Чтобы узнать больше о серверном SDK для бэкенда, см. HOWTOs по серверному SDK.

Справочная документация

Справочная документация для пакета SDK клиента iOS находится здесь: Справочник клиента iOS для приложения Azure Mobile Apps.

Поддерживаемые платформы

Пакет SDK для iOS поддерживает Objective-C проекты, проекты Swift 2.2 и Swift 2.3 для iOS версии 8.0 или более поздней версии.

Авторизация с использованием "серверного потока" использует WebView для представленного пользовательского интерфейса. Если устройство не может представить пользовательский интерфейс WebView, то требуется другой метод проверки подлинности, который находится за пределами области продукта. Таким образом, этот пакет SDK не подходит для устройств типа watch или аналогично ограниченных устройств.

Настройка и предварительные требования

В этом руководстве предполагается, что вы создали серверную часть с таблицей. В этом руководстве предполагается, что таблица имеет ту же схему, что и таблицы в этих руководствах. В этом руководстве также предполагается, что в коде вы ссылаетесь на MicrosoftAzureMobile.framework и импортируете MicrosoftAzureMobile/MicrosoftAzureMobile.h.

Практическое руководство. Создание клиента

Чтобы получить доступ к серверной части мобильных приложений Azure в проекте, создайте MSClient. Замените AppUrl URL-адресом приложения. Вы можете оставить gatewayURLString и applicationKey пустым. Если вы настроили шлюз для проверки подлинности, заполните gatewayURLString URL-адресом шлюза.

Objective-C:

MSClient *client = [MSClient clientWithApplicationURLString:@"AppUrl"];

Swift:

let client = MSClient(applicationURLString: "AppUrl")

Как: Создать ссылку на таблицу

Чтобы получить доступ к данным или обновить их, создайте ссылку на серверную таблицу. Замените TodoItem именем таблицы

Objective-C:

MSTable *table = [client tableWithName:@"TodoItem"];

Swift:

let table = client.tableWithName("TodoItem")

Как выполнить запрос данных

Чтобы создать запрос к базе данных, выполните запрос к объекту MSTable. Следующий запрос получает все элементы в TodoItem и записывает текст каждого элемента.

Objective-C:

[table readWithCompletion:^(MSQueryResult *result, NSError *error) {
        if(error) { // error is nil if no error occurred
                NSLog(@"ERROR %@", error);
        } else {
                for(NSDictionary *item in result.items) { // items is NSArray of records that match query
                        NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
                }
        }
}];

Swift:

table.readWithCompletion { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let items = result?.items {
        for item in items {
            print("Todo Item: ", item["text"])
        }
    }
}

Практическое руководство. Фильтрация возвращаемых данных

Для фильтрации результатов существует множество доступных вариантов.

Чтобы отфильтровать с помощью предиката, используйте NSPredicate и readWithPredicate. Следующие фильтры возвращают данные, чтобы найти только неполные элементы Todo.

Objective-C:

// Create a predicate that finds items where complete is false
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"complete == NO"];
// Query the TodoItem table
[table readWithPredicate:predicate completion:^(MSQueryResult *result, NSError *error) {
        if(error) {
                NSLog(@"ERROR %@", error);
        } else {
                for(NSDictionary *item in result.items) {
                        NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
                }
        }
}];

Swift:

// Create a predicate that finds items where complete is false
let predicate =  NSPredicate(format: "complete == NO")
// Query the TodoItem table
table.readWithPredicate(predicate) { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let items = result?.items {
        for item in items {
            print("Todo Item: ", item["text"])
        }
    }
}

Практическое руководство. Использование MSQuery

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

Objective-C:

MSQuery *query = [table query];
MSQuery *query = [table queryWithPredicate: [NSPredicate predicateWithFormat:@"complete == NO"]];

Swift:

let query = table.query()
let query = table.queryWithPredicate(NSPredicate(format: "complete == NO"))

MSQuery позволяет управлять несколькими поведениями запросов.

  • Указание порядка результатов
  • Ограничение возвращаемых полей
  • Ограничение количества возвращаемых записей
  • Укажите общее количество ответов
  • Указание настраиваемых параметров строки запроса в запросе
  • Применение дополнительных функций

Выполните запрос MSQuery путем вызова readWithCompletion на объекте.

Практическое руководство. Сортировка данных с помощью MSQuery

Чтобы сортировать результаты, рассмотрим пример. Чтобы отсортировать по полю "текст" по возрастанию, а затем по полю "complete" по убыванию, вызовите MSQuery следующим образом:

Objective-C:

[query orderByAscending:@"text"];
[query orderByDescending:@"complete"];
[query readWithCompletion:^(MSQueryResult *result, NSError *error) {
        if(error) {
                NSLog(@"ERROR %@", error);
        } else {
                for(NSDictionary *item in result.items) {
                        NSLog(@"Todo Item: %@", [item objectForKey:@"text"]);
                }
        }
}];

Swift:

query.orderByAscending("text")
query.orderByDescending("complete")
query.readWithCompletion { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let items = result?.items {
        for item in items {
            print("Todo Item: ", item["text"])
        }
    }
}

Практическое руководство. Ограничение полей и расширение параметров строки запроса с помощью MSQuery

Чтобы ограничить возвращаемые поля в запросе, укажите имена полей в свойстве selectFields. В этом примере возвращаются только текстовые и завершенные поля:

Objective-C:

query.selectFields = @[@"text", @"complete"];

Swift:

query.selectFields = ["text", "complete"]

Чтобы включить дополнительные параметры строки запроса в запрос сервера (например, так как пользовательский скрипт на стороне сервера использует их), заполните query.parameters следующим образом:

Objective-C:

query.parameters = @{
    @"myKey1" : @"value1",
    @"myKey2" : @"value2",
};

Swift:

query.parameters = ["myKey1": "value1", "myKey2": "value2"]

Практическое руководство. Настройка размера страницы

С помощью мобильных приложений Azure размер страницы определяет количество записей, извлекаемых за раз из внутренних таблиц. Когда вызывается pull для данных, они будут пакетироваться на основе этого размера страницы до тех пор, пока не останется больше записей для извлечения.

Можно настроить размер страницы с помощью MSPullSettings, как показано ниже. Размер страницы по умолчанию равен 50, а приведенный ниже пример изменяет его на 3.

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

Этот параметр управляет только размером страницы на стороне клиента. Если клиент запрашивает больший размер страницы, чем серверная часть мобильных приложений, размер страницы ограничен максимальной конфигурацией серверной части.

Этот параметр также представляет собой количество записей данных , а не размер в байтах .

При увеличении размера клиентской страницы также следует увеличить размер страницы на сервере. См. "Как: Настройка размера постраничного разбиения таблицы" для выполнения этих действий.

Objective-C:

  MSPullSettings *pullSettings = [[MSPullSettings alloc] initWithPageSize:3];
  [table  pullWithQuery:query queryId:@nil settings:pullSettings
                        completion:^(NSError * _Nullable error) {
                               if(error) {
                    NSLog(@"ERROR %@", error);
                }
                           }];

Swift:

let pullSettings = MSPullSettings(pageSize: 3)
table.pullWithQuery(query, queryId:nil, settings: pullSettings) { (error) in
    if let err = error {
        print("ERROR ", err)
    }
}

Практическое руководство. Вставка данных

Чтобы вставить новую строку таблицы, создайте NSDictionary и вызовите table insert. Если включена динамическая схема, серверная часть службы приложений Azure автоматически создает новые столбцы на основе NSDictionary.

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

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

Objective-C:

NSDictionary *newItem = @{@"id": @"custom-id", @"text": @"my new item", @"complete" : @NO};
[table insert:newItem completion:^(NSDictionary *result, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
    }
}];

Swift:

let newItem = ["id": "custom-id", "text": "my new item", "complete": false]
table.insert(newItem) { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let item = result {
        print("Todo Item: ", item["text"])
    }
}

Практическое руководство. Изменение данных

Чтобы обновить существующую строку, измените элемент и вызовите update:

Objective-C:

NSMutableDictionary *newItem = [oldItem mutableCopy]; // oldItem is NSDictionary
[newItem setValue:@"Updated text" forKey:@"text"];
[table update:newItem completion:^(NSDictionary *result, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
    }
}];

Swift:

if let newItem = oldItem.mutableCopy() as? NSMutableDictionary {
    newItem["text"] = "Updated text"
    table2.update(newItem as [NSObject: AnyObject], completion: { (result, error) -> Void in
        if let err = error {
            print("ERROR ", err)
        } else if let item = result {
            print("Todo Item: ", item["text"])
        }
    })
}

Кроме того, укажите идентификатор строки и обновленное поле:

Objective-C:

[table update:@{@"id":@"custom-id", @"text":"my EDITED item"} completion:^(NSDictionary *result, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item: %@", [result objectForKey:@"text"]);
    }
}];

Swift:

table.update(["id": "custom-id", "text": "my EDITED item"]) { (result, error) in
    if let err = error {
        print("ERROR ", err)
    } else if let item = result {
        print("Todo Item: ", item["text"])
    }
}

Как минимум, при внесении обновлений необходимо задать атрибут id.

Практическое руководство. Удаление данных

Чтобы удалить элемент, вызовите delete с элементом:

Objective-C:

[table delete:item completion:^(id itemId, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item ID: %@", itemId);
    }
}];

Swift:

table.delete(newItem as [NSObject: AnyObject]) { (itemId, error) in
    if let err = error {
        print("ERROR ", err)
    } else {
        print("Todo Item ID: ", itemId)
    }
}

Кроме того, удалите, указав идентификатор строки:

Objective-C:

[table deleteWithId:@"37BBF396-11F0-4B39-85C8-B319C729AF6D" completion:^(id itemId, NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    } else {
        NSLog(@"Todo Item ID: %@", itemId);
    }
}];

Swift:

table.deleteWithId("37BBF396-11F0-4B39-85C8-B319C729AF6D") { (itemId, error) in
    if let err = error {
        print("ERROR ", err)
    } else {
        print("Todo Item ID: ", itemId)
    }
}

Как минимум, при удалении необходимо задать атрибут id.

Практическое руководство. Вызов пользовательского API

С помощью пользовательского API можно предоставлять любые функциональные возможности серверной части. Не обязательно сопоставляться с операцией таблицы. Не только вы получаете больше контроля над обменом сообщениями, вы можете даже читать и задавать заголовки и изменять формат текста ответа.

Чтобы вызвать пользовательский API, вызовите MSClient.invokeAPI. Содержимое запроса и ответа рассматривается как JSON. Чтобы использовать другие типы носителей, можно воспользоваться другой перегрузкой invokeAPI. Чтобы сделать запрос GET вместо запроса POST, задайте параметру HTTPMethod значение "GET" и параметру body значение nil (так как запросы GET не имеют тела сообщений.) Если настраиваемый API поддерживает другие http-команды, измените HTTPMethod соответствующим образом.

Objective-C:

[self.client invokeAPI:@"sendEmail"
                  body:@{ @"contents": @"Hello world!" }
            HTTPMethod:@"POST"
            parameters:@{ @"to": @"bill@contoso.com", @"subject" : @"Hi!" }
               headers:nil
            completion: ^(NSData *result, NSHTTPURLResponse *response, NSError *error) {
                if(error) {
                    NSLog(@"ERROR %@", error);
                } else {
                    // Do something with result
                }
            }];

Swift:

client.invokeAPI("sendEmail",
            body: [ "contents": "Hello World" ],
            HTTPMethod: "POST",
            parameters: [ "to": "bill@contoso.com", "subject" : "Hi!" ],
            headers: nil)
            {
                (result, response, error) -> Void in
                if let err = error {
                    print("ERROR ", err)
                } else if let res = result {
                          // Do something with result
                }
        }

Практическое руководство. Регистрация push-шаблонов для отправки кроссплатформенных уведомлений

Чтобы зарегистрировать шаблоны, передайте шаблоны с помощью метода client.push registerDeviceToken в клиентском приложении.

Objective-C:

[client.push registerDeviceToken:deviceToken template:iOSTemplate completion:^(NSError *error) {
    if(error) {
        NSLog(@"ERROR %@", error);
    }
}];

Swift:

client.push?.registerDeviceToken(NSData(), template: iOSTemplate, completion: { (error) in
    if let err = error {
        print("ERROR ", err)
    }
})

Шаблоны имеют тип NSDictionary и могут содержать несколько шаблонов в следующем формате:

Objective-C:

NSDictionary *iOSTemplate = @{ @"templateName": @{ @"body": @{ @"aps": @{ @"alert": @"$(message)" } } } };

Swift:

let iOSTemplate = ["templateName": ["body": ["aps": ["alert": "$(message)"]]]]

Все теги удаляются из запроса в целях безопасности. Сведения о добавлении тегов в установки или шаблоны см. в статье Работа с пакетом SDK серверного сервера .NET для мобильных приложений Azure. Чтобы отправлять уведомления с помощью этих зарегистрированных шаблонов, обратитесь к API-интерфейсам центров уведомлений .

Как: Обрабатывать ошибки

При вызове серверной части мобильной службы приложений Azure в блоке завершения содержится параметр NSError. При возникновении ошибки этот параметр не является "nil" (пустым значением). В коде необходимо проверить этот параметр и при необходимости обработать ошибку, как показано в приведенных выше фрагментах кода.

Файл <WindowsAzureMobileServices/MSError.h> определяет константы MSErrorResponseKey, MSErrorRequestKeyи MSErrorServerItemKey. Чтобы получить дополнительные данные, связанные с ошибкой, выполните следующие действия.

Objective-C:

NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey];

Swift:

let serverItem = error.userInfo[MSErrorServerItemKey]

Кроме того, файл определяет константы для каждого кода ошибки:

Objective-C:

if (error.code == MSErrorPreconditionFailed) {

Swift:

if (error.code == MSErrorPreconditionFailed) {

Практическое руководство. Проверка подлинности пользователей с помощью библиотеки проверки подлинности Active Directory

Библиотеку проверки подлинности Active Directory (ADAL) можно использовать для входа пользователей в приложение с помощью Azure Active Directory. Проверка подлинности потока клиента с помощью SDK поставщика удостоверений предпочтительнее метода loginWithProvider:completion:. Аутентификация клиентского потока обеспечивает более родной пользовательский интерфейс и возможность дополнительной настройки.

  1. Настройте серверную часть мобильного приложения для входа с помощью AAD, следуя инструкции по настройке службы приложений для авторизации через Active Directory. Обязательно выполните необязательный шаг регистрации собственного клиентского приложения. Для iOS рекомендуется использовать URI перенаправления в форме <app-scheme>://<bundle-id>. Для получения дополнительной информации см. краткое руководство по ADAL для iOS.

  2. Установите ADAL с помощью Cocoapods. Измените podfile, чтобы включить следующее определение, заменив YOUR-PROJECT именем проекта Xcode:

     source 'https://github.com/CocoaPods/Specs.git'
     link_with ['YOUR-PROJECT']
     xcodeproj 'YOUR-PROJECT'
    

    и Pod:

     pod 'ADALiOS'
    
  3. С помощью терминала запустите pod install из каталога, содержащего проект, а затем откройте созданную рабочую область Xcode (а не проект).

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

    • Замените INSERT-AUTHORITY-HERE именем клиента, в котором вы подготовили приложение. Формат должен быть https://login.microsoftonline.com/contoso.onmicrosoft.com. Это значение можно скопировать на вкладке "Домен" в Azure Active Directory на портале Azure.
    • Замените INSERT-RESOURCE-ID-HERE идентификатором клиента для серверной части мобильного приложения. Идентификатор клиента можно получить на вкладке Advanced в разделе параметры Azure Active Directory на портале.
    • Замените INSERT-CLIENT-ID-HERE идентификатором клиента, скопированным из собственного клиентского приложения.
    • Замените INSERT-REDIRECT-URI-HERE конечной точкой вашего сайта /.auth/login/done, используя схему HTTPS. Это значение должно быть похоже на https://contoso.azurewebsites.net/.auth/login/done.

Objective-C:

#import <ADALiOS/ADAuthenticationContext.h>
#import <ADALiOS/ADAuthenticationSettings.h>
// ...
- (void) authenticate:(UIViewController*) parent
            completion:(void (^) (MSUser*, NSError*))completionBlock;
{
    NSString *authority = @"INSERT-AUTHORITY-HERE";
    NSString *resourceId = @"INSERT-RESOURCE-ID-HERE";
    NSString *clientId = @"INSERT-CLIENT-ID-HERE";
    NSURL *redirectUri = [[NSURL alloc]initWithString:@"INSERT-REDIRECT-URI-HERE"];
    ADAuthenticationError *error;
    ADAuthenticationContext *authContext = [ADAuthenticationContext authenticationContextWithAuthority:authority error:&error];
    authContext.parentController = parent;
    [ADAuthenticationSettings sharedInstance].enableFullScreen = YES;
    [authContext acquireTokenWithResource:resourceId
                                    clientId:clientId
                                redirectUri:redirectUri
                            completionBlock:^(ADAuthenticationResult *result) {
                                if (result.status != AD_SUCCEEDED)
                                {
                                    completionBlock(nil, result.error);;
                                }
                                else
                                {
                                    NSDictionary *payload = @{
                                                            @"access_token" : result.tokenCacheStoreItem.accessToken
                                                            };
                                    [client loginWithProvider:@"aad" token:payload completion:completionBlock];
                                }
                            }];
}

Swift:

// add the following imports to your bridging header:
//        #import <ADALiOS/ADAuthenticationContext.h>
//        #import <ADALiOS/ADAuthenticationSettings.h>

func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) {
    let authority = "INSERT-AUTHORITY-HERE"
    let resourceId = "INSERT-RESOURCE-ID-HERE"
    let clientId = "INSERT-CLIENT-ID-HERE"
    let redirectUri = NSURL(string: "INSERT-REDIRECT-URI-HERE")
    var error: AutoreleasingUnsafeMutablePointer<ADAuthenticationError?> = nil
    let authContext = ADAuthenticationContext(authority: authority, error: error)
    authContext.parentController = parent
    ADAuthenticationSettings.sharedInstance().enableFullScreen = true
    authContext.acquireTokenWithResource(resourceId, clientId: clientId, redirectUri: redirectUri) { (result) in
            if result.status != AD_SUCCEEDED {
                completion(nil, result.error)
            }
            else {
                let payload: [String: String] = ["access_token": result.tokenCacheStoreItem.accessToken]
                client.loginWithProvider("aad", token: payload, completion: completion)
            }
        }
}

Практическое руководство. Проверка подлинности пользователей с помощью пакета SDK Facebook для iOS

Вы можете использовать пакет SDK Facebook для iOS для входа пользователей в приложение с помощью Facebook. Использование аутентификации с помощью потока клиента предпочтительнее, чем метод loginWithProvider:completion:. Аутентификация клиентского потока обеспечивает более естественное пользовательское взаимодействие и возможности для дополнительной настройки.

  1. Настройте серверную часть мобильного приложения для входа в систему через Facebook, следуя руководству по настройке App Service для входа в Facebook.

  2. Установите пакет SDK Facebook для iOS, следуя пакету SDK Facebook для iOS — документации по началу работы. Вместо создания приложения можно добавить платформу iOS в существующую регистрацию.

  3. Документация Facebook содержит несколько строк кода Objective-C в App Delegate. Если вы используете Swift, можно использовать следующие переводы для AppDelegate.swift:

    // Add the following import to your bridging header:
    //        #import <FBSDKCoreKit/FBSDKCoreKit.h>
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
        FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
        // Add any custom logic here.
        return true
    }
    
    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
        let handled = FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
        // Add any custom logic here.
        return handled
    }
    
  4. Помимо добавления FBSDKCoreKit.framework в проект, также добавьте ссылку на FBSDKLoginKit.framework таким же образом.

  5. Добавьте следующий код в приложение в соответствии с языком, который вы используете.

    Objective-C:

    #import <FBSDKLoginKit/FBSDKLoginKit.h>
    #import <FBSDKCoreKit/FBSDKAccessToken.h>
    // ...
    - (void) authenticate:(UIViewController*) parent
                completion:(void (^) (MSUser*, NSError*)) completionBlock;
    {
        FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
        [loginManager
            logInWithReadPermissions: @[@"public_profile"]
            fromViewController:parent
            handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
                if (error) {
                    completionBlock(nil, error);
                } else if (result.isCancelled) {
                    completionBlock(nil, error);
                } else {
                    NSDictionary *payload = @{
                                            @"access_token":result.token.tokenString
                                            };
                    [client loginWithProvider:@"facebook" token:payload completion:completionBlock];
                }
            }];
    }
    

    Swift:

    // Add the following imports to your bridging header:
    //        #import <FBSDKLoginKit/FBSDKLoginKit.h>
    //        #import <FBSDKCoreKit/FBSDKAccessToken.h>
    
    func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) {
        let loginManager = FBSDKLoginManager()
        loginManager.logInWithReadPermissions(["public_profile"], fromViewController: parent) { (result, error) in
            if (error != nil) {
                completion(nil, error)
            }
            else if result.isCancelled {
                completion(nil, error)
            }
            else {
                let payload: [String: String] = ["access_token": result.token.tokenString]
                client.loginWithProvider("facebook", token: payload, completion: completion)
            }
        }
    }
    

Практическое руководство. Проверка подлинности пользователей с помощью Twitter Fabric для iOS

Вы можете использовать Fabric для iOS для входа пользователей в приложение с помощью Twitter. Аутентификация с клиентским потоком предпочтительнее, чем использование метода loginWithProvider:completion:, так как она обеспечивает более естественный пользовательский интерфейс и позволяет дополнительную настройку.

  1. Настройте сервер мобильного приложения для входа в Twitter, следуя руководству по настройке Службы приложений для входа в Twitter.

  2. Добавьте Fabric в проект, следуя инструкциям из раздела Fabric для iOS: начало работы, и настройте TwitterKit.

    Примечание.

    По умолчанию Fabric создает для вас приложение Twitter. Вы можете избежать создания приложения, зарегистрируя ключ потребителя и секрет потребителя, созданные ранее с помощью приведенных ниже фрагментов кода. В качестве альтернативы вы можете заменить значения ключа потребителя и секрета потребителя, которые вы предоставляете службе приложений, значениями, которые вы видите на панели мониторинга Fabric . Если этот параметр выбран, обязательно задайте URL-адрес обратного вызова на значение-заполнитель, например https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback.

    Если вы решили использовать созданные ранее секреты, добавьте следующий код в AppDelegate:

    Objective-C:

    #import <Fabric/Fabric.h>
    #import <TwitterKit/TwitterKit.h>
    // ...
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [[Twitter sharedInstance] startWithConsumerKey:@"your_key" consumerSecret:@"your_secret"];
        [Fabric with:@[[Twitter class]]];
        // Add any custom logic here.
        return YES;
    }
    

    Swift:

    import Fabric
    import TwitterKit
    // ...
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
        Twitter.sharedInstance().startWithConsumerKey("your_key", consumerSecret: "your_secret")
        Fabric.with([Twitter.self])
        // Add any custom logic here.
        return true
    }
    
  3. Добавьте следующий код в приложение в соответствии с языком, который вы используете.

    Objective-C:

    #import <TwitterKit/TwitterKit.h>
    // ...
    - (void)authenticate:(UIViewController*)parent completion:(void (^) (MSUser*, NSError*))completionBlock
    {
        [[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) {
            if (session) {
                NSDictionary *payload = @{
                                            @"access_token":session.authToken,
                                            @"access_token_secret":session.authTokenSecret
                                        };
                [client loginWithProvider:@"twitter" token:payload completion:completionBlock];
            } else {
                completionBlock(nil, error);
            }
        }];
    }
    

    Swift:

    import TwitterKit
    // ...
    func authenticate(parent: UIViewController, completion: (MSUser?, NSError?) -> Void) {
        let client = self.table!.client
        Twitter.sharedInstance().logInWithCompletion { session, error in
            if (session != nil) {
                let payload: [String: String] = ["access_token": session!.authToken, "access_token_secret": session!.authTokenSecret]
                client.loginWithProvider("twitter", token: payload, completion: completion)
            } else {
                completion(nil, error)
            }
        }
    }
    

Как: Аутентифицировать пользователей с помощью Google Sign-In SDK для iOS

Пакет SDK для Google Sign-In для iOS можно использовать для входа пользователей в приложение с помощью учетной записи Google. Google недавно объявил об изменениях политик безопасности OAuth. Эти изменения политики потребуют использования пакета SDK Google в будущем.

  1. Настройте серверную часть мобильного приложения для входа в Google, следуя руководству Как настроить App Service для входа в Google.

  2. Установите пакет SDK Google для iOS, следуя Google Sign-In для iOS и начните интеграцию по документации. Можно пропустить раздел "Проверка подлинности с помощью внутреннего сервера".

  3. Добавьте следующий код в метод signIn:didSignInForUser:withError: делегата в соответствии с языком, который вы используете.

    Objective-C:

    NSDictionary *payload = @{
                                @"id_token":user.authentication.idToken,
                                @"authorization_code":user.serverAuthCode
                                };
    
    [client loginWithProvider:@"google" token:payload completion:^(MSUser *user, NSError *error) {
        // ...
    }];
    

    Swift:

    let payload: [String: String] = ["id_token": user.authentication.idToken, "authorization_code": user.serverAuthCode]
    client.loginWithProvider("google", token: payload) { (user, error) in
        // ...
    }
    
  4. Убедитесь, что вы также добавите следующий код в application:didFinishLaunchingWithOptions: в делегате приложения, заменив "SERVER_CLIENT_ID" тем же идентификатором, который использовался для настройки службы приложений на шаге 1.

    Objective-C:

    [GIDSignIn sharedInstance].serverClientID = @"SERVER_CLIENT_ID";
    

    Swift:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. Добавьте следующий код в приложение в UIViewController, который реализует протокол GIDSignInUIDelegate в соответствии с используемым языком. Вы выполнили выход, прежде чем войти снова, и хотя вам не нужно вводить учетные данные еще раз, вы видите окно запроса на согласие. Вызовите этот метод только при истечении срока действия маркера сеанса.

    Objective-C:

    #import <Google/SignIn.h>
    // ...
    - (void)authenticate
    {
            [GIDSignIn sharedInstance].uiDelegate = self;
            [[GIDSignIn sharedInstance] signOut];
            [[GIDSignIn sharedInstance] signIn];
    }
    

    Swift:

    // ...
    func authenticate() {
        GIDSignIn.sharedInstance().uiDelegate = self
        GIDSignIn.sharedInstance().signOut()
        GIDSignIn.sharedInstance().signIn()
    }