Använda iOS-klientbiblioteket för Azure Mobile Apps
Översikt
I den här guiden får du lära dig att utföra vanliga scenarier med hjälp av de senaste IOS-SDK:erna för Azure Mobile Apps. Om du inte har använt Azure Mobile Apps tidigare ska du först slutföra snabbstarten för Azure Mobile Apps för att skapa en serverdel, skapa en tabell och ladda ned ett färdigt iOS Xcode-projekt. I den här guiden fokuserar vi på iOS SDK på klientsidan. Mer information om SDK på serversidan för serverdelen finns i Server SDK HOWTOs.
Referensdokumentation
Referensdokumentationen för iOS-klient-SDK finns här: Azure Mobile Apps iOS-klientreferens.
Plattformar som stöds
IOS SDK stöder Objective-C-projekt, Swift 2.2-projekt och Swift 2.3-projekt för iOS-versioner 8.0 eller senare.
Autentiseringen "serverflöde" använder en Webbvy för det visade användargränssnittet. Om enheten inte kan presentera ett WebView-användargränssnitt krävs en annan autentiseringsmetod som ligger utanför produktens omfång. Detta SDK är därför inte lämpligt för watch-type eller liknande begränsade enheter.
Installation och förutsättningar
Den här guiden förutsätter att du har skapat en serverdel med en tabell. Den här guiden förutsätter att tabellen har samma schema som tabellerna i dessa självstudier. Den här guiden förutsätter också att du refererar till MicrosoftAzureMobile.framework
och importerar MicrosoftAzureMobile/MicrosoftAzureMobile.h
i koden.
Anvisningar: Skapa klient
Om du vill komma åt en Azure Mobile Apps-serverdel i projektet skapar du en MSClient
. Ersätt AppUrl
med appens URL. Du kan lämna gatewayURLString
och applicationKey
tom. Om du konfigurerar en gateway för autentisering fyller gatewayURLString
du i med gateway-URL:en.
Objective-C:
MSClient *client = [MSClient clientWithApplicationURLString:@"AppUrl"];
Swift:
let client = MSClient(applicationURLString: "AppUrl")
Anvisningar: Skapa tabellreferens
För att få åtkomst till eller uppdatera data skapar du en referens till serverdelstabellen. Ersätt TodoItem
med namnet på tabellen
Objective-C:
MSTable *table = [client tableWithName:@"TodoItem"];
Swift:
let table = client.tableWithName("TodoItem")
Anvisningar: Fråga efter data
Om du vill skapa en databasfråga frågar du objektet MSTable
. Följande fråga hämtar alla objekt i TodoItem
och loggar texten för varje objekt.
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"])
}
}
}
Anvisningar: Filtrera returnerade data
Det finns många tillgängliga alternativ för att filtrera resultat.
Om du vill filtrera med hjälp av ett predikat använder du och NSPredicate
readWithPredicate
. Följande filter returnerade data för att endast hitta ofullständiga Att göra-objekt.
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"])
}
}
}
Anvisningar: Använda MSQuery
Om du vill utföra en komplex fråga (inklusive sortering och sidindelning) skapar du ett MSQuery
objekt direkt eller med hjälp av ett predikat:
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
gör att du kan styra flera frågebeteenden.
- Ange resultatordning
- Begränsa vilka fält som ska returneras
- Begränsa hur många poster som ska returneras
- Ange totalt antal som svar
- Ange anpassade frågesträngsparametrar i begäran
- Använda ytterligare funktioner
Kör en MSQuery
fråga genom att anropa readWithCompletion
på -objektet.
Anvisningar: Sortera data med MSQuery
För att sortera resultat ska vi titta på ett exempel. Om du vill sortera efter fält "text" stigande, sedan efter "fullständig" fallande, anropa så MSQuery
här:
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"])
}
}
}
Anvisningar: Begränsa fält och expandera frågesträngsparametrar med MSQuery
Om du vill begränsa fält som ska returneras i en fråga anger du namnen på fälten i egenskapen selectFields . Det här exemplet returnerar endast text och slutförda fält:
Objective-C:
query.selectFields = @[@"text", @"complete"];
Swift:
query.selectFields = ["text", "complete"]
Om du vill inkludera ytterligare frågesträngsparametrar i serverbegäran (till exempel eftersom ett anpassat skript på serversidan använder dem) fyller du i query.parameters
så här:
Objective-C:
query.parameters = @{
@"myKey1" : @"value1",
@"myKey2" : @"value2",
};
Swift:
query.parameters = ["myKey1": "value1", "myKey2": "value2"]
Anvisningar: Konfigurera sidstorlek
Med Azure Mobile Apps styr sidstorleken antalet poster som hämtas åt gången från serverdelstabellerna. Ett anrop till pull
data skulle sedan gruppera data, baserat på den här sidstorleken, tills det inte finns några fler poster att hämta.
Det går att konfigurera en sidstorlek med HJÄLP av MSPullSettings enligt nedan. Standardstorleken för sidan är 50 och exemplet nedan ändrar den till 3.
Du kan konfigurera en annan sidstorlek av prestandaskäl. Om du har ett stort antal små dataposter minskar en hög sidstorlek antalet turer runt servern.
Den här inställningen styr endast sidstorleken på klientsidan. Om klienten begär en större sidstorlek än mobile apps-serverdelen har stöd för, begränsas sidstorleken till det maximala som serverdelen har konfigurerats för att stödja.
Den här inställningen är också antalet dataposter, inte bytestorleken.
Om du ökar klientsidans storlek bör du också öka sidstorleken på servern. Se "Gör så här: Justera växlingsstorleken för tabellen" för stegen för att göra detta.
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)
}
}
Anvisningar: Infoga data
Om du vill infoga en ny tabellrad skapar du en NSDictionary
och anropar table insert
. Om dynamiskt schema är aktiverat genererar Azure App Service mobila serverdelen automatiskt nya kolumner baserat på NSDictionary
.
Om id
inte anges genererar serverdelen automatiskt ett nytt unikt ID. Ange egna id
om du vill använda e-postadresser, användarnamn eller egna anpassade värden som ID. Att ange ett eget ID kan underlätta kopplingar och affärsorienterad databaslogik.
result
innehåller det nya objektet som infogades. Beroende på din serverlogik kan den ha ytterligare eller ändrade data jämfört med vad som skickades till servern.
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"])
}
}
Anvisningar: Ändra data
Om du vill uppdatera en befintlig rad ändrar du ett objekt och anropar 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"])
}
})
}
Du kan också ange rad-ID:t och det uppdaterade fältet:
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"])
}
}
Attributet id
måste minst anges när du gör uppdateringar.
Anvisningar: Ta bort data
Om du vill ta bort ett objekt anropar delete
du med objektet:
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)
}
}
Du kan också ta bort genom att ange ett rad-ID:
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)
}
}
Attributet id
måste minst anges när du gör borttagningar.
Anvisningar: Anropa anpassat API
Med ett anpassat API kan du exponera alla serverdelsfunktioner. Den behöver inte mappas till en tabellåtgärd. Du får inte bara mer kontroll över meddelanden, du kan till och med läsa/ange rubriker och ändra formatet för svarstexten.
Anropa ett anpassat API genom att anropa MSClient.invokeAPI
. Innehållet för begäran och svar behandlas som JSON. Om du vill använda andra medietyper använder du den andra överlagringen av invokeAPI
. Om du vill göra en GET
begäran i stället för en POST
begäran anger du parametern HTTPMethod
till "GET"
och parametern body
till nil
(eftersom GET-begäranden inte har meddelandetexter.) Om ditt anpassade API stöder andra HTTP-verb kan du ändra HTTPMethod
på rätt sätt.
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
}
}
Anvisningar: Registrera push-mallar för att skicka plattformsoberoende meddelanden
Om du vill registrera mallar skickar du mallar med metoden client.push registerDeviceToken i klientappen.
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)
}
})
Dina mallar är av typen NSDictionary och kan innehålla flera mallar i följande format:
Objective-C:
NSDictionary *iOSTemplate = @{ @"templateName": @{ @"body": @{ @"aps": @{ @"alert": @"$(message)" } } } };
Swift:
let iOSTemplate = ["templateName": ["body": ["aps": ["alert": "$(message)"]]]]
Alla taggar tas bort från begäran om säkerhet. Information om hur du lägger till taggar i installationer eller mallar i installationer finns i Arbeta med .NET-serverdels-SDK för Azure Mobile Apps. Om du vill skicka meddelanden med de här registrerade mallarna arbetar du med Notification Hubs-API:er.
Anvisningar: Hantera fel
När du anropar en Azure App Service mobil serverdel innehåller slutförandeblocket en NSError
parameter. När ett fel inträffar är den här parametern inte noll. I koden bör du kontrollera den här parametern och hantera felet efter behov, vilket visas i föregående kodfragment.
Filen <WindowsAzureMobileServices/MSError.h>
definierar konstanterna MSErrorResponseKey
, MSErrorRequestKey
och MSErrorServerItemKey
. Så här hämtar du mer data som är relaterade till felet:
Objective-C:
NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey];
Swift:
let serverItem = error.userInfo[MSErrorServerItemKey]
Dessutom definierar filen konstanter för varje felkod:
Objective-C:
if (error.code == MSErrorPreconditionFailed) {
Swift:
if (error.code == MSErrorPreconditionFailed) {
Anvisningar: Autentisera användare med Active Directory-autentiseringsbiblioteket
Du kan använda Active Directory Authentication Library (ADAL) för att logga in användare i ditt program med hjälp av Azure Active Directory. Klientflödesautentisering med hjälp av en identitetsprovider-SDK är att föredra framför att använda loginWithProvider:completion:
metoden. Klientflödesautentisering ger en mer inbyggd UX-känsla och möjliggör ytterligare anpassning.
Konfigurera mobilappens serverdel för AAD-inloggning genom att följa självstudien Konfigurera App Service för Active Directory-inloggning. Se till att slutföra det valfria steget för att registrera ett internt klientprogram. För iOS rekommenderar vi att omdirigerings-URI:n är av formatet
<app-scheme>://<bundle-id>
. Mer information finns i ADAL iOS-snabbstarten.Installera ADAL med Cocoapods. Redigera din Podfile för att inkludera följande definition och ersätt YOUR-PROJECT med namnet på Xcode-projektet:
source 'https://github.com/CocoaPods/Specs.git' link_with ['YOUR-PROJECT'] xcodeproj 'YOUR-PROJECT'
och podden:
pod 'ADALiOS'
Använd terminalen, kör
pod install
från katalogen som innehåller projektet och öppna sedan den genererade Xcode-arbetsytan (inte projektet).Lägg till följande kod i ditt program enligt det språk du använder. Gör följande ersättningar i var och en:
- Ersätt INSERT-AUTHORITY-HERE med namnet på den klientorganisation där du etablerade programmet. Formatet ska vara https://login.microsoftonline.com/contoso.onmicrosoft.com. Det här värdet kan kopieras från fliken Domän i Azure Active Directory i Azure Portal.
- Ersätt INSERT-RESOURCE-ID-HERE med klient-ID :t för mobilappens serverdel. Du kan hämta klient-ID:t från fliken Avancerat under Azure Active Directory-inställningar i portalen.
- Ersätt INSERT-CLIENT-ID-HERE med det klient-ID som du kopierade från det interna klientprogrammet.
- Ersätt INSERT-REDIRECT-URI-HERE med webbplatsens slutpunkt /.auth/login/done med hjälp av HTTPS-schemat. Det här värdet bör likna 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)
}
}
}
Anvisningar: Autentisera användare med Facebook SDK för iOS
Du kan använda Facebook SDK för iOS för att logga in användare i ditt program med Facebook. Att använda en klientflödesautentisering är att föredra framför att använda loginWithProvider:completion:
metoden. Klientflödesautentiseringen ger en mer inbyggd UX-känsla och möjliggör ytterligare anpassning.
Konfigurera mobilappens serverdel för Facebook-inloggning genom att följa självstudien Konfigurera App Service för Facebook-inloggning.
Installera Facebook SDK för iOS genom att följa Facebook SDK för iOS – Komma igång dokumentation. I stället för att skapa en app kan du lägga till iOS-plattformen i din befintliga registrering.
Facebooks dokumentation innehåller viss Objective-C-kod i appdelegaten. Om du använder Swift kan du använda följande översättningar för 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 }
Förutom att lägga
FBSDKCoreKit.framework
till i projektet lägger du även tillFBSDKLoginKit.framework
en referens på samma sätt.Lägg till följande kod i ditt program enligt det språk du använder.
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) } } }
Anvisningar: Autentisera användare med Twitter Fabric för iOS
Du kan använda Fabric för iOS för att logga in användare i ditt program med Twitter. Klientflödesautentisering är att föredra framför att använda loginWithProvider:completion:
metoden, eftersom den ger en mer inbyggd UX-känsla och möjliggör ytterligare anpassning.
Konfigurera mobilappens serverdel för Twitter-inloggning genom att följa självstudien Konfigurera App Service för Twitter-inloggning.
Lägg till Infrastruktur i projektet genom att följa dokumentationen för Infrastruktur för iOS – Komma igång och konfigurera TwitterKit.
Anteckning
Som standard skapar Fabric ett Twitter-program åt dig. Du kan undvika att skapa ett program genom att registrera konsumentnyckeln och konsumenthemligheten som du skapade tidigare med hjälp av följande kodfragment. Du kan också ersätta de konsumentnyckel- och konsumenthemlighetsvärden som du anger för att App Service med de värden som visas på instrumentpanelen för infrastrukturresurser. Om du väljer det här alternativet måste du ange återanrops-URL:en till ett platshållarvärde, till exempel
https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback
.Om du väljer att använda hemligheterna som du skapade tidigare lägger du till följande kod i appdelegaten:
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 }
Lägg till följande kod i ditt program enligt det språk du använder.
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) } } }
Anvisningar: Autentisera användare med Google Sign-In SDK för iOS
Du kan använda Google Sign-In SDK för iOS för att logga in användare i ditt program med ett Google-konto. Google meddelade nyligen ändringar i sina OAuth-säkerhetsprinciper. Dessa principändringar kräver att Google SDK används i framtiden.
Konfigurera mobilappens serverdel för Google-inloggning genom att följa självstudien Konfigurera App Service för Google-inloggning.
Installera Google SDK för iOS genom att följa Google Sign-In för iOS – Börja integrera dokumentationen. Du kan hoppa över avsnittet "Autentisera med en serverdelsserver".
Lägg till följande i ombudets
signIn:didSignInForUser:withError:
metod, beroende på vilket språk du använder.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 // ... }
Se till att du även lägger till
application:didFinishLaunchingWithOptions:
följande i appdelegaten och ersätt "SERVER_CLIENT_ID" med samma ID som du använde för att konfigurera App Service i steg 1.Objective-C:
[GIDSignIn sharedInstance].serverClientID = @"SERVER_CLIENT_ID";
Swift:
GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
Lägg till följande kod i ditt program i en UIViewController som implementerar
GIDSignInUIDelegate
protokollet, enligt det språk du använder. Du är utloggade innan du loggas in igen, och även om du inte behöver ange dina autentiseringsuppgifter igen visas en dialogruta med medgivande. Anropa endast den här metoden när sessionstoken har upphört att gälla.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() }