Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przegląd
Ten przewodnik zawiera instrukcje dotyczące wykonywania typowych scenariuszy przy użyciu najnowszej zestawu SDK usługi Azure Mobile Apps dla systemu iOS. Jeśli dopiero zaczynasz korzystać z usługi Azure Mobile Apps, najpierw ukończ Szybki Start Azure Mobile Apps, aby utworzyć zaplecze, stworzyć tabelę i pobrać gotowy projekt Xcode dla systemu iOS. W tym przewodniku skupiamy się na klienckiej wersji SDK dla systemu iOS. 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 iOS SDK 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 do wyświetlania interfejsu użytkownika. Jeśli urządzenie nie może przedstawić interfejsu WebView, wymagana jest inna metoda uwierzytelniania, która jest niezależna od produktu. Ten zestaw SDK nie jest zatem 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 założono, że tabela ma ten sam schemat co tabele w tych samouczkach. W tym przewodniku założono, że w kodzie odwołujesz się do MicrosoftAzureMobile.framework
i importujesz MicrosoftAzureMobile/MicrosoftAzureMobile.h
.
Instrukcje: tworzenie klienta
Aby uzyskać dostęp w swoim projekcie do zaplecza usługi Azure Mobile Apps, utwórz MSClient
. Zastąp AppUrl
adresem URL aplikacji. Możesz pozostawić gatewayURLString
i applicationKey
puste. Jeśli skonfigurujesz bramę na potrzeby uwierzytelniania, wypełnij gatewayURLString
adresem URL bramy.
Objective-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 zaktualizować je, utwórz odwołanie do tabeli zaplecza. Zastąp TodoItem
nazwą tabeli
Objective-C:
MSTable *table = [client tableWithName:@"TodoItem"];
Swift:
let table = client.tableWithName("TodoItem")
Instrukcje: wykonywanie zapytań o dane
Aby utworzyć zapytanie bazy danych, wykonaj zapytanie względem obiektu MSTable
. Poniższe zapytanie pobiera wszystkie elementy w TodoItem
i rejestruje tekst każdego elementu.
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"])
}
}
}
Instrukcje: filtrowanie zwróconych danych
Aby filtrować wyniki, dostępnych jest wiele opcji.
Aby filtrować przy użyciu predykatu, użyj NSPredicate
i readWithPredicate
. Następujące filtry zwróciły dane, aby znaleźć tylko niekompletne zadania.
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"])
}
}
}
Instrukcje: używanie zapytania MSQuery
Aby wykonać złożone zapytanie (w tym sortowanie i stronicowanie), utwórz obiekt MSQuery
bezpośrednio lub przy użyciu predykatu:
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
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
Wykonaj zapytanie MSQuery
, wywołując readWithCompletion
w obiekcie.
Instrukcje: sortowanie danych za pomocą zapytania MSQuery
Aby posortować wyniki, przyjrzyjmy się przykładowi. Aby posortować rosnąco według pola 'text', a następnie malejąco według 'complete', wywołaj MSQuery
w następujący sposób:
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"])
}
}
}
Instrukcje: ograniczanie pól i rozwijanie parametrów ciągu zapytania za pomocą zapytania MSQuery
Aby ograniczyć zwracane pola w zapytaniu, określ nazwy pól w właściwości selectFields. W tym przykładzie zwracany jest tylko tekst i wypełnione pola:
Objective-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 query.parameters
w następujący sposób:
Objective-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 kontroluje liczbę rekordów, które są pobierane jednocześnie z tabel zaplecza. Wywołanie pull
danych spowoduje 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 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 backend usługi Mobile Apps, rozmiar strony jest ograniczony do maksymalnego poziomu skonfigurowanego przez backend.
To ustawienie również oznacza liczbę rekordów danych, a nie rozmiar bajtów .
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ć.
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)
}
}
Instrukcje: Wstawianie danych
Aby wstawić nowy wiersz tabeli, utwórz NSDictionary
i wywołaj table insert
. Jeśli Dynamic Schema jest włączony, zaplecze mobilne usługi Azure App Service automatycznie generuje nowe kolumny na podstawie NSDictionary
.
Jeśli nie podano id
, zaplecze automatycznie generuje nowy unikatowy identyfikator. Podaj własne id
do używania 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ę baz danych zorientowaną na działalność biznesową.
result
zawiera nowy element, który został wstawiony. W zależności od logiki serwera może mieć dodatkowe lub zmodyfikowane dane w porównaniu z danymi przekazanymi do serwera.
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"])
}
}
Instrukcje: modyfikowanie danych
Aby zaktualizować istniejący wiersz, zmodyfikuj element i wywołaj 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"])
}
})
}
Alternatywnie podaj identyfikator wiersza i zaktualizowane pole:
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"])
}
}
Atrybut id
należy ustawić co najmniej podczas wprowadzania aktualizacji.
Instrukcje: usuwanie danych
Aby usunąć element, wywołaj delete
za pomocą elementu:
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)
}
}
Możesz też usunąć, podając identyfikator wiersza:
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)
}
}
Atrybut id
należy ustawić co najmniej podczas usuwania.
Instrukcje: wywoływanie niestandardowego interfejsu API
Za pomocą niestandardowego interfejsu API można uwidocznić dowolne funkcje zaplecza. Nie musi być powiązane z operacją tabeli. Nie tylko zyskujesz większą kontrolę nad obsługą komunikatów, 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 jest traktowana jako JSON. Aby użyć innych typów multimediów, należy użyć innego przeciążenia invokeAPI
. Aby wysłać żądanie GET
zamiast żądania POST
, ustaw parametr HTTPMethod
"GET"
i parametr body
na nil
(ponieważ żądania GET nie mają treści komunikatów). Jeśli niestandardowy interfejs API obsługuje inne czasowniki HTTP, zmień HTTPMethod
odpowiednio.
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
}
}
Jak: Rejestrowanie szablonów powiadomień push do wysyłania powiadomień cross-platformowych
Aby zarejestrować szablony, przekaż szablony za pomocą metody client.push registerDeviceToken w aplikacji klienckiej.
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)
}
})
Szablony są typu NSDictionary i mogą zawierać wiele szablonów w następującym formacie:
Objective-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 serwerowym zestawem SDK zaplecza platformy .NET dla usługi Azure Mobile Apps. Aby wysyłać powiadomienia przy użyciu tych zarejestrowanych szablonów, użyj Notification Hubs API.
Instrukcje: obsługa błędów
Podczas wywoływania zaplecza mobilnego usługi Azure App Service blok uzupełniania zawiera parametr NSError
. W przypadku wystąpienia błędu ten parametr jest inny niż zero. W kodzie należy sprawdzić ten parametr i obsłużyć 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:
Objective-C:
NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey];
Swift:
let serverItem = error.userInfo[MSErrorServerItemKey]
Ponadto plik definiuje stałe dla każdego kodu błędu:
Objective-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 względem metody loginWithProvider:completion:
. 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 wykonać opcjonalny krok rejestrowania natywnej aplikacji klienckiej. W przypadku systemu iOS zalecamy, aby identyfikator URI przekierowania był w formie
<app-scheme>://<bundle-id>
. Aby uzyskać więcej informacji, zobacz Szybki start ADAL dla systemu iOS.Zainstaluj bibliotekę ADAL przy użyciu platformy Cocoapods. Edytuj plik Podfile, aby uwzględnić następującą definicję, zastępując YOUR-PROJECT nazwą projektu Xcode:
source 'https://github.com/CocoaPods/Specs.git' link_with ['YOUR-PROJECT'] xcodeproj 'YOUR-PROJECT'
i moduł:
pod 'ADALiOS'
Za pomocą terminalu uruchom
pod install
z katalogu zawierającego projekt, a następnie otwórz wygenerowany obszar roboczy 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 INSERT-AUTHORITY-HERE nazwą dzierżawy, w której udostępniłeś swoją aplikację. 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 portalu Azure.
- Zastąp INSERT-RESOURCE-ID-HERE identyfikatorem klienta zaplecza aplikacji mobilnej. Możesz uzyskać identyfikator klienta na karcie Advanced w sekcji Ustawienia usługi Azure Active Directory w portalu.
- Zastąp INSERT-CLIENT-ID-HERE identyfikatorem klienta skopiowanym z natywnej aplikacji klienckiej.
- Zastąp INSERT-REDIRECT-URI-HERE własnym punktem końcowym /.auth/login/done, używając schematu HTTPS. Ta wartość powinna być podobna do 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)
}
}
}
Instrukcje: uwierzytelnianie użytkowników za pomocą zestawu SDK serwisu Facebook dla systemu iOS
Możesz użyć zestawu SDK usługi Facebook dla systemu iOS, aby zalogować użytkowników do aplikacji przy użyciu serwisu Facebook. Użycie uwierzytelniania przepływu klienta jest bardziej preferowane zamiast metody loginWithProvider:completion:
. Uwierzytelnianie przepływu klienta zapewnia bardziej natywne wrażenie interfejsu użytkownika i umożliwia dodatkowe dostosowanie.
Skonfiguruj zaplecze aplikacji mobilnej na potrzeby logowania do serwisu Facebook, postępując zgodnie z samouczkiem How to configure App Service for Facebook login tutorial (Jak skonfigurować usługę App Service na potrzeby logowania do serwisu Facebook).
Zainstaluj zestaw Facebook SDK dla systemu iOS, postępując zgodnie z dokumentacją Facebook SDK dla systemu iOS - Rozpoczęcie. Zamiast tworzyć aplikację, możesz dodać platformę systemu iOS do istniejącej rejestracji.
Dokumentacja serwisu Facebook zawiera pewien kod Objective-C w delegacie aplikacji. Jeśli używasz Swift, możesz użyć następujących tłumaczeń dla 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
w taki sam sposób.Dodaj następujący kod do aplikacji zgodnie z używanym językiem.
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) } } }
Instrukcje: uwierzytelnianie użytkowników za pomocą usługi Twitter Fabric dla systemu iOS
Możesz użyć Fabric dla iOS, aby zalogować użytkowników do swojej aplikacji za pomocą Twittera. Uwierzytelnianie przepływu klienta jest preferowane przy użyciu metody loginWithProvider:completion:
, 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 tutorial (Jak skonfigurować usługę App Service na potrzeby logowania w usłudze Twitter).
Dodaj Fabric do swojego projektu, postępując według dokumentacji Fabric dla systemu iOS - Rozpoczęcie pracy z i konfigurując TwitterKit.
Uwaga
Domyślnie Fabric tworzy aplikację Twitter. Możesz uniknąć tworzenia aplikacji, rejestrując utworzony wcześniej klucz klienta i wpis tajny użytkownika przy użyciu poniższych fragmentów kodu. Alternatywnie możesz zastąpić wartości Klucza klienta i Klucza tajnego klienta, które podałeś w usłudze App Service, wartościami widocznymi na pulpicie nawigacyjnym usługi Fabric. Wybierając tę opcję, pamiętaj, aby ustawić adres URL wywołania zwrotnego na przykład na wartość symbolu zastępczego, taką jak
https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback
.Jeśli zdecydujesz się używać utworzonych wcześniej sekretów, dodaj następujący kod do App Delegate:
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 }
Dodaj następujący kod do aplikacji zgodnie z używanym językiem.
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) } } }
Instrukcje: uwierzytelnianie użytkowników przy użyciu zestawu Sdk usługi Google Sign-In 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ń protokołu OAuth. Te zmiany zasad będą wymagać użycia zestawu Google SDK w przyszłości.
Skonfiguruj zaplecze aplikacji mobilnej do logowania Google, postępując zgodnie z samouczkiem Jak skonfigurować usługę App Service do logowania Google.
Zainstaluj zestaw Google SDK dla systemu iOS, postępując zgodnie z dokumentacją Google Sign-In dla systemu iOS — rozpocznij integrowanie. Możesz pominąć sekcję "Uwierzytelnianie przy użyciu serwera zaplecza".
Dodaj następujący kod do metody
signIn:didSignInForUser:withError:
delegata w zależności od używanego języka.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 dodasz następujące elementy do
application:didFinishLaunchingWithOptions:
w delegacie aplikacji, zastępując „SERVER_CLIENT_ID” tym samym identyfikatorem, który użyłeś do skonfigurowania usługi 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 protokół
GIDSignInUIDelegate
zgodnie z używanym językiem. Użytkownik jest wylogowywany przed ponownym zalogowaniem i 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() }