Jak używać biblioteki klienta systemu iOS dla usługi Azure Mobile Apps
Omówienie
Ten przewodnik zawiera instrukcje dotyczące wykonywania typowych scenariuszy przy użyciu najnowszego zestawu SDK systemu iOS usługi Azure Mobile Apps. Jeśli dopiero zaczynasz korzystać z usługi Azure Mobile Apps, najpierw ukończ przewodnik Szybki start dotyczący usługi Azure Mobile Apps , aby utworzyć zaplecze, utworzyć tabelę i pobrać wstępnie utworzony projekt Xcode systemu iOS. W tym przewodniku skoncentrujemy się na zestawie SDK systemu iOS po stronie klienta. Aby dowiedzieć się więcej na temat zestawu SDK po stronie serwera dla zaplecza, zobacz Instrukcje dotyczące zestawu SDK serwera.
Dokumentacja referencyjna
Dokumentacja referencyjna zestawu SDK klienta systemu iOS znajduje się tutaj: Dokumentacja klienta usługi Azure Mobile Apps dla systemu iOS.
Obsługiwane platformy
Zestaw SDK systemu iOS obsługuje projekty Objective-C, projekty Swift 2.2 i projekty Swift 2.3 dla systemu iOS w wersji 8.0 lub nowszej.
Uwierzytelnianie "server-flow" używa elementu WebView dla prezentowanego interfejsu użytkownika. Jeśli urządzenie nie może przedstawić interfejsu użytkownika elementu WebView, wymagana jest inna metoda uwierzytelniania spoza zakresu produktu. W związku z tym ten zestaw SDK nie jest odpowiedni dla urządzeń typu watch lub podobnie ograniczonych.
Konfiguracja i wymagania wstępne
W tym przewodniku założono, że utworzono zaplecze z tabelą. W tym przewodniku przyjęto założenie, że tabela ma ten sam schemat co tabele w tych samouczkach. W tym przewodniku założono również, że w kodzie odwołujesz się MicrosoftAzureMobile.framework
do elementu i importujesz MicrosoftAzureMobile/MicrosoftAzureMobile.h
plik .
Instrukcje: tworzenie klienta
Aby uzyskać dostęp do zaplecza usługi Azure Mobile Apps w projekcie, utwórz element MSClient
. Zastąp AppUrl
element adresem URL aplikacji. Możesz pozostawić gatewayURLString
i applicationKey
opróżnić. Jeśli skonfigurujesz bramę na potrzeby uwierzytelniania, wypełnij gatewayURLString
adres URL bramy.
Cel-C:
MSClient *client = [MSClient clientWithApplicationURLString:@"AppUrl"];
Swift:
let client = MSClient(applicationURLString: "AppUrl")
Instrukcje: tworzenie odwołania do tabeli
Aby uzyskać dostęp do danych lub je zaktualizować, utwórz odwołanie do tabeli zaplecza. Zastąp ciąg TodoItem
nazwą tabeli
Cel-C:
MSTable *table = [client tableWithName:@"TodoItem"];
Swift:
let table = client.tableWithName("TodoItem")
Instrukcje: wykonywanie zapytań o dane
Aby utworzyć zapytanie bazy danych, wykonaj zapytanie dotyczące MSTable
obiektu . Poniższe zapytanie pobiera wszystkie elementy w TodoItem
elemencie i rejestruje tekst każdego elementu.
Cel-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"])
}
}
}
Instrukcje: filtrowanie zwróconych danych
Aby filtrować wyniki, dostępnych jest wiele opcji.
Aby filtrować przy użyciu predykatu, użyj elementu i NSPredicate
readWithPredicate
. Następujące filtry zwróciły dane, aby znaleźć tylko niekompletne elementy zadań do wykonania.
Cel-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"])
}
}
}
Instrukcje: korzystanie z zapytania MSQuery
Aby wykonać złożone zapytanie (w tym sortowanie i stronicowanie), utwórz MSQuery
obiekt bezpośrednio lub przy użyciu predykatu:
Cel-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
umożliwia kontrolowanie kilku zachowań zapytań.
- Określanie kolejności wyników
- Ogranicz, które pola mają być zwracane
- Ogranicz liczbę rekordów do zwrócenia
- Określanie łącznej liczby w odpowiedzi
- Określanie niestandardowych parametrów ciągu zapytania w żądaniu
- Stosowanie dodatkowych funkcji
MSQuery
Wykonaj zapytanie, wywołując readWithCompletion
obiekt .
Instrukcje: sortowanie danych za pomocą zapytania MSQuery
Aby posortować wyniki, przyjrzyjmy się przykładowi. Aby posortować według pola "text" rosnąco, a następnie według "complete" malejąco, wywołaj MSQuery
polecenie w następujący sposób:
Cel-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"])
}
}
}
Instrukcje: ograniczanie pól i rozszerzanie parametrów ciągu zapytania przy użyciu zapytania MSQuery
Aby ograniczyć zwracanie pól w zapytaniu, określ nazwy pól we właściwości selectFields . W tym przykładzie zwracany jest tylko tekst i wypełnione pola:
Cel-C:
query.selectFields = @[@"text", @"complete"];
Swift:
query.selectFields = ["text", "complete"]
Aby uwzględnić dodatkowe parametry ciągu zapytania w żądaniu serwera (na przykład ze względu na użycie niestandardowego skryptu po stronie serwera), wypełnij je query.parameters
w następujący sposób:
Cel-C:
query.parameters = @{
@"myKey1" : @"value1",
@"myKey2" : @"value2",
};
Swift:
query.parameters = ["myKey1": "value1", "myKey2": "value2"]
Instrukcje: konfigurowanie rozmiaru strony
W usłudze Azure Mobile Apps rozmiar strony steruje liczbą rekordów pobieranych w czasie z tabel zaplecza. Wywołanie pull
danych spowoduje następnie utworzenie partii danych na podstawie tego rozmiaru strony, dopóki nie będzie więcej rekordów do ściągnięcia.
Rozmiar strony można skonfigurować przy użyciu funkcji MSPullSettings , jak pokazano poniżej. Domyślny rozmiar strony to 50, a poniższy przykład zmienia go na 3.
Ze względu na wydajność można skonfigurować inny rozmiar strony. Jeśli masz dużą liczbę małych rekordów danych, duży rozmiar strony zmniejsza liczbę rund serwera.
To ustawienie steruje tylko rozmiarem strony po stronie klienta. Jeśli klient prosi o większy rozmiar strony niż obsługuje zaplecze usługi Mobile Apps, rozmiar strony jest ograniczony do maksymalnej liczby skonfigurowanych zaplecza do obsługi.
To ustawienie jest również liczbą rekordów danych, a nie rozmiarem bajtu.
W przypadku zwiększenia rozmiaru strony klienta należy również zwiększyć rozmiar strony na serwerze. Zobacz "Instrukcje: dostosowywanie rozmiaru stronicowania tabeli" , aby zapoznać się z krokami, które należy wykonać.
Cel-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)
}
}
Instrukcje: Wstawianie danych
Aby wstawić nowy wiersz tabeli, utwórz element i wywołaj metodę NSDictionary
table insert
. Jeśli schemat dynamiczny jest włączony, zaplecze mobilne Azure App Service automatycznie generuje nowe kolumny na podstawie .NSDictionary
Jeśli id
nie zostanie podana, zaplecze automatycznie wygeneruje nowy unikatowy identyfikator. Podaj własne id
, aby używać adresów e-mail, nazw użytkowników lub własnych wartości niestandardowych jako identyfikatora. Podanie własnego identyfikatora może ułatwić sprzężenia i logikę bazy danych zorientowaną na działalność biznesową.
Zawiera result
nowy element, który został wstawiony. W zależności od logiki serwera może zawierać dodatkowe lub zmodyfikowane dane w porównaniu z danymi przekazanymi do serwera.
Cel-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"])
}
}
Instrukcje: modyfikowanie danych
Aby zaktualizować istniejący wiersz, zmodyfikuj element i wywołaj polecenie update
:
Cel-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"])
}
})
}
Alternatywnie podaj identyfikator wiersza i zaktualizowane pole:
Cel-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"])
}
}
Atrybut musi być ustawiony co najmniej id
podczas wprowadzania aktualizacji.
Instrukcje: usuwanie danych
Aby usunąć element, wywołaj element delete
za pomocą elementu:
Cel-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)
}
}
Możesz też usunąć, podając identyfikator wiersza:
Cel-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)
}
}
Atrybut musi być ustawiony co najmniej id
podczas usuwania.
Instrukcje: wywoływanie niestandardowego interfejsu API
Za pomocą niestandardowego interfejsu API można uwidocznić wszelkie funkcje zaplecza. Nie musi mapować na operację tabeli. Nie tylko zyskujesz większą kontrolę nad wiadomościami, możesz nawet odczytywać/ustawiać nagłówki i zmieniać format treści odpowiedzi.
Aby wywołać niestandardowy interfejs API, wywołaj metodę MSClient.invokeAPI
. Zawartość żądania i odpowiedzi są traktowane jako dane JSON. Aby użyć innych typów multimediów, użyj innego przeciążenia elementu invokeAPI
. Aby wysłać GET
żądanie zamiast POST
żądania, ustaw parametr HTTPMethod
na i parametr body
na "GET"
nil
(ponieważ żądania GET nie mają treści komunikatów). Jeśli niestandardowy interfejs API obsługuje inne czasowniki HTTP, zmień HTTPMethod
odpowiednio.
Cel-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
}
}
Instrukcje: rejestrowanie szablonów wypychanych w celu wysyłania powiadomień międzyplatformowych
Aby zarejestrować szablony, przekaż szablony za pomocą metody client.push RegisterDeviceToken w aplikacji klienckiej.
Cel-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)
}
})
Szablony są typu NSDictionary i mogą zawierać wiele szablonów w następującym formacie:
Cel-C:
NSDictionary *iOSTemplate = @{ @"templateName": @{ @"body": @{ @"aps": @{ @"alert": @"$(message)" } } } };
Swift:
let iOSTemplate = ["templateName": ["body": ["aps": ["alert": "$(message)"]]]]
Wszystkie tagi są usuwane z żądania zabezpieczeń. Aby dodać tagi do instalacji lub szablonów w ramach instalacji, zobacz Praca z zestawem SDK serwera zaplecza platformy .NET dla usługi Azure Mobile Apps. Aby wysyłać powiadomienia przy użyciu tych zarejestrowanych szablonów, należy pracować z interfejsami API usługi Notification Hubs.
Instrukcje: obsługa błędów
Po wywołaniu zaplecza Azure App Service mobilnego blok uzupełniania zawiera NSError
parametr . Gdy wystąpi błąd, ten parametr jest inny niż zero. W kodzie należy sprawdzić ten parametr i obsługiwać błąd zgodnie z potrzebami, jak pokazano w poprzednich fragmentach kodu.
Plik <WindowsAzureMobileServices/MSError.h>
definiuje stałe MSErrorResponseKey
, MSErrorRequestKey
i MSErrorServerItemKey
. Aby uzyskać więcej danych związanych z błędem:
Cel-C:
NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey];
Swift:
let serverItem = error.userInfo[MSErrorServerItemKey]
Ponadto plik definiuje stałe dla każdego kodu błędu:
Cel-C:
if (error.code == MSErrorPreconditionFailed) {
Swift:
if (error.code == MSErrorPreconditionFailed) {
Instrukcje: uwierzytelnianie użytkowników za pomocą biblioteki uwierzytelniania usługi Active Directory
Bibliotekę uwierzytelniania usługi Active Directory (ADAL) można użyć do logowania użytkowników do aplikacji przy użyciu usługi Azure Active Directory. Uwierzytelnianie przepływu klienta przy użyciu zestawu SDK dostawcy tożsamości jest preferowane przy użyciu loginWithProvider:completion:
metody . Uwierzytelnianie przepływu klienta zapewnia bardziej natywny sposób działania środowiska użytkownika i umożliwia dodatkowe dostosowanie.
Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania do usługi AAD, postępując zgodnie z samouczkiem Jak skonfigurować App Service na potrzeby logowania do usługi Active Directory. Pamiętaj, aby ukończyć opcjonalny krok rejestrowania natywnej aplikacji klienckiej. W przypadku systemu iOS zalecamy, aby identyfikator URI przekierowania był w postaci
<app-scheme>://<bundle-id>
. Aby uzyskać więcej informacji, zobacz przewodnik Szybki start dotyczący biblioteki ADAL dla systemu iOS.Zainstaluj bibliotekę ADAL przy użyciu narzędzia Cocoapods. Edytuj plik Podfile, aby uwzględnić następującą definicję, zastępując ciąg YOUR-PROJECT nazwą projektu Xcode:
source 'https://github.com/CocoaPods/Specs.git' link_with ['YOUR-PROJECT'] xcodeproj 'YOUR-PROJECT'
i zasobnik:
pod 'ADALiOS'
Za pomocą terminalu uruchom polecenie
pod install
z katalogu zawierającego projekt, a następnie otwórz wygenerowany obszar roboczy programu Xcode (a nie projekt).Dodaj następujący kod do aplikacji zgodnie z używanym językiem. W każdym z nich należy wykonać następujące zamiany:
- Zastąp ciąg INSERT-AUTHORITY-HERE nazwą dzierżawy, w której zainicjowano obsługę administracyjną aplikacji. Format powinien mieć wartość https://login.microsoftonline.com/contoso.onmicrosoft.com. Tę wartość można skopiować z karty Domena w usłudze Azure Active Directory w Azure Portal.
- Zastąp ciąg INSERT-RESOURCE-ID-HERE identyfikatorem klienta zaplecza aplikacji mobilnej. Identyfikator klienta można uzyskać z karty Zaawansowane w obszarze Ustawienia usługi Azure Active Directory w portalu.
- Zastąp ciąg INSERT-CLIENT-ID-HERE identyfikatorem klienta skopiowanym z natywnej aplikacji klienckiej.
- Zastąp ciąg INSERT-REDIRECT-URI-HERE punktem końcowym /.auth/login/done witryny przy użyciu schematu HTTPS. Ta wartość powinna być podobna do https://contoso.azurewebsites.net/.auth/login/done.
Cel-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)
}
}
}
Instrukcje: uwierzytelnianie użytkowników za pomocą zestawu Sdk usługi Facebook dla systemu iOS
Zestaw SDK usługi Facebook dla systemu iOS umożliwia logowanie użytkowników do aplikacji przy użyciu usługi Facebook. Użycie uwierzytelniania przepływu klienta jest preferowane przy użyciu loginWithProvider:completion:
metody . Uwierzytelnianie przepływu klienta zapewnia bardziej natywny sposób działania środowiska użytkownika i umożliwia dodatkowe dostosowanie.
Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania do serwisu Facebook, wykonując czynności opisane w samouczku How to configure App Service for Facebook login (Jak skonfigurować App Service na potrzeby logowania do serwisu Facebook).
Zainstaluj zestaw Facebook SDK dla systemu iOS, postępując zgodnie z dokumentacją zestawu Sdk usługi Facebook dla systemu iOS — Wprowadzenie. Zamiast tworzyć aplikację, możesz dodać platformę systemu iOS do istniejącej rejestracji.
Dokumentacja serwisu Facebook zawiera kod Objective-C w delegatu aplikacji. Jeśli używasz języka Swift, możesz użyć następujących tłumaczeń dla elementu 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 }
Oprócz dodawania
FBSDKCoreKit.framework
do projektu dodaj również odwołanie doFBSDKLoginKit.framework
elementu w taki sam sposób.Dodaj następujący kod do aplikacji zgodnie z używanym językiem.
Cel-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) } } }
Instrukcje: uwierzytelnianie użytkowników za pomocą usługi Twitter Fabric dla systemu iOS
Usługa Fabric dla systemu iOS umożliwia logowanie użytkowników do aplikacji przy użyciu usługi Twitter. Uwierzytelnianie przepływu klienta jest preferowane przy użyciu loginWithProvider:completion:
metody, ponieważ zapewnia bardziej natywny sposób działania środowiska użytkownika i umożliwia dodatkowe dostosowanie.
Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania w usłudze Twitter, postępując zgodnie z samouczkiem How to configure App Service for Twitter login (Jak skonfigurować App Service na potrzeby logowania do usługi Twitter).
Dodaj sieć szkieletową do projektu, postępując zgodnie z dokumentacją fabric for iOS — Wprowadzenie i konfigurując zestaw TwitterKit.
Uwaga
Domyślnie sieć szkieletowa tworzy aplikację twitterową. Możesz uniknąć tworzenia aplikacji, rejestrując wcześniej utworzony klucz klienta i wpis tajny użytkownika przy użyciu poniższych fragmentów kodu. Alternatywnie możesz zastąpić wartości Klucz klienta i Klucz tajny klienta podane w celu App Service wartościami widocznymi na pulpicie nawigacyjnym sieci szkieletowej. Jeśli wybierzesz tę opcję, pamiętaj, aby ustawić adres URL wywołania zwrotnego na wartość symbolu zastępczego, taką jak
https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback
.Jeśli zdecydujesz się użyć utworzonych wcześniej wpisów tajnych, dodaj następujący kod do delegata aplikacji:
Cel-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 }
Dodaj następujący kod do aplikacji zgodnie z używanym językiem.
Cel-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) } } }
Instrukcje: uwierzytelnianie użytkowników za pomocą zestawu Google Sign-In SDK dla systemu iOS
Zestaw Google Sign-In SDK dla systemu iOS umożliwia logowanie użytkowników do aplikacji przy użyciu konta Google. Firma Google ogłosiła niedawno zmiany w zasadach zabezpieczeń OAuth. Te zmiany zasad będą wymagać użycia zestawu Google SDK w przyszłości.
Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania google, postępując zgodnie z samouczkiem How to configure App Service for Google login tutorial (Jak skonfigurować App Service na potrzeby logowania google).
Zainstaluj zestaw Google SDK dla systemu iOS, postępując zgodnie z dokumentacją dotyczącą usługi Google Sign-In dla systemu iOS — rozpocznij integrowanie . Możesz pominąć sekcję "Uwierzytelnianie przy użyciu serwera zaplecza".
Dodaj następujące elementy do metody delegata
signIn:didSignInForUser:withError:
, zgodnie z używanym językiem.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 // ... }
Upewnij się również, że w delegowaniu aplikacji dodano następujące
application:didFinishLaunchingWithOptions:
elementy, zastępując ciąg "SERVER_CLIENT_ID" tym samym identyfikatorem, który został użyty do skonfigurowania App Service w kroku 1.Objective-C:
[GIDSignIn sharedInstance].serverClientID = @"SERVER_CLIENT_ID";
Swift:
GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
Dodaj następujący kod do aplikacji w interfejsie UIViewController, który implementuje
GIDSignInUIDelegate
protokół zgodnie z używanym językiem. Użytkownik jest wylogowany przed ponownym zalogowaniem, a mimo że nie musisz ponownie wprowadzać poświadczeń, zostanie wyświetlone okno dialogowe zgody. Wywołaj tę metodę tylko wtedy, gdy token sesji wygasł.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() }