Azure Mobile Apps için iOS İstemci Kitaplığı'nı Kullanma

Genel Bakış

Bu kılavuz, en son Azure Mobile Apps iOS SDK'sını kullanarak yaygın senaryolar gerçekleştirmeyi öğretir. Azure Mobile Apps'i kullanmaya yeni başladıysanız, önce arka uç oluşturmak, tablo oluşturmak ve önceden oluşturulmuş bir iOS Xcode projesi indirmek için Azure Mobile Apps Hızlı Başlangıç'ı tamamlayın. Bu kılavuzda istemci tarafı iOS SDK'sı üzerinde duracağız. Arka uç için sunucu tarafı SDK'sı hakkında daha fazla bilgi edinmek için bkz. Sunucu SDK'sı HOWTO'ları.

Başvuru belgeleri

iOS istemci SDK'sı için başvuru belgeleri burada bulunur: Azure Mobile Apps iOS İstemci Başvurusu.

Desteklenen Platformlar

iOS SDK, iOS 8.0 veya sonraki sürümleri için Objective-C projelerini, Swift 2.2 projelerini ve Swift 2.3 projelerini destekler.

"Sunucu akışı" kimlik doğrulaması, sunulan kullanıcı arabirimi için bir WebView kullanır. Cihaz Bir WebView kullanıcı arabirimi sunamıyorsa, ürünün kapsamı dışında olan başka bir kimlik doğrulama yöntemi gerekir. Bu nedenle bu SDK, İzleme türü veya benzer şekilde kısıtlanmış cihazlar için uygun değildir.

Kurulum ve Önkoşullar

Bu kılavuzda, tabloyla bir arka uç oluşturduğunuz varsayılır. Bu kılavuzda, tablonun bu öğreticilerdeki tablolarla aynı şemaya sahip olduğu varsayılır. Bu kılavuzda ayrıca kodunuzda öğesine başvurduğunuz MicrosoftAzureMobile.framework ve öğesini içeri aktardığınız MicrosoftAzureMobile/MicrosoftAzureMobile.hvarsayılır.

Nasıl yapılır: İstemci Oluşturma

Projenizdeki bir Azure Mobile Apps arka ucuna erişmek için bir MSClientoluşturun. değerini uygulama URL'si ile değiştirin AppUrl . Burayı terk edebilir ve applicationKey boş bırakabilirsinizgatewayURLString. Kimlik doğrulaması için bir ağ geçidi ayarladıysanız ağ geçidi URL'si ile doldurun gatewayURLString .

Objective-C:

MSClient *client = [MSClient clientWithApplicationURLString:@"AppUrl"];

Swift:

let client = MSClient(applicationURLString: "AppUrl")

Nasıl yapılır: Tablo Başvurusu Oluşturma

Verilere erişmek veya verileri güncelleştirmek için arka uç tablosuna başvuru oluşturun. TodoItem ifadesini tablonuzun adıyla değiştirin

Objective-C:

MSTable *table = [client tableWithName:@"TodoItem"];

Swift:

let table = client.tableWithName("TodoItem")

Nasıl yapılır: Verileri Sorgulama

Veritabanı sorgusu oluşturmak için nesnesini sorgular MSTable . Aşağıdaki sorgu içindeki TodoItem tüm öğeleri alır ve her öğenin metnini günlüğe kaydeder.

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"])
        }
    }
}

Nasıl yapılır: Döndürülen Verileri Filtreleme

Sonuçları filtrelemek için birçok kullanılabilir seçenek vardır.

Koşul kullanarak filtrelemek için ve readWithPredicatekullanınNSPredicate. Aşağıdaki filtreler yalnızca tamamlanmamış Yapılacaklar öğelerini bulmak için veri döndürdü.

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"])
        }
    }
}

Nasıl yapılır: MSQuery Kullanma

Karmaşık bir sorgu (sıralama ve sayfalama dahil) gerçekleştirmek için, doğrudan veya koşul kullanarak bir MSQuery nesne oluşturun:

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 çeşitli sorgu davranışlarını denetlemenize olanak tanır.

  • Sonuçların sırasını belirtme
  • Döndürülecek alanları sınırla
  • Döndürülecek kayıt sayısını sınırlayın
  • Yanıt olarak toplam sayıyı belirtin
  • İstekte özel sorgu dizesi parametrelerini belirtme
  • Ek işlevler uygulama

nesnesinde çağırarak readWithCompletion bir MSQuery sorgu yürütür.

Nasıl yapılır: MSQuery ile Verileri Sıralama

Sonuçları sıralamak için bir örneğe göz atalım. 'text' alanına göre artan düzende ve ardından 'complete' azalan düzende sıralamak için şu şekilde çağırabilirsiniz MSQuery :

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"])
        }
    }
}

Nasıl yapılır: MSQuery ile Alanları Sınırlama ve Sorgu Dizesi Parametrelerini Genişletme

Sorguda döndürülecek alanları sınırlamak için selectFields özelliğindeki alanların adlarını belirtin. Bu örnek yalnızca metin ve tamamlanmış alanları döndürür:

Objective-C:

query.selectFields = @[@"text", @"complete"];

Swift:

query.selectFields = ["text", "complete"]

Sunucu isteğine ek sorgu dizesi parametreleri eklemek için (örneğin, özel bir sunucu tarafı betiği bunları kullandığından), şunun gibi doldurun query.parameters :

Objective-C:

query.parameters = @{
    @"myKey1" : @"value1",
    @"myKey2" : @"value2",
};

Swift:

query.parameters = ["myKey1": "value1", "myKey2": "value2"]

Nasıl yapılır: Sayfa Boyutunu Yapılandırma

Azure Mobile Apps ile sayfa boyutu, arka uç tablolarından bir kerede çekilen kayıt sayısını denetler. Daha sonra bir veri çağrısı pull , çekecek başka kayıt kalmayıncaya kadar bu sayfa boyutuna göre verileri toplu hale getirebilir.

Aşağıda gösterildiği gibi MSPullSettings kullanarak sayfa boyutunu yapılandırmak mümkündür. Varsayılan sayfa boyutu 50'dir ve aşağıdaki örnek bunu 3 olarak değiştirir.

Performans nedenleriyle farklı bir sayfa boyutu yapılandırabilirsiniz. Çok sayıda küçük veri kaydınız varsa, yüksek sayfa boyutu sunucu gidiş dönüş sayısını azaltır.

Bu ayar yalnızca istemci tarafındaki sayfa boyutunu denetler. İstemci, Mobile Apps arka ucu tarafından desteklenenden daha büyük bir sayfa boyutu isterse, sayfa boyutu arka ucun destekleyecek şekilde yapılandırıldığı maksimum düzeyde sınırlanır.

Bu ayar bayt boyutu değil, veri kayıtlarının sayısıdır.

İstemci sayfa boyutunu artırırsanız, sunucudaki sayfa boyutunu da artırmanız gerekir. Bunu yapma adımları için bkz. "Nasıl yapılır: Tablo disk belleği boyutunu ayarlama" .

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)
    }
}

Nasıl yapılır: Veri Ekleme

Yeni bir tablo satırı eklemek için bir NSDictionary oluşturun ve öğesini çağırabilirsiniz table insert. Dinamik Şema etkinleştirilirse, Azure App Service mobil arka ucu otomatik olarak temelinde NSDictionaryyeni sütunlar oluşturur.

id Sağlanmazsa, arka uç otomatik olarak yeni bir benzersiz kimlik oluşturur. id E-posta adreslerini, kullanıcı adlarını veya kendi özel değerlerinizi kimlik olarak kullanmak için kendi değerlerinizi sağlayın. Kendi kimliğinizi sağlamak, birleştirmeleri ve iş odaklı veritabanı mantığını kolaylaştırabilir.

eklenen result yeni öğeyi içerir. Sunucu mantığınıza bağlı olarak, sunucuya geçirilen verilerle karşılaştırıldığında ek veya değiştirilmiş veriler içerebilir.

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"])
    }
}

Nasıl yapılır: Verileri Değiştirme

Var olan bir satırı güncelleştirmek için bir öğeyi değiştirin ve çağrısında bulunur 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"])
        }
    })
}

Alternatif olarak, satır kimliğini ve güncelleştirilmiş alanı sağlayın:

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"])
    }
}

En azından, id güncelleştirmeler yapılırken özniteliği ayarlanmalıdır.

Nasıl yapılır: Verileri Silme

Bir öğeyi silmek için öğeyle birlikte çağırın delete :

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)
    }
}

Alternatif olarak, bir satır kimliği sağlayarak silin:

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)
    }
}

Silme işlemleri yapılırken en azından id özniteliği ayarlanmalıdır.

Nasıl yapılır: Özel API Çağırma

Özel BIR API ile arka uç işlevlerini kullanıma açabilirsiniz. Tablo işlemiyle eşlemesi gerekmez. Mesajlaşma üzerinde daha fazla denetim elde etmekle kalmaz, üst bilgileri okuyabilir/ayarlayabilir ve yanıt gövdesi biçimini de değiştirebilirsiniz.

Özel API'yi çağırmak için çağrısı yapın MSClient.invokeAPI. İstek ve yanıt içeriği JSON olarak kabul edilir. Diğer medya türlerini kullanmak için diğer aşırı yüklemesini invokeAPIkullanın. İstek yerine istek yapmak GET için parametresini "GET" ve parametresini HTTPMethodbodynil olarak ayarlayın (GET isteklerinin ileti gövdeleri yoktur.)POST Özel API'niz diğer HTTP fiillerini destekliyorsa, uygun şekilde değiştirinHTTPMethod.

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
                }
        }

Nasıl yapılır: Platformlar arası bildirim göndermek için anında iletme şablonlarını kaydetme

Şablonları kaydetmek için, istemci uygulamanızda client.push registerDeviceToken yönteminizle şablonları geçirin.

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)
    }
})

Şablonlarınız NSDictionary türündedir ve aşağıdaki biçimde birden çok şablon içerebilir:

Objective-C:

NSDictionary *iOSTemplate = @{ @"templateName": @{ @"body": @{ @"aps": @{ @"alert": @"$(message)" } } } };

Swift:

let iOSTemplate = ["templateName": ["body": ["aps": ["alert": "$(message)"]]]]

Tüm etiketler güvenlik isteğinden çıkarılır. Yüklemeler içindeki yüklemelere veya şablonlara etiket eklemek için bkz. Azure Mobile Apps için .NET arka uç sunucusu SDK'sı ile çalışma. Bu kayıtlı şablonları kullanarak bildirim göndermek için Notification Hubs API'leriyle çalışın.

Nasıl yapılır: Hataları İşleme

bir Azure App Service mobil arka ucu çağırdığınızda tamamlama bloğu bir NSError parametre içerir. Bir hata oluştuğunda, bu parametre sıfır değildir. Kodunuzda, bu parametreyi denetlemeli ve önceki kod parçacıklarında gösterildiği gibi hatayı gerektiği gibi işlemeniz gerekir.

dosyası <WindowsAzureMobileServices/MSError.h> , MSErrorRequestKeyve MSErrorServerItemKeysabitlerini MSErrorResponseKeytanımlar. Hatayla ilgili daha fazla veri almak için:

Objective-C:

NSDictionary *serverItem = [error.userInfo objectForKey:MSErrorServerItemKey];

Swift:

let serverItem = error.userInfo[MSErrorServerItemKey]

Buna ek olarak, dosya her hata kodu için sabitleri tanımlar:

Objective-C:

if (error.code == MSErrorPreconditionFailed) {

Swift:

if (error.code == MSErrorPreconditionFailed) {

Nasıl yapılır: Active Directory Kimlik Doğrulama Kitaplığı ile kullanıcıların kimliğini doğrulama

Azure Active Directory kullanarak uygulamanızda kullanıcıları oturum açmak için Active Directory Kimlik Doğrulama Kitaplığı'nı (ADAL) kullanabilirsiniz. Kimlik sağlayıcısı SDK'sı kullanarak istemci akışı kimlik doğrulaması yöntemi tercih loginWithProvider:completion: edilir. İstemci akışı kimlik doğrulaması daha yerel bir UX hissi sağlar ve ek özelleştirme sağlar.

  1. Active Directory oturum açma için App Service yapılandırma öğreticisini izleyerek mobil uygulama arka ucunuzu AAD oturum açma için yapılandırın. Yerel istemci uygulamasını kaydetmenin isteğe bağlı adımını tamamladığınızdan emin olun. iOS için yeniden yönlendirme URI'sinin biçiminde <app-scheme>://<bundle-id>olması önerilir. Daha fazla bilgi için bkz. ADAL iOS hızlı başlangıcı.

  2. Cocoapods kullanarak ADAL yükleyin. Aşağıdaki tanımı eklemek için Podfile'ınızı düzenleyin ve YOUR-PROJECT yerine Xcode projenizin adını yazın:

     source 'https://github.com/CocoaPods/Specs.git'
     link_with ['YOUR-PROJECT']
     xcodeproj 'YOUR-PROJECT'
    

    ve Pod:

     pod 'ADALiOS'
    
  3. Terminal'i kullanarak projenizi içeren dizinden komutunu çalıştırın pod install ve oluşturulan Xcode çalışma alanını (projeyi değil) açın.

  4. Kullandığınız dile göre aşağıdaki kodu uygulamanıza ekleyin. Her birinde şu değişiklikleri yapın:

    • INSERT-AUTHORITY-HERE yerine uygulamanızı sağladığınız kiracının adını yazın. Biçimi olmalıdır https://login.microsoftonline.com/contoso.onmicrosoft.com. Bu değer, Azure portal Azure Active Directory'nizin Etki Alanı sekmesinden kopyalanabilir.
    • INSERT-RESOURCE-ID-HERE değerini mobil uygulama arka ucunuzun istemci kimliğiyle değiştirin. İstemci kimliğini portaldaki Azure Active Directory Ayarları'nın altındaki Gelişmiş sekmesinden alabilirsiniz.
    • INSERT-CLIENT-ID-HERE öğesini yerel istemci uygulamasından kopyaladığınız istemci kimliğiyle değiştirin.
    • HTTPS düzenini kullanarak INSERT-REDIRECT-URI-HERE yerine sitenizin /.auth/login/done uç noktasını yazın. Bu değer ile https://contoso.azurewebsites.net/.auth/login/donebenzer olmalıdır.

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)
            }
        }
}

Nasıl yapılır: iOS için Facebook SDK ile kullanıcıların kimliğini doğrulama

Kullanıcıları Uygulamanızda Facebook kullanarak oturum açmak için iOS için Facebook SDK'sını kullanabilirsiniz. İstemci akışı kimlik doğrulamasının kullanılması yöntemi kullanmak loginWithProvider:completion: için tercih edilir. İstemci akışı kimlik doğrulaması daha yerel bir UX hissi sağlar ve ek özelleştirme sağlar.

  1. Facebook oturum açma için App Service yapılandırma öğreticisini izleyerek Facebook oturum açma için mobil uygulama arka ucunuzu yapılandırın.

  2. iOS için Facebook SDK - Başlarken belgelerini izleyerek iOS için Facebook SDK'sını yükleyin. Uygulama oluşturmak yerine iOS platformunu mevcut kaydınıza ekleyebilirsiniz.

  3. Facebook'un belgeleri, Uygulama Temsilcisi'nde objective-C kodu içerir. Swift kullanıyorsanız AppDelegate.swift için aşağıdaki çevirileri kullanabilirsiniz:

    // 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. Projenize eklemenin FBSDKCoreKit.framework yanı sıra, aynı şekilde için FBSDKLoginKit.framework de bir başvuru ekleyin.

  5. Kullandığınız dile göre aşağıdaki kodu uygulamanıza ekleyin.

    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)
            }
        }
    }
    

Nasıl yapılır: iOS için Twitter Fabric ile kullanıcıların kimliğini doğrulama

Twitter'ı kullanarak uygulamanızda kullanıcıları oturum açmak için iOS için Fabric'i kullanabilirsiniz. İstemci Akışı kimlik doğrulaması, daha yerel bir UX hissi sağladığından ve ek özelleştirmeye olanak sağladığından yönteminin kullanılması loginWithProvider:completion: tercih edilir.

  1. Twitter oturum açma bilgileri için App Service yapılandırma öğreticisini izleyerek Mobil uygulama arka ucunuzu Twitter oturum açma için yapılandırın.

  2. iOS için Doku - Başlarken belgelerini izleyerek ve TwitterKit'i ayarlayarak projenize Doku ekleyin.

    Not

    Fabric varsayılan olarak sizin için bir Twitter uygulaması oluşturur. Aşağıdaki kod parçacıklarını kullanarak daha önce oluşturduğunuz Tüketici Anahtarı ve Tüketici Gizli Dizisi'ni kaydederek uygulama oluşturmaktan kaçınabilirsiniz. Alternatif olarak, App Service için sağladığınız Tüketici Anahtarı ve Tüketici Gizli Anahtarı değerlerini Doku Panosu'nda gördüğünüz değerlerle değiştirebilirsiniz. Bu seçeneği belirlerseniz, geri arama URL'sini gibi https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callbackbir yer tutucu değerine ayarladığınızdan emin olun.

    Daha önce oluşturduğunuz gizli dizileri kullanmayı seçerseniz, Uygulama Temsilcinize aşağıdaki kodu ekleyin:

    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. Kullandığınız dile göre aşağıdaki kodu uygulamanıza ekleyin.

    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)
            }
        }
    }
    

Nasıl yapılır: iOS için Google Sign-In SDK'sı ile kullanıcıların kimliğini doğrulama

iOS için Google Sign-In SDK'sını kullanarak bir Google hesabı kullanarak uygulamanızda kullanıcıları oturum açabilirsiniz. Google kısa süre önce OAuth güvenlik ilkelerinde değişiklik olduğunu duyurdu. Bu ilke değişiklikleri gelecekte Google SDK'nın kullanılmasını gerektirir.

  1. Google oturum açma için App Service yapılandırma öğreticisini izleyerek Google oturum açma için mobil uygulama arka ucunuzu yapılandırın.

  2. iOS için Google Sign-In izleyerek iOS için Google SDK'sını yükleyin - Belgeleri tümleştirmeye başlayın . "Arka Uç Sunucusuyla Kimlik Doğrulama" bölümünü atlayabilirsiniz.

  3. Aşağıdakini, kullandığınız dile göre temsilcinizin signIn:didSignInForUser:withError: yöntemine ekleyin.

    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. "SERVER_CLIENT_ID" yerine 1. adımda App Service yapılandırmak için kullandığınız kimlikle değiştirerek uygulama temsilcinize aşağıdakileri application:didFinishLaunchingWithOptions: de eklediğinizden emin olun.

    Objective-C:

    [GIDSignIn sharedInstance].serverClientID = @"SERVER_CLIENT_ID";
    

    Swift:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. Aşağıdaki kodu, kullandığınız dile göre protokolü uygulayan GIDSignInUIDelegate bir UIViewController'da uygulamanıza ekleyin. Yeniden oturum açmadan önce oturumunuz kapatılır ve kimlik bilgilerinizi yeniden girmeniz gerekmeyen bir onay iletişim kutusu görürsünüz. Bu yöntemi yalnızca oturum belirtecinin süresi dolduğunda çağırın.

    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()
    }