كيفية استخدام مكتبة عميل iOS لتطبيقات Azure Mobile

نظرة عامة

يعلمك هذا الدليل تنفيذ سيناريوهات شائعة باستخدام أحدث Azure Mobile Apps iOS SDK. إذا كنت مستخدما جديدا لتطبيقات Azure Mobile، فأكمل أولا البدء السريع لتطبيقات Azure Mobile لإنشاء خلفية وإنشاء جدول وتنزيل مشروع iOS Xcode تم إنشاؤه مسبقا. في هذا الدليل، نركز على iOS SDK من جانب العميل. لمعرفة المزيد حول SDK من جانب الخادم للواجهة الخلفية، راجع Server SDK HOWTOs.

الوثائق المرجعية

توجد الوثائق المرجعية ل iOS client SDK هنا: Azure Mobile Apps iOS Client Reference.

الأنظمة الأساسية المدعومة

يدعم iOS SDK مشاريع Objective-C ومشاريع Swift 2.2 ومشاريع Swift 2.3 لإصدارات iOS 8.0 أو أحدث.

تستخدم مصادقة "تدفق الخادم" WebView لواجهة المستخدم المقدمة. إذا لم يتمكن الجهاز من تقديم واجهة مستخدم WebView، فيجب وجود طريقة مصادقة أخرى خارج نطاق المنتج. وبالتالي فإن SDK هذا غير مناسب لنوع الساعة أو الأجهزة المقيدة بالمثل.

الإعداد والمتطلبات الأساسية

يفترض هذا الدليل أنك قمت بإنشاء خلفية بجدول. يفترض هذا الدليل أن الجدول يحتوي على نفس المخطط مثل الجداول في تلك البرامج التعليمية. يفترض هذا الدليل أيضا أنه في التعليمات البرمجية الخاصة بك، يمكنك الرجوع MicrosoftAzureMobile.framework إلى واستيراد MicrosoftAzureMobile/MicrosoftAzureMobile.h.

كيفية: إنشاء عميل

للوصول إلى خلفية Azure Mobile Apps في مشروعك، قم بإنشاء MSClient. استبدل AppUrl بعنوان URL للتطبيق. يمكنك المغادرة gatewayURLString والفارغة applicationKey . إذا قمت بإعداد بوابة للمصادقة، فاملأها gatewayURLString بعنوان URL للبوابة.

Objective-C:

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

Swift:

let client = MSClient(applicationURLString: "AppUrl")

كيفية: إنشاء مرجع جدول

للوصول إلى البيانات أو تحديثها، قم بإنشاء مرجع إلى جدول الواجهة الخلفية. استبدال TodoItem باسم الجدول

Objective-C:

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

Swift:

let table = client.tableWithName("TodoItem")

كيفية: استعلام البيانات

لإنشاء استعلام قاعدة بيانات، استعلم عن MSTable الكائن. يحصل الاستعلام التالي على كافة العناصر في TodoItem ويسجل نص كل عنصر.

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

كيفية: تصفية البيانات التي تم إرجاعها

لتصفية النتائج، هناك العديد من الخيارات المتاحة.

للتصفية باستخدام دالة تقييم، استخدم NSPredicate و readWithPredicate. أرجعت عوامل التصفية التالية البيانات للعثور على عناصر Todo غير مكتملة فقط.

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

كيفية: استخدام MSQuery

لتنفيذ استعلام معقد (بما في ذلك الفرز والترحيل)، قم بإنشاء كائن MSQuery ، مباشرة أو باستخدام دالة تقييم:

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 يتيح لك التحكم في العديد من سلوكيات الاستعلام.

  • تحديد ترتيب النتائج
  • تحديد الحقول التي يجب إرجاعها
  • تحديد عدد السجلات التي يجب إرجاعها
  • تحديد العدد الإجمالي في الاستجابة
  • تحديد معلمات سلسلة الاستعلام المخصصة في الطلب
  • تطبيق وظائف إضافية

MSQuery تنفيذ استعلام عن طريق استدعاء readWithCompletion الكائن.

كيفية: فرز البيانات باستخدام MSQuery

لفرز النتائج، دعونا ننظر إلى مثال. للفرز حسب الحقل "نص" تصاعدي، ثم حسب تنازلي "كامل"، قم 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"])
        }
    }
}

كيفية: تحديد الحقول وتوسيع معلمات سلسلة الاستعلام باستخدام MSQuery

للحد من الحقول التي سيتم إرجاعها في استعلام، حدد أسماء الحقول في الخاصية selectFields . يقوم هذا المثال بإرجاع الحقول النصية والمكتملة فقط:

Objective-C:

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

Swift:

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

لتضمين معلمات سلسلة استعلام إضافية في طلب الخادم (على سبيل المثال، لأن البرنامج النصي المخصص من جانب الخادم يستخدمها)، قم بملء query.parameters مثل ذلك:

Objective-C:

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

Swift:

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

كيفية: تكوين حجم الصفحة

باستخدام Azure Mobile Apps، يتحكم حجم الصفحة في عدد السجلات التي يتم سحبها في كل مرة من الجداول الخلفية. ثم يؤدي استدعاء البيانات إلى pull تجميع البيانات، استنادا إلى حجم الصفحة هذا، حتى لا يكون هناك المزيد من السجلات التي يجب سحبها.

من الممكن تكوين حجم صفحة باستخدام MSPullSettings كما هو موضح أدناه. حجم الصفحة الافتراضي هو 50، والمثال أدناه يغيره إلى 3.

يمكنك تكوين حجم صفحة مختلف لأسباب تتعلق بالأداء. إذا كان لديك عدد كبير من سجلات البيانات الصغيرة، فإن حجم الصفحة العالي يقلل من عدد الرحلات ذهابا وابا للخادم.

يتحكم هذا الإعداد في حجم الصفحة على جانب العميل فقط. إذا طلب العميل حجم صفحة أكبر مما تدعمه الواجهة الخلفية لتطبيقات الأجهزة المحمولة، يتم تعيين حجم الصفحة عند الحد الأقصى لتكوين الخلفية لدعمها.

هذا الإعداد هو أيضا عدد سجلات البيانات، وليس حجم البايت.

إذا قمت بزيادة حجم صفحة العميل، فيجب عليك أيضا زيادة حجم الصفحة على الخادم. راجع "كيفية: ضبط حجم ترحيل الصفحات للجدول" للاطلاع على الخطوات التي يجب تنفيذها.

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

كيفية: إدراج بيانات

لإدراج صف جدول جديد، قم بإنشاء NSDictionary واستدعاء table insert. إذا تم تمكين المخطط الديناميكي ، تنشئ الخلفية للأجهزة المحمولة Azure App Service تلقائيا أعمدة جديدة استنادا NSDictionaryإلى .

إذا id لم يتم توفيره، تقوم الواجهة الخلفية تلقائيا بإنشاء معرف فريد جديد. قم بتوفير عنوانك الخاص id لاستخدام عناوين البريد الإلكتروني أو أسماء المستخدمين أو قيمك المخصصة كمعرف. قد يؤدي توفير المعرف الخاص بك إلى تسهيل الصلات ومنطق قاعدة البيانات الموجهة نحو الأعمال.

result يحتوي على العنصر الجديد الذي تم إدراجه. اعتمادا على منطق الخادم الخاص بك، قد يحتوي على بيانات إضافية أو معدلة مقارنة بما تم تمريره إلى الخادم.

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

كيفية: تعديل البيانات

لتحديث صف موجود، قم بتعديل عنصر واستدعاء 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"])
        }
    })
}

بدلا من ذلك، قم بتوفير معرف الصف وحقل المحدث:

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

كحد أدنى، يجب تعيين السمة id عند إجراء التحديثات.

كيفية: حذف البيانات

لحذف عنصر، استدع 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)
    }
}

بدلا من ذلك، احذف عن طريق توفير معرف صف:

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

كحد أدنى، يجب تعيين السمة id عند إجراء عمليات حذف.

كيفية: استدعاء واجهة برمجة التطبيقات المخصصة

باستخدام واجهة برمجة تطبيقات مخصصة، يمكنك عرض أي وظيفة خلفية. لا يلزم تعيين عملية جدول. ليس فقط يمكنك الحصول على مزيد من التحكم في المراسلة، بل يمكنك حتى قراءة/تعيين الرؤوس وتغيير تنسيق نص الاستجابة.

لاستدعاء واجهة برمجة تطبيقات مخصصة، اتصل ب MSClient.invokeAPI. يتم التعامل مع محتوى الطلب والاستجابة على أنه JSON. لاستخدام أنواع الوسائط الأخرى، استخدم التحميل الزائد الآخر ل invokeAPI. لتقديم GET طلب بدلا من POST طلب، قم بتعيين المعلمة HTTPMethod إلى "GET" والمعلمة body إلى nil (نظرا لأن طلبات GET لا تحتوي على هيئات رسائل.) إذا كانت واجهة برمجة التطبيقات المخصصة تدعم أفعال HTTP الأخرى، فقم بالتغيير HTTPMethod بشكل مناسب.

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

كيفية: تسجيل قوالب الدفع لإرسال إعلامات عبر النظام الأساسي

لتسجيل القوالب، قم بتمرير القوالب باستخدام أسلوب client.push registerDeviceToken في تطبيق العميل الخاص بك.

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

القوالب الخاصة بك من نوع NSDictionary ويمكن أن تحتوي على قوالب متعددة بالتنسيق التالي:

Objective-C:

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

Swift:

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

يتم تجريد جميع العلامات من طلب الأمان. لإضافة علامات إلى التثبيتات أو القوالب داخل عمليات التثبيت، راجع العمل مع SDK خادم الواجهة الخلفية .NET لتطبيقات Azure Mobile. لإرسال إعلامات باستخدام هذه القوالب المسجلة، اعمل مع واجهات برمجة التطبيقات لمراكز الإعلامات.

كيفية: معالجة الأخطاء

عند استدعاء الخلفية للأجهزة المحمولة Azure App Service، تحتوي كتلة الإكمال على معلمة NSError . عند حدوث خطأ، تكون هذه المعلمة غير nil. في التعليمات البرمجية الخاصة بك، يجب التحقق من هذه المعلمة ومعالجة الخطأ حسب الحاجة، كما هو موضح في قصاصات التعليمات البرمجية السابقة.

يعرف الملف <WindowsAzureMobileServices/MSError.h> الثوابت MSErrorResponseKeyو MSErrorRequestKeyو.MSErrorServerItemKey للحصول على المزيد من البيانات المتعلقة بالخطأ:

Objective-C:

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

Swift:

let serverItem = error.userInfo[MSErrorServerItemKey]

بالإضافة إلى ذلك، يعرف الملف الثوابت لكل رمز خطأ:

Objective-C:

if (error.code == MSErrorPreconditionFailed) {

Swift:

if (error.code == MSErrorPreconditionFailed) {

كيفية: مصادقة المستخدمين باستخدام مكتبة مصادقة Active Directory

يمكنك استخدام مكتبة مصادقة Active Directory (ADAL) لتسجيل دخول المستخدمين إلى التطبيق الخاص بك باستخدام Azure Active Directory. يفضل loginWithProvider:completion: استخدام أسلوب مصادقة تدفق العميل باستخدام SDK لموفر الهوية. توفر مصادقة تدفق العميل شعورا أكثر أصلية ل UX وتسمح بتخصيص إضافي.

  1. قم بتكوين الواجهة الخلفية لتطبيق الأجهزة المحمولة لتسجيل الدخول إلى AAD باتباع البرنامج التعليمي كيفية تكوين App Service لتسجيل الدخول إلى Active Directory . تأكد من إكمال الخطوة الاختيارية لتسجيل تطبيق عميل أصلي. بالنسبة لنظام التشغيل iOS، نوصي بأن يكون عنوان URI لإعادة التوجيه من النموذج <app-scheme>://<bundle-id>. لمزيد من المعلومات، راجع التشغيل السريع ل ADAL iOS.

  2. تثبيت ADAL باستخدام Cocoapods. قم بتحرير Podfile لتضمين التعريف التالي، واستبدال YOUR-PROJECT باسم مشروع Xcode الخاص بك:

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

    والجراب:

     pod 'ADALiOS'
    
  3. باستخدام Terminal، قم بتشغيل pod install من الدليل الذي يحتوي على مشروعك، ثم افتح مساحة عمل Xcode التي تم إنشاؤها (وليس المشروع).

  4. أضف التعليمات البرمجية التالية إلى التطبيق الخاص بك، وفقا للغة التي تستخدمها. في كل منها، قم بإجراء هذه الاستبدالات:

    • استبدل INSERT-AUTHORITY-HERE باسم المستأجر الذي قمت بتوفير التطبيق الخاص بك فيه. يجب أن يكون https://login.microsoftonline.com/contoso.onmicrosoft.comالتنسيق . يمكن نسخ هذه القيمة من علامة تبويب المجال في Azure Active Directory في مدخل Microsoft Azure.
    • استبدل INSERT-RESOURCE-ID-HERE بمعرف العميل للواجهة الخلفية لتطبيق الأجهزة المحمولة. يمكنك الحصول على معرف العميل من علامة التبويب Advanced ضمن Azure Active Directory Settings في المدخل.
    • استبدل INSERT-CLIENT-ID-HERE بمعرف العميل الذي نسخته من تطبيق العميل الأصلي.
    • استبدل INSERT-REDIRECT-URI-HERE بنقطة نهاية /.auth/login/done لموقعك، باستخدام نظام HTTPS. يجب أن تكون هذه القيمة مشابهة ل 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)
            }
        }
}

كيفية: مصادقة المستخدمين باستخدام Facebook SDK لنظام التشغيل iOS

يمكنك استخدام Facebook SDK لنظام التشغيل iOS لتسجيل دخول المستخدمين إلى تطبيقك باستخدام Facebook. يفضل استخدام مصادقة تدفق العميل على استخدام loginWithProvider:completion: الأسلوب . توفر مصادقة تدفق العميل شعورا أكثر أصلية ل UX وتسمح بتخصيص إضافي.

  1. قم بتكوين الواجهة الخلفية لتطبيق الأجهزة المحمولة لتسجيل الدخول إلى Facebook باتباع البرنامج التعليمي كيفية تكوين App Service لتسجيل الدخول إلى Facebook .

  2. قم بتثبيت Facebook SDK لنظام التشغيل iOS باتباع وثائق Facebook SDK لنظام التشغيل iOS - بدء الاستخدام . بدلا من إنشاء تطبيق، يمكنك إضافة النظام الأساسي لنظام iOS إلى تسجيلك الحالي.

  3. تتضمن وثائق Facebook بعض التعليمات البرمجية Objective-C في App Delegate. إذا كنت تستخدم Swift، يمكنك استخدام الترجمات التالية ل 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. بالإضافة إلى الإضافة FBSDKCoreKit.framework إلى مشروعك، أضف أيضا مرجعا إلى FBSDKLoginKit.framework بنفس الطريقة.

  5. أضف التعليمات البرمجية التالية إلى التطبيق الخاص بك، وفقا للغة التي تستخدمها.

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

كيفية: مصادقة المستخدمين باستخدام Twitter Fabric لنظام التشغيل iOS

يمكنك استخدام Fabric لنظام التشغيل iOS لتسجيل دخول المستخدمين إلى تطبيقك باستخدام Twitter. يفضل loginWithProvider:completion: استخدام أسلوب مصادقة تدفق العميل، لأنها توفر شعورا أكثر أصلية ل UX وتسمح بتخصيص إضافي.

  1. قم بتكوين الواجهة الخلفية لتطبيق الأجهزة المحمولة لتسجيل الدخول إلى Twitter باتباع البرنامج التعليمي كيفية تكوين App Service لتسجيل الدخول إلى Twitter .

  2. أضف Fabric إلى مشروعك باتباع وثائق Fabric for iOS - Getting Started وإعداد TwitterKit.

    ملاحظة

    بشكل افتراضي، ينشئ Fabric تطبيق Twitter لك. يمكنك تجنب إنشاء تطبيق عن طريق تسجيل مفتاح المستهلك وسر المستهلك الذي أنشأته سابقا باستخدام القصاصات البرمجية التالية. بدلا من ذلك، يمكنك استبدال قيم مفتاح المستهلك وسر المستهلك التي توفرها لخدمة التطبيقات بالقيم التي تراها في لوحة معلومات Fabric. إذا اخترت هذا الخيار، فتأكد من تعيين عنوان URL لرد الاتصال إلى قيمة عنصر نائب، مثل https://<yoursitename>.azurewebsites.net/.auth/login/twitter/callback.

    إذا اخترت استخدام الأسرار التي قمت بإنشائها سابقا، فقم بإضافة التعليمات البرمجية التالية إلى 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
    }
    
  3. أضف التعليمات البرمجية التالية إلى التطبيق الخاص بك، وفقا للغة التي تستخدمها.

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

كيفية: مصادقة المستخدمين باستخدام Google Sign-In SDK لنظام التشغيل iOS

يمكنك استخدام Google Sign-In SDK لنظام التشغيل iOS لتسجيل دخول المستخدمين إلى تطبيقك باستخدام حساب Google. أعلنت Google مؤخرا عن تغييرات على نهج أمان OAuth الخاصة بها. وستتطلب هذه التغييرات في النهج استخدام Google SDK في المستقبل.

  1. قم بتكوين الواجهة الخلفية لتطبيق الجوال لتسجيل الدخول إلى Google باتباع البرنامج التعليمي كيفية تكوين App Service لتسجيل الدخول إلى Google .

  2. قم بتثبيت Google SDK لنظام التشغيل iOS باتباع google Sign-In لنظام التشغيل iOS - بدء دمج الوثائق. يمكنك تخطي قسم "المصادقة باستخدام خادم الخلفية".

  3. أضف ما يلي إلى أسلوب المفوض signIn:didSignInForUser:withError: ، وفقا للغة التي تستخدمها.

    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. تأكد أيضا من إضافة ما يلي إلى application:didFinishLaunchingWithOptions: في مفوض التطبيق، واستبدال "SERVER_CLIENT_ID" بنفس المعرف الذي استخدمته لتكوين App Service في الخطوة 1.

    Objective-C:

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

    Swift:

    GIDSignIn.sharedInstance().serverClientID = "SERVER_CLIENT_ID"
    
  5. أضف التعليمات البرمجية التالية إلى التطبيق الخاص بك في UIViewController الذي ينفذ GIDSignInUIDelegate البروتوكول، وفقا للغة التي تستخدمها. يتم تسجيل خروجك قبل تسجيل الدخول مرة أخرى، وعلى الرغم من أنك لا تحتاج إلى إدخال بيانات الاعتماد مرة أخرى، إلا أنك ترى مربع حوار الموافقة. استدعاء هذا الأسلوب فقط عند انتهاء صلاحية الرمز المميز للجلسة.

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