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.hi 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 NSPredicatereadWithPredicate. 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, MSErrorRequestKeyoch 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.

  1. 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.

  2. 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'
    
  3. Använd terminalen, kör pod install från katalogen som innehåller projektet och öppna sedan den genererade Xcode-arbetsytan (inte projektet).

  4. 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.

  1. Konfigurera mobilappens serverdel för Facebook-inloggning genom att följa självstudien Konfigurera App Service för Facebook-inloggning.

  2. 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.

  3. 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
    }
    
  4. Förutom att lägga FBSDKCoreKit.framework till i projektet lägger du även till FBSDKLoginKit.framework en referens på samma sätt.

  5. 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.

  1. Konfigurera mobilappens serverdel för Twitter-inloggning genom att följa självstudien Konfigurera App Service för Twitter-inloggning.

  2. 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
    }
    
  3. 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.

  1. Konfigurera mobilappens serverdel för Google-inloggning genom att följa självstudien Konfigurera App Service för Google-inloggning.

  2. 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".

  3. 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
        // ...
    }
    
  4. 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"
    
  5. 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()
    }