Como utilizar a biblioteca de clientes do iOS para aplicações móveis Azure

Descrição Geral

Este guia ensina-o a realizar cenários comuns utilizando as mais recentes Aplicações Móveis IOS SDK. Se é novo no Azure Mobile Apps, primeiro complete o Azure Mobile Apps Quick Start para criar um backend, criar uma tabela e descarregar um projeto iOS Xcode pré-construído. Neste guia, focamo-nos no iOS SDK do lado do cliente. Para saber mais sobre o SDK do lado do servidor para o backend, consulte os SDK HOWTOs do servidor.

Documentação de referência

A documentação de referência para o cliente iOS SDK está localizada aqui: Azure Mobile Apps iOS Client Reference.

Plataformas Suportadas

O iOS SDK apoia projetos Objective-C, projetos Swift 2.2 e Projetos Swift 2.3 para as versões iOS 8.0 ou posterior.

A autenticação "servidor-flow" utiliza um WebView para a UI apresentada. Se o dispositivo não for capaz de apresentar um UI WebView, então é necessário outro método de autenticação que esteja fora do âmbito do produto. Este SDK não é, portanto, adequado para dispositivos do tipo Watch ou dispositivos igualmente restritos.

Configuração e Pré-Requisitos

Este guia assume que criou um backend com uma mesa. Este guia assume que a mesa tem o mesmo esquema que as mesas nesses tutoriais. Este guia também assume que, no seu código, refere-se MicrosoftAzureMobile.framework e importa MicrosoftAzureMobile/MicrosoftAzureMobile.h.

Como: Criar Cliente

Para aceder a um backend Azure Mobile Apps no seu projeto, crie um MSClient. Substitua-o AppUrl pelo URL da aplicação. Pode sair gatewayURLString e applicationKey ficar vazio. Se configurar uma porta de entrada para a autenticação, preencha gatewayURLString com o URL do gateway.

Objetivo C:

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

Rápido:

let client = MSClient(applicationURLString: "AppUrl")

Como: Criar Referência de Tabela

Para atualizar ou aceder a dados, crie uma referência para a tabela de back-end. Substitua TodoItem pelo nome da sua tabela

Objetivo C:

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

Rápido:

let table = client.tableWithName("TodoItem")

Como: Dados de Consulta

Para criar uma consulta de base de dados, consultar o MSTable objeto. A seguinte consulta recebe todos os itens e TodoItem regista o texto de cada item.

Objetivo 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"]);
                }
        }
}];

Rápido:

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"])
        }
    }
}

Como: Filtrar dados devolvidos

Para filtrar os resultados, existem muitas opções disponíveis.

Para filtrar utilizando um predicado, use um NSPredicate e readWithPredicate. Os seguintes filtros devolveram dados para encontrar apenas itens incompletos de Todo.

Objetivo 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"]);
                }
        }
}];

Rápido:

// 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"])
        }
    }
}

Como: Usar o MSQuery

Para realizar uma consulta complexa (incluindo triagem e paging), crie um MSQuery objeto, diretamente ou utilizando um predicado:

Objetivo C:

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

Rápido:

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

MSQuery permite controlar vários comportamentos de consulta.

  • Especificar a ordem dos resultados
  • Limite quais os campos a devolver
  • Limite quantos registos para devolver
  • Especificar a contagem total em resposta
  • Especifique parâmetros de cadeia de consulta personalizadas a pedido
  • Aplicar funções adicionais

Execute uma MSQuery consulta chamando readWithCompletion o objeto.

Como: Classificar dados com MSQuery

Para classificar resultados, vejamos um exemplo. Para ordenar por campo 'texto' ascendente, em seguida, descendo 'completo', invocar MSQuery assim:

Objetivo 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"]);
                }
        }
}];

Rápido:

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"])
        }
    }
}

Como: Limitar campos e expandir parâmetros de cadeia de consulta com MSQuery

Para limitar os campos a serem devolvidos numa consulta, especifique os nomes dos campos na propriedade selectFields . Este exemplo devolve apenas o texto e os campos completos:

Objetivo C:

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

Rápido:

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

Para incluir parâmetros de cadeia de consulta adicionais no pedido do servidor (por exemplo, porque um script personalizado do lado do servidor os utiliza), povoa query.parameters assim:

Objetivo C:

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

Rápido:

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

Como: Configurar tamanho da página

Com as Aplicações Móveis Azure, o tamanho da página controla o número de registos que são retirados de cada vez das tabelas de backend. Uma chamada para os pull dados iria então reunir dados, com base no tamanho desta página, até que não haja mais registos para puxar.

É possível configurar um tamanho de página usando MSPullSettings como mostrado abaixo. O tamanho da página predefinido é de 50, e o exemplo abaixo muda-o para 3.

Pode configurar um tamanho de página diferente por razões de desempenho. Se tiver um grande número de pequenos registos de dados, um tamanho de página elevado reduz o número de viagens de ida e volta do servidor.

Esta definição controla apenas o tamanho da página do lado do cliente. Se o cliente pedir um tamanho de página maior do que o suporte de backend mobile Apps, o tamanho da página é limitado no máximo o backend é configurado para suportar.

Esta definição é também o número de registos de dados, não o tamanho do byte.

Se aumentar o tamanho da página do cliente, também deverá aumentar o tamanho da página no servidor. Consulte "Como: Ajuste o tamanho da paging da mesa" para os passos para o fazer.

Objetivo C:

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

Rápido:

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

Como: Inserir Dados

Para inserir uma nova linha de mesa, crie uma NSDictionary e invoque table insert. Se o Esquema Dinâmico estiver ativado, o backend móvel Serviço de Aplicações do Azure gera automaticamente novas colunas com base no NSDictionary.

Se id não for fornecido, o backend gera automaticamente um novo ID único. Forneça os seus próprios id endereços de e-mail, nomes de utilizadores ou os seus próprios valores personalizados como ID. Desde que o seu próprio ID possa facilitar a lógica de base de dados orientada para o negócio.

Contém result o novo item que foi inserido. Dependendo da lógica do seu servidor, pode ter dados adicionais ou modificados em comparação com o que foi passado para o servidor.

Objetivo 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"]);
    }
}];

Rápido:

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"])
    }
}

Como: Modificar dados

Para atualizar uma linha existente, modifique um item e ligue update:

Objetivo 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"]);
    }
}];

Rápido:

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"])
        }
    })
}

Em alternativa, forneça o ID da linha e o campo atualizado:

Objetivo 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"]);
    }
}];

Rápido:

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"])
    }
}

No mínimo, o id atributo deve ser definido ao escoar atualizações.

Como: Eliminar Dados

Para eliminar um item, invoque delete com o item:

Objetivo C:

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

Rápido:

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

Em alternativa, elimine fornecendo um ID de linha:

Objetivo C:

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

Rápido:

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

No mínimo, o id atributo deve ser definido ao escoar as eliminações.

Como: Chamar API personalizada

Com uma API personalizada, pode expor qualquer funcionalidade de backend. Não tem de mapear uma operação de mesa. Não só ganha mais controlo sobre as mensagens, como pode até ler/definir cabeçalhos e alterar o formato do corpo de resposta.

Para chamar uma API personalizada, ligue MSClient.invokeAPI. O conteúdo do pedido e resposta é tratado como JSON. Para utilizar outros tipos de mídia, utilize a outra sobrecarga de invokeAPI. Para fazer um GET pedido em vez de um POST pedido, definir o parâmetro HTTPMethod"GET" e o parâmetro body para nil (uma vez que os pedidos GET não têm corpos de mensagens.) Se a sua API personalizada suportar outros verbos HTTP, altere HTTPMethod adequadamente.

Objetivo 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
                }
            }];

Rápido:

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
                }
        }

Como: Registar modelos de pressão para enviar notificações de plataformas cruzadas

Para registar modelos, passe os modelos com o método de registo de cliente.pushDeviceToken na sua aplicação do cliente.

Objetivo C:

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

Rápido:

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

Os seus modelos são do tipo NSDictionary e podem conter vários modelos no seguinte formato:

Objetivo C:

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

Rápido:

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

Todas as etiquetas são retiradas do pedido de segurança. Para adicionar tags a instalações ou modelos dentro de instalações, consulte Trabalhar com o servidor de backend SDK .NET para aplicações móveis Azure. Para enviar notificações usando estes modelos registados, trabalhe com APIs de Centros de Notificação.

Como: Lidar com erros

Quando se chama um backend móvel Serviço de Aplicações do Azure, o bloco de conclusão contém um NSError parâmetro. Quando ocorre um erro, este parâmetro não é nulo. No seu código, deverá verificar este parâmetro e lidar com o erro conforme necessário, como demonstrado nos cortes de código anteriores.

O ficheiro <WindowsAzureMobileServices/MSError.h> define as constantes MSErrorResponseKey, MSErrorRequestKeye MSErrorServerItemKey. Para obter mais dados relacionados com o erro:

Objetivo C:

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

Rápido:

let serverItem = error.userInfo[MSErrorServerItemKey]

Além disso, o ficheiro define constantes para cada código de erro:

Objetivo C:

if (error.code == MSErrorPreconditionFailed) {

Rápido:

if (error.code == MSErrorPreconditionFailed) {

Como: Autenticar os utilizadores com a Biblioteca de Autenticação de Diretório Ativo

Pode utilizar a Biblioteca de Autenticação de Diretório Ativo (ADAL) para inscrever os utilizadores na sua aplicação utilizando o Diretório Ativo Azure. A autenticação do fluxo do cliente utilizando um fornecedor de identidade SDK é preferível a usar o loginWithProvider:completion: método. A autenticação do fluxo do cliente proporciona uma sensação de UX mais nativa e permite uma personalização adicional.

  1. Configure o backend da sua aplicação móvel para o login da AAD seguindo o como configurar Serviço de Aplicações para tutorial de login do Ative Directory. Certifique-se de completar o passo opcional de registo de uma aplicação de cliente nativo. Para o iOS, recomendamos que o URI de redirecionamento seja do formulário <app-scheme>://<bundle-id>. Para mais informações, consulte o arranque rápido do IOS da ADAL.

  2. Instale o ADAL utilizando cacau. Edite o seu Podfile para incluir a seguinte definição, substituindo o SEU PROJETO pelo nome do seu projeto Xcode:

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

    e a Cápsula:

     pod 'ADALiOS'
    
  3. Utilizando o Terminal, corra pod install a partir do diretório que contém o seu projeto e, em seguida, abra o espaço de trabalho gerado xcode (não o projeto).

  4. Adicione o seguinte código à sua aplicação, de acordo com o idioma que está a utilizar. Em cada uma, faça estas substituições:

    • Substitua INSERT-AUTHORITY-HERE pelo nome do arrendatário em que aprovisionou o seu pedido. O formato deve ser https://login.microsoftonline.com/contoso.onmicrosoft.com. Este valor pode ser copiado a partir do separador Domínio no seu Diretório Ativo Azure no portal do Azure.
    • Substitua o INSERT-RESOURCE-ID-HERE pelo ID do cliente para o seu backend da aplicação móvel. Pode obter o ID do cliente a partir do separador Avançado em Azure Ative Directory Settings no portal.
    • Substitua INSERT-CLIENT-ID-HERE pelo ID do cliente que copiou da aplicação do cliente nativo.
    • Substitua o INSERT-REDIRECT-URI-HERE pelo ponto final do seu site /.auth/login/done, utilizando o esquema HTTPS. Este valor deve ser semelhante a https://contoso.azurewebsites.net/.auth/login/done.

Objetivo 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];
                                }
                            }];
}

Rápido:

// 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)
            }
        }
}

Como: Autenticar utilizadores com o Facebook SDK para iOS

Pode utilizar o SDK do Facebook para iniciar sísem os utilizadores na sua aplicação através do Facebook. A autenticação do fluxo do cliente é preferível à utilização do loginWithProvider:completion: método. A autenticação do fluxo do cliente proporciona uma sensação de UX mais nativa e permite uma personalização adicional.

  1. Configure o backend da sua aplicação móvel para o login do Facebook seguindo o Como configurar Serviço de Aplicações para o tutorial de login do Facebook.

  2. Instale o SDK do Facebook para iOS seguindo o SDK do Facebook para iOS - Introdução documentação. Em vez de criar uma aplicação, pode adicionar a plataforma iOS ao seu registo existente.

  3. A documentação do Facebook inclui algum código Objective-C no Delegado da App. Se estiver a utilizar o Swift, pode utilizar as seguintes traduções para AppDeegate.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. Além de adicionar FBSDKCoreKit.framework ao seu projeto, adicione também uma referência FBSDKLoginKit.framework da mesma forma.

  5. Adicione o seguinte código à sua aplicação, de acordo com o idioma que está a utilizar.

    Objetivo 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];
                }
            }];
    }
    

    Rápido:

    // 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)
            }
        }
    }
    

Como: Autenticar utilizadores com Tecido twitter para iOS

Pode utilizar o Fabric para iOS para iniciar a sua aplicação através do Twitter. A autenticação do Fluxo do Cliente é preferível à utilização do loginWithProvider:completion: método, pois proporciona uma sensação de UX mais nativa e permite uma personalização adicional.

  1. Configure o backend da sua aplicação móvel para o início do Twitter seguindo o Como configurar Serviço de Aplicações para o tutorial de login do Twitter.

  2. Adicione o Tecido ao seu projeto seguindo o Tecido para iOS - Introdução documentação e configurando o TwitterKit.

    Nota

    Por padrão, a Fabric cria uma aplicação do Twitter para si. Pode evitar criar uma aplicação registando a Chave do Consumidor e o Segredo do Consumidor que criou anteriormente utilizando os seguintes cortes de código. Em alternativa, pode substituir a Chave do Consumidor e os valores secretos do consumidor que fornece para Serviço de Aplicações pelos valores que vê no Painel de Tecidos. Se escolher esta opção, certifique-se de que define o URL de retorno para um valor reservado, como https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback.

    Se optar por utilizar os segredos que criou anteriormente, adicione o seguinte código ao seu Delegado de Aplicação:

    Objetivo 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;
    }
    

    Rápido:

    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. Adicione o seguinte código à sua aplicação, de acordo com o idioma que está a utilizar.

    Objetivo 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);
            }
        }];
    }
    

    Rápido:

    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)
            }
        }
    }
    

Como: Autenticar os utilizadores com o Google Sign-In SDK para iOS

Pode utilizar o Google Sign-In SDK para que o iOS inscreva utilizadores na sua aplicação através de uma conta google. A Google anunciou recentemente alterações às suas políticas de segurança da OAuth. Estas mudanças de política exigirão a utilização do Google SDK no futuro.

  1. Configure o backend da sua aplicação móvel para o login do Google seguindo o Como configurar Serviço de Aplicações para o tutorial de login do Google.

  2. Instale o Google SDK para iOS seguindo o Google Sign-In para iOS - Comece a integrar a documentação. Pode saltar a secção "Autenticar com um Servidor de Backend".

  3. Adicione o seguinte ao método do signIn:didSignInForUser:withError: seu delegado, de acordo com o idioma que está a usar.

    Objetivo C:

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

    Rápido:

    let payload: [String: String] = ["id_token": user.authentication.idToken, "authorization_code": user.serverAuthCode]
    client.loginWithProvider("google", token: payload) { (user, error) in
        // ...
    }
    
  4. Certifique-se de que também adiciona o seguinte no application:didFinishLaunchingWithOptions: seu delegado de aplicação, substituindo "SERVER_CLIENT_ID" pelo mesmo ID que usou para configurar Serviço de Aplicações no passo 1.

    Objetivo C:

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

    Rápido:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. Adicione o seguinte código à sua aplicação num UIViewController que implementa o GIDSignInUIDelegate protocolo, de acordo com o idioma que está a utilizar. Você está assinado antes de ser assinado novamente, e embora não precise de inserir as suas credenciais novamente, você vê um diálogo de consentimento. Só chame este método quando o token da sessão tiver expirado.

    Objetivo C:

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

    Rápido:

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