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
, MSErrorRequestKey
e 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.
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.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'
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).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.
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.
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.
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 }
Além de adicionar
FBSDKCoreKit.framework
ao seu projeto, adicione também uma referênciaFBSDKLoginKit.framework
da mesma forma.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.
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.
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 }
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.
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.
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".
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 // ... }
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"
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() }