مساحة اعلانية

آخر المواضيع

بروتوكول OAuth 2.0

اليوم سنناقش إحدى البرامج التعليمية, و التي سوف تغوص بك في تنفيذ خدمات جوجل باستخدام بروتوكول OAuth 2.0 بروتوكول OAuth 2.0 هو عباره عن بروتوكول بسيط , و المعيار الذي يسمح لتطبيقات الجيل الثالث الوصول إلى مقدمي الخدمات الرئيسية مثل الفيس بوك، G +
والتغريد دون لمس بكلمات مرور المستخدم.


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

إذا لم تكن مألوفا مع بروتوكول OAuth 2.0 يجب القيام ببعض المعلومات الأساسية. الآن قبل متابعة هذا البرنامج التعليمي على وجه التحديد قم بمراجعة الروابط التالية:
وثائق OAuth 2.0 ومواصفات
حول OAuth في ويكيبيديا
وبصفة عامة، تلتزم تدفق إذن OAuth 2.0 النمط التالي بالسماح للمستخدمين بالاتصال بحساباتهم على الإنترنت.
الحصول على رمز تحويل أي إذن رمزية.
تبادل التعليمات البرمجية والحصول على إذن للرمز المميز لوصول وتحديث رمز مميز
ثم استخدام الرمز المميز للوصول للتفاعل مع خدمة الويب.
استخدم رمز التحديث لتحديث الرمز المميز للوصول عند الحاجة.
جوجل هو واحد من العديد من موفري خدمة ويب الطرف الثالث التي اعتمدت في بروتوكول OAuth 2.0
 يوفر العديد من واجهات برمجة التطبيقات للوصول إلى تقريبا جميع الخدمات (مثل التقويم، مدون، إلخ) من خلال تطبيقات العميل، وإرشادات بشأن كيفية تنفيذ تدفق إذن مع مختلف لغات البرمجة والأنظمة الأساسية
 يجب أولاً تسجيل كل التطبيقات التي تحتاج إلى استخدام أي من خدمات ويب جوجل مع وحدة "تحكم المطور جوجل"، وفريق إدارة حيث تدار جميع تطبيقات العميل التي وضعتها للمستخدم عند تسجيل تطبيق في وحدة التحكم، يتم إنشاؤها من خلال معرف العميل و العميل السري خصيصا لهذا التطبيق.
 هذه القيم، جنبا إلى جنب مع البعض الآخر، يستخدمها OAuth لتأذن للتطبيق والحصول على الرمز المميز للوصول بعد تسجيل التطبيق، وهناك عدد من الخدمات المتاحة التي يمكن أن تدمج في المشاريع. يتم الوصول إلى هذه الخدمات من خلال واجهات برمجة التطبيقات التي يتم توفيرها لكل واحد.
 البعض منهم بالمجان بينما البعض الآخر يتطلب رسوما, جوجل سوف تتيح لك استخدامها خارج حد لاستخدام المجاملة/المحاكمة.
من هذه النقطة إلى الأمام، وسوف افترض أنك على دراية بمبادئ OAuth 2.0 لذلك فقد حان الوقت لزيارة الوثائق باستخدام OAuth 2.0 "تثبيت التطبيقات" من جوجل
 تدفق الإذن بدعم من جوجل لتطبيقات العميل التي نفذت لمنصات متحركة أو سطح المكتب ويعرض هذه الوثائق وستكون لدينا دليل على المشروع من هذا البرنامج التعليمي.
 أيضا، أود أن أوصى أن تتصفح حول استخدام قائمة الخيارات قليلاً في الجانب الأيمن العلوي من النافذة والروابط داخل النص من أجل اكتساب فهم أعمق لخدمات جوجل والطريقة التي تعمل بها بروتوكول OAuth 2.0

نظرة عامة على المشروع
هذا المشروع سوف يعلمك كيفية إنشاء فئة التي سوف تحتوي على تنفيذ العميل OAuth 2.0 للوصول إلى API Google وخدماتها
 سوف تكون هذه الفئة جزء من تطبيق تجريبي بسيط
 سوف تكون واجهة المستخدم الرسومية بسيطة حقاً، كما أننا بحاجة فقط اختبار الفئة، لذلك نحن ذاهبون لتُنفَق قدرا كبيرا من الوقت في الواقع الترميز
 من أجل اختبار تنفيذ بروتوكول OAuthسوف نطلب من غوغل، التي سيتم عرضها في التطبيق لدينا لمعلومات ملف تعريف المستخدم
أيضا، بالترتيب لعملنا أن يكون كاملا بقدر الإمكان، سوف نضيف تدقيقات إضافية والتعامل مع رسائل الخطأ
 بعد هذه الفئة على استعداد، ويمكن استخدامه في مشاريع حقيقية للوصول إلى خدمات Google
 وبطبيعة الحال، فإنه يمكن تحسين أو تعديل بواسطة أي شخص في أي وقت
قبل أن نبدأ كتابة سطر واحد من التعليمات البرمجية، نحن بحاجة إلى سجل التطبيق التجريبي في "وحدة مطوري جوجل".للقيام بذلك، سنحتاج إلى اسم التطبيق
 من أجل مشروعنا، أنا باستخدام اسم جوجليووثديمو
 إذا كنت تفضل بعض اسم آخر، تأكد من استخدامه بدلاً من الأعمال المتعلقة بالألغام في الخطوات التالية
الآن، هنا لقطة من المنتج النهائي

1-سجل التطبيق دائرة الرقابة الداخلية
الخطوة 1
أول خطوة نخطوها لتسجيل التطبيق دائرة الرقابة الداخلية في وحدة تحكم المطور Google لأننا بحاجة إلى الحصول على "معرف العميل" وزوج قيمة "العميل السري"
لذا، داخل علامة تبويب/إطار مستعرض جديد، قم بزيارة موقع مطوري جوجل.
 في الجانب العلوي الأيسر من الإطار، يوجد زر تسجيل الدخول, انقر فوقه وسوف تظهر النافذة التالية
إذا كان لديك حساب في أي خدمة, يمكنك تسجيل الدخول باستخدام بيانات الاعتماد من هذا الحساب
 إذا كنت لا تملك واحدة بالفعل، أو كنت ترغب فقط في إنشاء واحدة جديدة، الآن هو الوقت المناسب للقيام بذلك، ببساطة عن طريق النقر على زر Sign Up
في حالة إجراء حساب جديد، قم بإدخال أية معلومات مطلوبة، وإنشاء، وتسجيل الدخول إلى موقع ويب "مطوري جوجل"
الخطوة 2
بمجرد الحصول على الاتصال مع حساب المطورين Google  قد تصبح غريبة تماما عن جميع الأشياء التي تحتوي هذه الصفحة على، حتى المضي قدما ونلقي نظرة إذا كنت ترغب
 بالتأكيد ستجد بعض مواضيع مثيرة جداً للاهتمام. قم بالتمرير إلى الجانب السفلي من الصفحة، حتى ترى منطقة  أدوات المطور
انقر فوق الارتباط وحدة التحكم API
الخطوة 3
عندما تقوم بإنشاء تطبيق في "وحدة التحكم المطورين"، يتم تجميع المعلومات المتعلقة بذلك معا، وأنها دعت المشروع
 من خلال ذلك، يمكنك إدارة كافة واجهات برمجة التطبيقات والمستخدمين، إذن، والمزيد من الأشياء التي يمكنك استخدامها في التطبيقات الخاصة بك
 أنصح بالبحث في قسم المساعدة (في الجانب العلوي الأيسر من صفحة ويب) إذا كنت ترغب في العثور على معلومات مفصلة حول وحدة التحكم
دعونا نعود إلى مسارها. عندما قمت أولاً بالبحث في صفحة ويب هذه، ستلاحظ قائمة منسدلة في الجهة العلوية من صفحة ويب، المسمى مشروع API
 إذا قمت بتوسيع ذلك، سوف تجد بعض الخيارات الإضافية، حيث يمكنك باستخدامها إنشاء مشاريع جديدة، وحذفها، إعادة تسمية لهم، وأكثر
 نحن لا نحتاج إلى أي شيء من ذلك، وحتى إذا كنت قد توسعت عليه، انقر عليه لطيها
 تحت القائمة المنسدلة، هناك أربعة خيارات
نظرة عامة
الخدمات
فريق
الوصول إلى API
إذا كنت انقر على الخيار خدمات، سترى جميع الخدمات التي تقدم Google مع واجهات برمجة التطبيقات
 وهناك بعض الملاحظات التي تشير إلى أي منها يتطلب رسم بجوار كل خدمة
 لاستخدام أي منها في تطبيق، أولاً يجب تسجيل التطبيق الخاص بك، ثم تنفيذ بروتوكول OAuth وأخيراً اسأل لواجهات برمجة التطبيقات المناسبة
انقر فوق خيار الوصول إلى API الآن
 هذا هو المكان حيث أننا سوف سجل التطبيق الجديد الخاص بنا
 انقر فوق الزر الأزرق الكبير بعنوان "إنشاء عميل OAuth 2.0 معرف..."
في نافذة منبثقة
، إضافة قيمة 2.0 OAuth جوجل دائرة الرقابة الداخلية "التنفيذ التجريبي" اسم المنتج وانقر فوق التالي

في الخطوة التالية قم بما يلي:
نوع التطبيق: تثبيت التطبيق
نوع التطبيق مثبت: دائرة الرقابة الداخلية
معرف الحزمة: com.yourdomain.googleoauthdemo
com.gabrieltheodoropoulos.googleoauthdemo
انقر على الزر إنشاء معرف العميل الآن وأنت جاهز
 وكما ترون في الصورة التالية، يمكنك بسهولة العثور على العميل وقيم العميل السري
يمكن أن تجد لنفسك أنه يمكنك تحرير كافة المعلومات دخلنا فقط باستخدام الارتباطات المتوفرة والأزرار في صفحة الويب.
البيانات نحن ذاهبون لاستخدامها في التطبيق التجريبي الخاص بنا.
معرف العميل
العميل السري
إعادة توجيه URI
عند هذه النقطة، الجزء الأول من مهمتنا أكثر
 قد تم تسجيل التطبيق لدينا في "وحدة مطوري جوجل" ولدينا جميع المعلومات اللازمة التي نريد
 الجزء الصعب على الرغم من سيأتي بعد، أين نحن ذاهبون إلى فعلا تنفيذ بروتوكول OAuth 2.0 في التعليمات البرمجية
2. إنشاء المشروع التجريبي
حان الوقت للبدء في بناء لدينا حوالي إطلاق Xcode وإنشاء مشروع جديد
 في الخطوة الأولى: حدد الخيار تطبيق طريقة العرض واحد من القوالب المتوفرة
بعد ذلك، حدد جوجليووثديمو في حقل اسم المنتج في نافذة خيارات للمشروع
وأخيراً، حدد مكاناً لحفظ المشروع الخاص بك وانقر فوق الزر إنشاء

3. إنشاء واجهة
الخطوة 1
انقر فوق ملف ViewController.xib لبدء تشغيل "منشئ واجهة السحب والإفلات عرض subviews التالي الافتراضي طريقة عرض الجدول وشريط الأدوات أيضا، وبصرف النظر عن "عنصر زر شريط" يحتوي على شريط الأدوات الافتراضي،إضافة
عنصر زر شريط مساحة مرنة وعنصر زر شريط.
تأكد من أن زر واحد في الجانب الأيسر من شريط الأدوات، بينما تتمثل الثانية في الجانب الأيمن منه, ينبغي أن تكون مساحة مرنة بينهما.
الخطوة 2
دعونا نفعل الآن اثنين من الإعدادات:
حدد طريقة عرض وتعيين إلى حجم بلا حيث أنه يعمل على 3.5 "شاشات فون كذلك
فتح جزء الأدوات المساعدة تظهر علامة التبويب سمات المفتش في محاكاة مقاييس المقطع تعيين الحجم إلى لا شيء.
تعيين الإطار "عرض الجدول" إلى: س: 0، 0، ص: العرض: الارتفاع 320،: 416
تعيين عنوان البند شريط الزر الأيسر إلى ملف التعريف الخاص بي
تعيين عنوان "عنصر زر شريط" الحق إبطال الوصول
وهذا هو كل ما نريده من واجهة لدينا، وهذا كيف ينبغي أن ننظر الآن.

4-الإعداد إيبوتليتس & إيباكشنز
الخطوة 1
لدينا واجهة مستعدة، ولكن نحتاج خاصية إيبوتليت للاتصال "طريقة عرض الجدول"
 ونحتاج أيضا طريقتين إيباكشن إذا كنا نريد لدينا أزرار للعمل
 ذلك، بينما نحن في "واجهة البناء"، انقر على الزر الأوسط قسم محرر شريط الأدوات Xcode لجعل محرر مساعد تظهر

الخطوة 2
بهدف إنشاء الاتصال إيبوتليت اللازمة، فتح المخطط التفصيلي للمستند وقم بالخطوات التالية
عنصر تحكم + النقر أو حق + انقر فوق طريقة عرض الجدول
من القائمة المنبثقة، انقر على "مأخذ المراجع الجديدة"
السحب والإفلات في نافذة محرر مساعد، تماما مثل التي تراها في الصورة التالية
إعطاء اسم "طريقة عرض الجدول" وانقر على زر الاتصال
 أنا ببساطة اسم الجدول
الخطوة 3
لنقم بإنشاء هاتين الطريقتين إيباكشن الآن
 ينطبق الإجراء التالي في كل "من البندين زر شريط"
السيطرة + انقر فوق أو حق + انقر على البند "شريط الزر" الأيسر
انقر فوق الخيار محدد في المقطع "إرسال الإجراءات" من القائمة المنبثقة
السحب والإفلات في نافذة محرر مساعد تعيين شووبروفيلي كاسم للأسلوب وإنشائه.
إعطاء اسم ريفوكيكسيس إلى إيباكشن الأسلوب التالي عند إنشائه
 ملف ViewController.h بعد الخاصية إيبوتليت وأساليب إيباكشن ينبغي أن تبدو مثل هذا

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController@property (weak, nonatomic) IBOutlet UITableView *table;
- (IBAction )showProfile:(id)sender;- (IBAction )revokeAccess:(id)sender;
@end

5-إنشاء ملف التنفيذ 2.0 بروتوكول OAuth
الخطوة 1
على الرغم من أننا بإضافة طريقة "عرض الجدول" في المشروع، لن ننفذ أساليب مندوبة في الوقت الحاضر
 هذا هو الشيء الذي نحن بصدد القيام عند تنفيذ OAuth 2.0
 هو ما نحن ذاهبون للقيام بهذه الخطوة إنشاء ملف جديد حيث سوف نبني في بروتوكول OAuth
في متصفح المشروع، قم بما يلي
عنصر تحكم + النقر أو حق + انقر فوق مجموعة جوجليووثديمو
حدد الخيار ملف جديد.. من القائمة
الخطوة 2
في الإطار الذي يظهر، حدد خيار فئة الهدف جيم كقالب للملف الجديد
وبعد ذلك، في فئة فرعية من الحقل، حدد الخيار أويويبفيو
 ستكون لدينا فئة جديدة تكون فئة فرعية من فئةUIWebView لأننا نريد لإظهار طريقة عرض ويب للمستخدمين للسماح لهم بتسجيل الدخول باستخدام حساب Google الخاص بهم ومنحهم الوصول إلى التطبيق الخاص بنا
 في الحقل " فئة "، بإضافة قيمة جوجليواوث
في الخطوة التالية: فقط اضغط على الزر "إنشاء" للحصول على الملفات الجديدة المقدمة

6-تدفق OAuth 2.0
في هذا الجزء، سأذكر قريبا على الطريقة التي ستنفذ بها تدفق OAuth 2.0 وكيف جميع يلزم فحص لوجود الرموز المميزة وصحة الرمز المميز للوصول عقده
 أولاً وقبل كل شيء، بعد أن تم الحصول على الرمز المميز للوصول، يجب تخزينه بشكل دائم جنبا إلى جنب مع أي معلومات أخرى التي تأتي معها
 والأمر متروك للمطور لاختيار الطريقة التي سيتم حفظ كل هذه المعلومات
 قد تخزين كل شيء في قاعدة بيانات، وحفظه إلى الإعدادات الافتراضية المستخدم، وكتابة كل شيء إلى ملفات، أو استخدام أساليب أكثر أماناً من أجل إبقاء الأمور على آمنة
 في هذا البرنامج التعليمي، أنا أفضل لحفظ جميع الملفات عادي، داخل دليل الوثائق للتطبيق
نحن ذاهبون لإنشاء اثنين من الملفات المختلفة
 الرمز المميز للوصول، وغيرها من المعلومات التي تأتي مع ذلك من Google سوف تكون مخزنة في واحد أولاً، ما عدا لتحديث الرمز المميز
 يجري تحديث الرمز المميز ليتم حفظها في ملف آخر، لأننا بحاجة إلى الاحتفاظ بها لفترة أطول من كل شيء واستخدامه عندما انتهت صلاحية الرمز المميز للوصول
كل مرة يتم تحديث الرمز المميز للوصول، يتم الكتابة فوق محتويات الملف الأول
 بالإضافة إلى ذلك، تحديث الرمز المميز نفسه لم يتم تحديث كثير من الأحيان
حتى وقد قلت كل ذلك، هنا معاينة لتدفق للبروتوكول وكيف يمكن تنفيذها

على الرغم من أن صورة تساوي ألف كلمة، أود أن أصف أفضل الإجراء بأكمله لجعلها أكثر وضوحاً
 لتوضيح عملية التخويل
في حالة الملف الذي يحتوي على معلومات الرمز المميز الوصول غير موجود
يجري حاليا تشكيل عنوان URL الذي سوف نحتاج إلى الرمز مميز لوصول
 وترد جميع المعلمات الضرورية لمصادقة المستخدم. معرف العميل والعميل السري القيم مطلوبة هنا
المقبل، ونحن عرض طريقة عرض ويب داخل التطبيق (ونحن لا ندعو سفاري) للسماح للمستخدم بتسجيل الدخول إلى Google
 بعد نجاح في تسجيل دخول، يتم عرض رسالة من جوجل مع الأذونات نطلب إلى المستخدم، والذين ينبغي الموافقة إذا كان يريد الذهاب إلى أبعد
كود ترخيص يأتي مرة أخرى من جوجل، التي سيتم تبادلها مع الوصول الرمز المميز بعد الحق
ويتكون عنوان URL جديد مع معلمات جديدة. والهدف من ذلك تبادل التعليمات البرمجية الإذن مع الرمز المميز للوصول
إذا تم بنجاح الحصول على الرمز المميز للوصول، هو أبلغ الفئة المتصل عن طريق أسلوب تفويض
 خلاف ذلك، استخدام أسلوب آخر تفويض نسمح لفئة الطالب يعرف أنه لم يتم الحصول على الرمز المميز للوصول، لذلك ينبغي اتخاذ المزيد من الإجراءات حسب الحاجة
 في حالة رمز الملف الذي يحتوي على الوصول إلى المعلومات بالفعل موجود
يتم تحميل معلومات الرمز المميز الوصول من الملف
يتم التحقق من الرمز المميز للوصول لمعرفة ما إذا كانت انتهت أم لا
إذا كان الرمز المميز للوصول صالحاً، ثم فئة المتصل ببساطة يحصل إخطار من خلال أسلوب تفويض صالحاً ونهاية هذه الخطوات هنا
 خلاف ذلك، يتم تحديث الخطوات المقبلة المطلوبة
إذا لم يتم العثور على الملف الذي يحتوي على رمز التحديث في دليل المستندات، ثم تدفق OAuth كله يبدأ من جديد.
إذا كانت موجودة, يتم تحميل تحديث الرمز المميز طلب رمز وصول جديدة, و
 إذا كان تحديث الرمز المميز غير صحيح، سيتم إرجاع نوع من رسالة الخطأ من Google وتوجيه المستخدم إلى البداية مرة أخرى وإلا يتم الحصول على الرمز المميز للوصول, لذا، دعونا نرى كل شيء خطوة بخطوة.

7-البدء في بناء

الخطوة 1
أولاً، في فتح الملف GoogleOAuth.h واعتماد البروتوكولات التالية اثنين، ببساطة عن طريق تعريفهم في سطر الرأس @interface
@interface OAuth : UIWebView < UIWebViewDelegate , NSURLConnectionDataDelegate>
@end
أنا متأكد من أن من الواضح تماما ما هذه التفويضات .

الخطوة 2

الآن دعنا إنشاء نوع enum ، مع الأسلوب HTTP مقبولة القيم المطلوبة لمختلف مكالمات API
 في الوقت الحاضر، سوف نقوم بإنشاء نوع التعداد، ولكن سنستخدم أنه عندما سوف ننفذ أسلوب استدعاء API
لذا، الحق فوق خط @interface في الملف GoogleOAuth.h يضاف ما يلي
typedef enum {    httpMethod_GET,    httpMethod_POST,    httpMethod_DELETE,    httpMethod_PUT} HTTP_Method;
الخطوة 3
فمن المفيد استخدام الثوابت للأشياء التي لا نريد أن تجعل أي أخطاء حول، وهذا ينطبق على نقاط النهاية URL التي نريد الوصول إليها أثناء تدفق OAuth دائماً
 ولهذا السبب، افتح الملف GoogleOAuth.m وتعريف ثوابت اثنين التالية في الجزء العلوي من الملف
#define authorizationTokenEndpoint  @"https://accounts.google.com/o/oauth2/auth"#define accessTokenEndpoint         @"https://accounts.google.com/o/oauth2/token"
سيتم استخدام العنوان الأول الوصول إلى نقطة النهاية للحصول على التعليمات البرمجية الإذن، الذي سوف نتبادل ثم مع الرمز المميز للوصول باستخدام نقطة النهاية الثانية
 دعونا نمضي قدما الآن ودعونا نعلن بعض الخصائص الخاصة التي تسير على الاحتفاظ ببعض البيانات الأساسية
الخطوة 4
أثناء العمل في الملف GoogleOAuth.m داخل الجزء الخاص من الواجهة، وإضافة الخصائص التالية
وهناك تعليقات أعلاه كل الممتلكات التي تشرح الغرض منها

// The client ID from the Google Developers Console.@property (nonatomic, strong) NSString *clientID;// The client secret value from the Google Developers Console.@property (nonatomic, strong) NSString *clientSecret;// The redirect URI after the authorization code gets fetched. For mobile applications it is a standard value.@property (nonatomic, strong) NSString *redirectUri;// The authorization code that will be exchanged with the access token.@property (nonatomic, strong) NSString *authorizationCode;// The refresh token.@property (nonatomic, strong) NSString *refreshToken;// An array for storing all the scopes we want authorization for.@property (nonatomic, strong) NSMutableArray *scopes;
// A NSURLConnection object.@property (nonatomic, strong) NSURLConnection *urlConnection;// The mutable data object that is used for storing incoming data in each connection.@property (nonatomic, strong) NSMutableData *receivedData;
// The file name of the access token information.@property (nonatomic, strong) NSString *accessTokenInfoFile;// The file name of the refresh token.@property (nonatomic, strong) NSString *refreshTokenFile;// A dictionary for keeping all the access token information together.@property (nonatomic, strong) NSMutableDictionary *accessTokenInfoDictionary;
// A flag indicating whether an access token refresh is on the way or not.@property (nonatomic) BOOL isRefreshing;
// The parent view where the webview will be shown on.@property (nonatomic, strong) UIView *parentView;
ملاحظة للوصول إلى الرمز المميز هناك ليس خاصية نسترينج معينة، ولكن لديناaccessTokenInfoDictionary نسموتابليديكتيوناري لتخزين جميع الرمز المميز للوصول البيانات في مجال تكنولوجيا المعلومات ذات الصلةالخطوة 5
الوقت للقيام ببعض عمليات التهيئة. اذهب داخل - (id)initWithFrameCGRect)frame وإضافة التعليمات البرمجية التالية

- (id )initWithFrame:(CGRect)frame{    self = [super initWithFrame:frame];    if (self) {        // Set the access token and the refresh token file paths.        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);        NSString *docDirectory = [paths objectAtIndex:0];        _accessTokenInfoFile = [[NSString alloc] initWithFormat:@"%@/acctok", docDirectory];        _refreshTokenFile = [[NSString alloc] initWithFormat:@"%@/reftok", docDirectory];
        // Set the redirect URI.        // This is taken from the Google Developers Console.        _redirectUri = @"urn:ietf:wg:oauth:2.0:oob";   
        // Make any other required initializations.        _receivedData = [[NSMutableData alloc] init];        _urlConnection = [[NSURLConnection alloc] init];        _refreshToken = nil;        _isRefreshing = NO;    }    return self;}
باقي عمليات التهيئة ستجري داخل أساليب أن أنهم سوف تستخدم، حتى الآن ونحن على ما يرام.
8-تعريف بروتوكول
تعريف بروتوكول داخل فئة جديدة هي إحدى مهام التي تتم عادة بعد الانتهاء من معظم وظائف فئة، ولكن في حالتنا سيكون من الجميل إذا كان لدينا تعريف البروتوكول أعدت قبل أن ندخل أي زيادة
 ماذا سنفعل في الواقع هو لتعريف الأساليب البروتوكول التي ستنفذ في وقت لاحق من الفئات التي تعتمد على البروتوكول
 لذا، داخل الملفGoogleOAuth.h وفوق خط @interface إضافة الأسطر القليلة القادمة

@protocol GoogleOAuthDelegate-(void )authorizationWasSuccessful;-(void )accessTokenWasRevoked;-(void )responseFromServiceWasReceived:(NSString *)responseJSONAsString andResponseJSONAsData:(NSData *)responseJSONAsData;-(void )errorOccuredWithShortDescription:(NSString *)errorShortDescription andErrorDetails:(NSString *)errorDetails;-(void )errorInResponseWithBody:(NSString *)errorMessage;@end

هنا وصف مختصر للأساليب المذكورة أعلاه
authorizationWasSuccessful : أنها ستستخدم بعد تصريح ناجح، بمعنى بعد الحصول على رمز وصول صالح.
accessTokenWasRevoked : سوف تستخدم هذا الأسلوب المفوض عندما يلغي المستخدم كافة الأذونات الممنوحة.
responseFromServiceWasReceived:andResponseJSONAsData: : سيتم استدعاء هذا الأسلوب كل الوقت الذي يتم تلقي استجابة إلى استدعاء API
errorOccuredWithShortDescription:andErrorDetails: : يسمى عند حدوث خطأ عام
errorInResponseWithBody: : سيتم استدعاء هذا الأسلوب مندوب عند وجود خطأ في استجابة HTTP
وبعد ذلك، داخل @interfaceأضف السطر التالي
@interface OAuth : UIWebView < UIWebViewDelegate , NSURLConnectionDataDelegate>@property (nonatomic, strong) id <GoogleOAuthDelegate> gOAuthDelegate;
@end
9-إذن تدفق الإعداد
الخطوة 1
وحتى الآن، أعلنا جميع الأعضاء الخاصة متغيرات أننا سنحتاج إلى وتهيئة بعض منهم، حددنا الثوابت والمندوبين، والبروتوكول، ولذلك حان الوقت للبدء بتنفيذ تدفق التخويل الفعلي
 هو أفضل مكان للبدء من نقطة "الإدخال"، أسلوب العام الذي سيتم استدعاء المستخدم في كل مرة أن يؤذن أو استخدام API
انتقل إلى الملف GoogleOAuth.h وإضافة تعريف الأسلوب التالي
@interface GoogleOAuth : UIWebView < UIWebViewDelegate , NSURLConnectionDataDelegate>@property (nonatomic, strong) id <GoogleOAuthDelegate> gOAuthDelegate;-(void )authorizeUserWithClienID:(NSString *)client_ID andClientSecret:(NSString *)client_Secret                    andParentView :( UIView *)parent_View andScopes:(NSArray *)scopes;@end
الخطوة 2
دعونا نذهب للتنفيذ الآن
 وأعتقد أنه سيكون من الأفضل أن يكون الأسلوب الذي بني أولاً وثم مناقشة الأمر قليلاً
 إضافة الملف GoogleOAuth.m داخل أجزاء التعليمات البرمجية المتكررة التالية
-(void )authorizeUserWithClienID:(NSString *)client_ID                      andClientSecret :( NSString *)client_Secret                      andParentView :( UIView *)parent_View                      andScopes :( NSArray *)scopes{
    // Store into the local private properties all the parameter values.    _clientID = [[ alloc] NSString initWithString:client_ID];    _clientSecret = [[ alloc] NSString initWithString:client_Secret];    _scopes = [[ alloc] NSMutableArray initWithArray:scopes copyItems:YES];    _parentView = parent_View;
    // Check if the access token info file exists or not.    if ([self checkIfAccessTokenInfoFileExists]) {        // In case it exists load the access token info and check if the access token is valid.        [self loadAccessTokenInfo];        if ([self checkIfShouldRefreshAccessToken]) {            // If the access token is not valid then refresh it.            [self refreshAccessToken];        }        else{            // Otherwise tell the caller through the delegate class that the authorization is successful.            [self .gOAuthDelegate authorizationWasSuccessful];        }   
    }    else{        // In case that the access token info file is not found then show the        // webview to let user sign in and allow access to the app.        [self showWebviewForUserLogin];    }}
دعونا نتحدث قليلاً عن الطريق الأسلوب أن كتبنا فقط يعمل. كما ترون، أول شيء نقوم به لتخزين كافة القيم التي يتم تمريرها إلى الأسلوب كمعلمات للخصائص المحلية
 هذه هي معرف العميل السري العميل ونطاقات الصفيف و UIViewالتي تظهر ضمن عرض ويب تسجيل الدخول
يشير نطاق API التي تطلب التطبيق الوصول ل
المقبل، ونحن تحقق إذا كان ملف معلومات الرمز المميز الوصول موجودة أم لا
 في حال كان موجوداً، ونحن تحميله باستخدام الأسلوب loadAccessTokenInfo
 أننا التحقق إذا كان صالحاً باستخدام الأسلوبcheckIfShouldRefreshAccessToken وإذا لم يكن كذلك، علينا تحديث باستخدام أسلوبrefreshAccessToken
 في حالة صالحة الرمز المميز للوصول، وأنها لم تنته بعد، نحن فقط إبلاغ الفئة المتصل من خلال أسلوب التفويض authorizationWasSuccessful
 أخيرا، إذا كان الملف معلومات الرمز المميز الوصول غير موجود، ونحن ببساطة استدعاء الأسلوب showWebviewForUserLogin لإجبار webview تظهر، والسماح للمستخدم بتسجيل الدخول
كل الطرق المذكورة أعلاه سيكون تنفيذها واحدة تلو الأخرى
10-أسلوب المعاينة واﻹعلان
كما يمكنك أن ترى لنفسك في المقتطف أعلاه، يعمل الأسلوب تقريبا في مجملها باستخدام الأساليب الأخرى، والقطاع الخاص
 قبل الانتقال إلى الخطوات التالية، أنها لفكرة جيدة أن تعلن جميع الأساليب الخاصة التي سنقوم بتنفيذ داخل المقطع الخاص @interface
من أجل تسهيل فهم الفكرة كلها، أفضل أن فصل الأساليب الخاصة في فئتين
الأولى تشمل تلك الأساليب التي جزء من تدفق الإذن نفسها
 وهذه
@interface OAuth()......-(void )showWebviewForUserLogin;-(void )exchangeAuthorizationCodeForAccessToken;-(void )refreshAccessToken;
@end
وتشمل الفئة الثانية الطرق الإضافية التي يتمثل دورها في دعم تدفق الإذن بتنفيذ العمليات الضرورية الأخرى في النظام الداخلي كله يعمل بشكل صحيح
 وهذه تشمل ما يلي
@interface OAuth()......-(NSString *)urlEncodeString:(NSString *)stringToURLEncode;-(void )storeAccessTokenInfo;-(void )loadAccessTokenInfo;-(void )loadRefreshToken;-(BOOL )checkIfAccessTokenInfoFileExists;-(BOOL )checkIfRefreshTokenFileExists;-(BOOL )checkIfShouldRefreshAccessToken;-(void )makeRequest:(NSMutableURLRequest *)request;
@end
وباﻹضافة إلى كل ما سبق، سنقوم بتنفيذ أسلوب التفويض التالي لعرض ويب

1 -(void )webViewDidFinishLoad:(UIWebView *)webView;
استخدام أننا سوف "قراءة" التعليمات البرمجية الحصول على إذن.
بالإضافة إلى ذلك، سنقوم بتنفيذ أساليب مندوب NSURLConnection التالية

-(void )connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;-(void )connectionDidFinishLoading:(NSURLConnection *)connection;-(void )connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;-(void )connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

دعونا نمضي قدما الآن ودعونا نرى كيفية ربط كل هذه معا
11-تنفيذ تدفق التخويل
الخطوة 1
دعونا تواصل بالكتابة -(void)showWebviewForUserLogin الأسلوب
 هذا الأسلوب يخدم غرضين
 الأول هو تشكيل URL الذي سيتم استخدام التطبيق لدينا للحصول على التعليمات البرمجية الإذن مع كافة المعلمات المطلوبة
والثاني هو لإظهار عرض ويب للمستخدمين، ومن خلالها سيتم تسجيل الدخول حساب Google ومنح أذونات الوصول إلى التطبيق
 دعونا نرى الأسلوب أولاً
-(void )showWebviewForUserLogin{    // Create a string to concatenate all scopes existing in the _scopes array.    NSString *scope = @"";    for (int i=0; i<[_scopes count]; i++) {        scope = [scope stringByAppendingString:[self urlEncodeString:[_scopes objectAtIndex:i]]];   
        // If the current scope is other than the last one, then add the "+" sign to the string to separate the scopes.        if (i < [_scopes count] - 1) {            scope = [scope stringByAppendingString:@"+"];        }    }
    // Form the URL string.    NSString *targetURLString = [NSString stringWithFormat:@"%@?scope=%@&amp;redirect_uri=%@&amp;client_id=%@&amp;response_type=code",                                 authorizationTokenEndpoint,                                 scope,                                 _redirectUri,                                 _clientID];

    // Do some basic webview setup.    [self setDelegate : self];    [self setScalesPageToFit : YES];    [self setAutoresizingMask :_parentView .autoresizingMask];
    // Make the request and add self (webview) to the parent view.    [self loadRequest :[NSURLRequest requestWithURL:[NSURL URLWithString:targetURLString]]];    [_parentView addSubview:self];}
زوجان من الملاحظات الآن. في البداية، يتم الحصول على متصلاً كافة النطاقات الموجودة في الصفيف _scopes في أحد NSString، بعد أن تم ترميز URL
 وهذا يجب أن يكون، كما يجب استبدال كل الأحرف الخاصة التي قد تكون موجودة في نطاق بما يعادل URL ترميز الحرف المزيد عن هذا في وقت لاحق
 سلسلة مؤقتة تستخدم لأغراض سلسلة
داخل سلسلة متسلسلة يتم فصل النطاقات باستخدام علامة زائد علامة "+"
وبعد ذلك، يتم تشكيل سلسلة عنوان URL. إيلاء اهتمام خاص للمعلمات فإنه يقبل
ونحن نقدم
نقطة رمز التخويل
النطاقات
إعادة توجيه URI وقيمة ثابتة للتطبيقات المثبتة
معرف العميل التي حصلنا عليها من وحدة "تحكم مطوري جوجل"
قيمة response_type التي تم تعيينها إلى قيمة قياسية code
في النصف الثاني من الأسلوب، ببساطة إنشاء طريقة عرض ويب التي سوف تظهر للمستخدم. لا يوجد شيء خاص أود أن أشير هنا، التعليمة البرمجية سهل بما يكفي
 مجرد ملاحظة بعد وضع كل شيء واستدعاء الأسلوب loadRequestعرض ويب إضافة كطريقة عرض فرعية إلى طريقة العرض الأصل
الخطوة 2
مرة واحدة وقعت المستخدم ووافقت على توفير إمكانية الوصول إلى التطبيق لدينا، يتم إرجاع رمز التخويل من جوجل. في الواقع، هناك طريقتان للحصول عليه
 أول واحد ينطوي على استخدام ملفات تعريف الارتباط، حيث يتم تخزين التعليمات البرمجية الإذن في ملف تعريف ارتباط
 جوجل توفر نموذج على كيفية استخدام هذه الطريقة
 ثانية واحدة، وهي طريقة أفضل لاستخدام، للحصول على التعليمات البرمجية الحصول على إذن من عنوان الصفحة في عرض ويب
 متى يمكننا الحصول عليه، نحن على استعداد المضي قدما في الحصول على الرمز المميز للوصول
وهذا ما سنفعله في عرض ويب واحد فقط تفويض الأسلوب الذي نحن ذاهبون لتنفيذ
دعونا نرى هذا في العمل
-(void )webViewDidFinishLoad:(UIWebView *)webView{    // Get the webpage title.    NSString *webviewTitle = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];    //NSLog(@"Webview Title = %@", webviewTitle);
    // Check for the "Success token" literal in title.    if ([webviewTitle rangeOfString:@"Success code"].location != NSNotFound) {        // The oauth code has been retrieved.        // Break the title based on the equal sign (=).        NSArray *titleParts = [webviewTitle componentsSeparatedByString:@"="];        // The second part is the oauth token.        _authorizationCode = [[ alloc] NSString initWithString:[titleParts objectAtIndex:1]];   
        // Show a "Please wait..." message to the webview.        NSString *html = @"<html><head><title>Please wait</title></head><body><h1>Please wait...</h1></body></html>";        [self loadHTMLString :html baseURL :[NSURL fileURLWithPath:[[ mainBundle] NSBundle bundlePath]]];   
        // Exchange the authorization code for an access code.        [self exchangeAuthorizationCodeForAccessToken];    }    else{        if ([webviewTitle rangeOfString:@"access_denied"].location != NSNotFound) {            // In case that the user tapped on the Cancel button instead of the Accept, then just            // remove the webview from the superview.            [webView removeFromSuperview];        }    }}
رمز التخويل التي يتم إرجاعها بشكل مماثل ل code=4/a5F4r45.... That't لماذا في المقتطف أعلاه العنوان هو يجري تقسيم إلى أجزاء على أساس علامة يساوي "="
 بعد ذلك، نحن على استعداد لتبادل من الرمز المميز للوصول
الخطوة 3
الآن بعد أن تم الحصول على الرمز المميز إذن، لم يعد هناك حاجة عرض ويب
 سنقوم بإزالة فإنه على الرغم من أن في نهاية العملية برمتها الخطوة التالية
 ستكون الفئات NSURLConnection و NSURLRequest في استخدامها من الآن فصاعدا
 ماذا علينا أن نفعل في الأسلوب exchangeAuthorizationCodeForAccessToken هو فقط لإعداد كافة المعلمات المطلوبة اللازمة للحصول على الرمز المميز للوصول، وأن تقدم طلبا للوصول إلى نقطة النهاية الرمز المميز
 أن أهم شيء ينبغي أن أشير هنا أن يتم استخدام أسلوب POST HTTP
 وإليك الطريقة
-(void )exchangeAuthorizationCodeForAccessToken{    // Create a string containing all the post parameters required to exchange the authorization code    // with the access token.    NSString *postParams = [NSString stringWithFormat:@"code=%@&amp;client_id=%@&amp;client_secret=%@&amp;redirect_uri=%@&amp;grant_type=authorization_code",                            _authorizationCode,                            _clientID,                            _clientSecret,                            _redirectUri];
    // Create a mutable request object and set its properties.    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:accessTokenEndpoint]];    [request setHTTPMethod:@"POST"];    [request setHTTPBody:[postParams dataUsingEncoding:NSUTF8StringEncoding]];    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    // Make the request.    [self makeRequest :request];}
لاحظ استخدام التعليمات البرمجية الإذن التي اكتسبناها في الخطوة السابقة.
الخطوة 4
عند تقديم طلب واستخدام نسورلكونيكشن، قد يحدث شيئين
 سيتم إنهاء الاتصال بنجاح، أو أنها سوف تفشل
 وفي حالتنا، عند فشل طلب إجراء نريد فقط أن تبلغ الفئة المتصل عن طريق التفويض وهذا كل شيء
 لذا، دعنا نكتب أسلوب التفويضNSURLConnection الأولى
-(void )connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{    [self .gOAuthDelegate errorOccuredWithShortDescription : @"Connection failed." andErrorDetails :[error localizedDescription]];}
يمكنك مشاهدة كيف تصبح طرقنا مندوب مفيد
 دعونا نذهب الآن إلى حالة الانتهاء بنجاح من الاتصال وقد تم تلقي الرمز المميز للوصول
-(void )connectionDidFinishLoading:(NSURLConnection *)connection{    // This object will be used to store the converted received JSON data to string.    NSString *responseJSON;
    // This flag indicates whether the response was received after an API call and out of the    // following cases.    BOOL isAPIResponse = YES;
    // Convert the received data in NSString format.    responseJSON = [[NSString alloc] initWithData:(NSData *)_receivedData encoding :NSUTF 8 StringEncoding];   
    // Check for access token.    if ([responseJSON rangeOfString:@"access_token"].location != NSNotFound) {        // This is the case where the access token has been fetched.        [self storeAccessTokenInfo];   
        // Remove the webview from the superview.        [self removeFromSuperview];   
        if (_isRefreshing) {            _isRefreshing = NO;        }   
        // Notify the caller class that the authorization was successful.        [self .gOAuthDelegate authorizationWasSuccessful];   
        isAPIResponse = NO;    }}
لا تخدع نفسك بالاعتقاد بأن هذا سوف يكون مضمون هذا الأسلوب مندوب فقط
 في الواقع، أنها سوف تصبح كبيرة نوعا ما، ولكن ينبغي أن لا تمانع عن ذلك الآن
ملاحظة: هل ترى العلم isAPIResponse ؟ حسنا، وهذا مفيد لمعرفة متى تعتبر الاستجابة API أو عملية الإذن نفسها
 عندما يتعلق الأمر تحت أي قضية له للقيام بعملية الترخيص، فإنه يصبح لا، كما يمكنك أن ترى في القضية في الرمز المميز للوصول
 عليك فهم تماما أهميته على طول الطريق
جوجل تقوم بإرجاع كائن JSON الذي يحتوي على الرمز المميز للوصول جنبا إلى جنب مع بيانات أخرى
 أول شيء نقوم به لتحويل البيانات المتلقاة إلى قيمة سلسلة، حتى يمكننا بسهولة تمييز يتلقى أي نوع من البيانات والتعامل معها بشكل صحيح
 بالقيام بذلك في بداية الطريقة، علينا التحقق ما إذا كان الرمز المميز للوصول وردت في الواقع أم لا، ببساطة عن طريق البحث عنه داخل سلسلة استجابة
 إذا كان هناك، ثم.. نجاح باهر، ونحن فقط الحصول على الرمز المميز للوصول!دعونا العناية بها الآن
 أولاً، نحن حفظه في الملف، ونقوم بإزالة عرض ويب من سوبيرفيو
 في الحالة التي تم الحصول على الرمز المميز للوصول أثناء عملية تحديث، يمكننا تعيين علامة كل منها إلى NO
 وأخيراً، نحن نستخدم مندوبنا إبلاغ الفئة المتصل أن الرمز المميز للوصول قد اكتسبت بنجاح
JSON التي يتم إرجاعها شيء مماثل لهذا واحد
عند هذه النقطة، إضافة مقطع التعليمات البرمجية التالية أعلاه if ([_responseJSON rangeOfString:@"access_token"].location != NSNotFound) { الخط. أنها مطلوبة للتعامل مع أي طلب غير صحيح قد تحدث
 إذا كنت أتساءل لماذا يمكن أن هذا يحدث، مجرد محاولة للعب حولها مع عملية التخويل أو تحديث كامل وسوف تجد بسهولة
if ([responseJSON rangeOfString:@"invalid_request"].location != NSNotFound) {    NSLog(@"General error occured.");
    // If a refresh was on the way then set the respective flag to NO.    if (_isRefreshing) {        _isRefreshing = NO;    }
    // Notify the caller class through the delegate.    [self .gOAuthDelegate errorInResponseWithBody :responseJSON];

    isAPIResponse = NO;}
مهم جداً أسلوب التفويض NSURLConnection المقبل أيضا، إذا كنت تريد المذكورين أعلاه للعمل بشكل صحيح.
-(void )connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{    // Append any new data to the _receivedData object.    [_receivedData appendData:data];}
تدفق إذن انتهت الآن
 ومع ذلك، لا يزال هناك كثير من العمل يتعين القيام به قبل فسوف نكون مستعدين القول أن لدينا فئة تنفيذا كاملا
12-تحديث الرمز المميز للوصول
قطعة واحدة من المعلومات التي يتم استلامها جنبا إلى جنب مع الرمز المميز للوصول هو الوقت بالثواني الرمز المميز للوصول غير صالحة
 بينما الرمز المميز للوصول غير صالح، يمكن استخدامه دون أي مشكلة عند استدعاء واجهات برمجة التطبيقات
 ومع ذلك، عند انتهاء صلاحية الرمز المميز، تحديث ضروري لتتم في الخلفية ورمز وصول جديد يحتاج إلى الحصول على
للتحقق من الرمز مميز لوصول لا تزال صالحة أم لا، سوف نستخدم أسلوبcheckIfShouldRefreshAccessToken
 سوف ننفذ ذلك قليلاً في وقت لاحق، جنبا إلى جنب مع بقية الأساليب الخاصة الإضافية
 الآن، دعونا نركز على عملية التحديث
الطريقة التي يمكننا تحديث الرمز مميز لوصول مماثلة تماما للطريقة التي يمكننا تبادل التعليمات البرمجية الحصول على إذن للرمز المميز للوصول
 نحن تعيين المعلمات POST ونحن أداء NSURLRequest بغية الحصول على رمز وصول جديدة. وإليك الطريقة
-(void )refreshAccessToken{    // Load the refrest token if it's not loaded alredy.    if (_refreshToken == nil) {        [self loadRefreshToken];    }
    // Set the HTTP POST parameters required for refreshing the access token.    NSString *refreshPostParams = [NSString stringWithFormat:@"refresh_token=%@&client_id=%@&client_secret=%@&grant_type=refresh_token",                                   _refreshToken,                                   _clientID,                                   _clientSecret                                   ];
    // Indicate that an access token refresh process is on the way.    _isRefreshing = YES;
    // Create the request object and set its properties.    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:accessTokenEndpoint]];    [request setHTTPMethod:@"POST"];    [request setHTTPBody:[refreshPostParams dataUsingEncoding:NSUTF8StringEncoding]];    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    // Make the request.    [self makeRequest :request];}
كما ترون، نحن بحاجة فقط تحديث الرمز المميز الذي تم الحصول عليها مع الرمز المميز للوصول ومعرف العميل والعميل السرية والمعلمات grant_type القيمة القياسية
 شيء جد أو جديد هنا
وهناك بضعة أشياء يجب أن أشدد على هذه النقطة
 أولاً وقبل كل شيء، رمز تحديث يستمر الكثير أطول من الرمز مميز لوصول
 وهذا يعني أن لا يتم تلقي مميز لتحديث في كل مرة يتم إجراء تحديث على الطريق
 تحديث رمز مميز يمكن استخدامها مرات عديدة، وهذه الحقيقة يؤدي إلى الحاجة إلى طريقة الدائم أكثر من مخزن، بينما ينبغي أن يكون المكان الحفظ/الطريقة لأنها تختلف في الرمز المميز للوصول
 آخر قد يكون إعادة كتابة عدة مرات، وإذا كان يوجد تحديث الرمز المميز مع ذلك، سيتم حذفه بعد التحديث الأول
وثانيا، يمكن أن تصبح مميز لتحديث غير صحيح كذلك
 وفي هذه الحالة، وإذا كان الرمز المميز للوصول بحاجة إلى تحديث، المستخدم يجب أن تكون أدت إلى إدخال معلومات تسجيل الدخول وتوفير أذونات الوصول مرة أخرى
 هذه هي حالة ينبغي أن نتوقع في التعليمات البرمجية الخاصة بنا
داخل -(void)connectionDidFinishLoading:(NSURLConnection *)connection موجود بأسلوب التفويض، حالة الحصول على الرمز مميز لوصول من الرد الفعل
 ماذا نحتاج أيضا إلى إضافة هو قطعة التعليمات برمجية جديدة التي سوف تحقق إذا استجابت جوجل أن لدينا رمز مميز غير صحيح تحديث
 هكذا، الحق قبل if ([_responseJSON rangeOfString:@"access_token"].location != NSNotFound) الخط
 أضف ما يلي
// Check for invalid refresh token.// In that case guide the user to enter the credentials again.if ([responseJSON rangeOfString:@"invalid_grant"].location != NSNotFound) {    if (_isRefreshing) {        _isRefreshing = NO;    }
    [self showWebviewForUserLogin];
    isAPIResponse = NO;}
بواسطة استدعاء الأسلوب showWebviewForUserLogin ، نحن بدء الإجراء بأكمله مرة أخرى
13-مساعدة الخاص أساليب
مزيد من الوقت لتنفيذ بقية الأساليب المساعدة، وخاصة ونحن قد أعلن بالفعل
الخطوة 1
دعونا نبدأ باستخدام الأسلوب -(NSString *)urlEncodeString:(NSString *)stringToURLEncode ، الذي يستخدم ببساطة تحويل URL المتصلة بسلاسل إلى نموذج ترميز URL
 عند إرسال البيانات عبر شبكة الإنترنت، يمكن أن توجد ليس كل حرف في عنوان URL
 الاستعاضة عنها بأحرف خاصة أخرى، التي هي صديقة لعنوان URL، وهذا بالضبط ما يفعله الأسلوب التالي
-(NSString *)urlEncodeString:(NSString *)stringToURLEncode{    // URL-encode the parameter string and return it.    CFStringRef encodedURL = CFURLCreateStringByAddingPercentEscapes(NULL,                                                                     (CFStringRef) stringToURLEncode,                                                                     NULL,                                                                     (CFStringRef)@"!@#$%&*'();:=+,/?[]",                                                                     kCFStringEncodingUTF 8);    return (NSString *)CFBridgingRelease(encodedURL);}
كما ترون، ترجع الدالة CFURLCreateStringByAddingPercentEscapes ، الذي أنصح قراءة المزيد حول هذا الموضوع، كائن نوع CFStringRef ، ومن ثم تم تحويلها إلى NSString عند فإنه يتم إرجاعها
 ليس من الصعب أن نفهم المعلمات تقبل هذه الدالة
 علما بأن نقدم "قائمة" الأحرف وينبغي استبدالها بالأحرف النسبة المئوية
 على سبيل المثال، يتم تحويل ! إلى 21 في المائة، * % 2 ألف، وهلم جرا
 المعلمة الأخيرة تتصل بالترميز المطلوب
الخطوة 2
يمكننا الاستمرار بالتالي
-(void )storeAccessTokenInfo{    NSError *error;
    // Keep the access token info into a dictionary.    _accessTokenInfoDictionary = [NSJSONSerialization JSONObjectWithData:_receivedData :NSJSONReadingMutableContainers errorمن options:&error];
    // Check if any error occured while converting NSData data to NSDictionary.    if (error) {        [self .gOAuthDelegate errorOccuredWithShortDescription : @"An error occured while saving access token info into a NSDictionary."                                                andErrorDetails :[error localizedDescription]];    }
    // Save the dictionary to a file.    [_accessTokenInfoDictionary writeToFile:_accessTokenInfoFile atomically:YES];

    // If a refresh token is found inside the access token info dictionary then save it separately.    if ([_accessTokenInfoDictionary objectForKey:@"refresh_token"] != nil) {        // Extract the refresh token.        _refreshToken = [[ alloc] NSString initWithString:[_accessTokenInfoDictionary objectForKey:@"refresh_token"]];   
        // Save the refresh token as data.        [_refreshToken writeToFile:_refreshTokenFile atomically:YES encoding:NSUTF8StringEncoding error:&error];   
        // If an error occurs while saving the refresh token notify the caller class.        if (error) {            [self .gOAuthDelegate errorOccuredWithShortDescription : @"An error occured while saving the refresh token."                                                  andErrorDetails :[error localizedDescription]];        }    }}
أشياء بسيطة هنا
 في البداية، البيانات المتلقاة التي تحتوي على الوصول معلومات الرمز المميز يتم تخزينها في قاموسaccessTokenInfoDictionary قابلة للتغيير، التي، بدورها، مكتوبة إلى ملف. ثم، يتم فحص ما إذا كان يوجد تحديث رمز مميز في المعلومات التي تم إرجاعها
 إذا وجدت، يتم استخراج وحفظها إلى ملف آخر
 تذكر أننا بحاجة إلى الحفاظ التحديث الرمز المميز فصل من ملف رمز الوصول
الخطوة 3
دعونا نرى الأسلوب loadAccessTokenInfo الآن ومن ثم الحديث عن ذلك
-(void )loadAccessTokenInfo{    // Check if the access token info file exists.    if ([self checkIfAccessTokenInfoFileExists]) {        // Load the access token info from the file into the dictionary.        _accessTokenInfoDictionary = [[ alloc] NSMutableDictionary initWithContentsOfFile:_accessTokenInfoFile];    }    else{        // If the access token info file doesn't exist then inform the caller class through the delegate.        [self .gOAuthDelegate errorOccuredWithShortDescription : @"Access token info file was not found."                                              andErrorDetails:@""];    }}
أولاً وقبل كل شيء، علينا التحقق إذا كان ملف معلومات الرمز المميز الوصول موجودة أم لا
 إذا كان موجوداً، ثم تحميله إلى accessTokenInfoDictionary
 إذا لم يتم العثور على الملف لسبب ما، ثمerrorOccuredWithShortDescription:andErrorDetails: يتم استدعاء أسلوب التفويض إبلاغ الفئة المتصل
الخطوة 4
وبعد ذلك، دعونا نرى كيف يتم تحميل تحديث الرمز المميز، وكذلك
-(void )loadRefreshToken{    // Check if the refresh token file exists.    if ([self checkIfRefreshTokenFileExists]) {        NSError *error;        _refreshToken = [[ alloc] NSString initWithContentsOfFile:_refreshTokenFile encoding:NSUTF8StringEncoding error:&error];   
        // If an error occurs while saving the refresh token notify the caller class.        if (error) {            [self .gOAuthDelegate errorOccuredWithShortDescription : @"An error occured while loading the refresh token."                                                  andErrorDetails :[error localizedDescription]];        }    }}
أن النهج هنا هو نفسه كما سبق تنفيذه
 أننا التحقق إذا كان يوجد ملف بتحديث التعليمات البرمجية، وإذا كان لا يمكننا تحميله في السلسلة refreshToken
 وبخلاف ذلك، نحن تقرير خطأ إلى فئة الطالب من خلال أسلوب التفويض
الخطوة 5
المهمة التالية للتحقق إذا كان الملف الذي يحتوي معلومات الرمز المميز الوصول موجودة أم لا
-(BOOL )checkIfAccessTokenInfoFileExists{    // If the access token info file exists, return YES, otherwise return NO.    return (![[ defaultManager] NSFileManager fileExistsAtPath:_accessTokenInfoFile]) ? NO : YES;}
الخطوة 6
قم بالضبط بنفس الملف تحديث الرمز المميز
-(BOOL )checkIfRefreshTokenFileExists{    // If the refresh token file exists then return YES, otherwise return NO.    return (![[ defaultManager] NSFileManager fileExistsAtPath:_refreshTokenFile]) ? NO : YES;}
بسيط جداً، أليس كذلك؟
الخطوة 7دعونا نرى الآن كيفية معرفة ما إذا كان الرمز مميز لوصول صالحة أم لا
 عندما نتحدث عن صحة، فإننا نعني ما إذا كان الرمز المميز للوصول انتهت أم لا
 جوجل تقوم بإرجاع الوقت الذي الرمز مميز لوصول قد تبقى على قيد الحياة، جنبا إلى جنب مع بقية البيانات التي تم إرجاعها
 يتم التعبير عن ذلك الوقت بالثواني، وأنها عادة ما تكون 3600 ثانية أو ساعة واحدة
 إذا انتهت صلاحية الرمز مميز لوصول، ونحن نريد لتبادل البيانات من خدمة Google، أننا ببساطة نحتاج لتحديثها في الخلفية والحصول على واحدة جديدة
ستكون لدينا استراتيجية بسيطة حقا
 ونحن سوف تقرأ وقت إنشاء الملف الذي يحتوي على معلومات الرمز المميز الوصول، فضلا عن الوقت الرمز المميز للوصول يجب أن تبقى سارية المفعول
 إذا كان الوقت الذي انقضى منذ إنشاء ملف أكبر من الوقت للعيش، ثم تحديث مطلوب، إلا أن الرمز المميز للوصول لا يزال صالحاً
 دعونا نرى كل شيء في العمل
-(BOOL )checkIfShouldRefreshAccessToken{    NSError *error = nil;
    // Get the time-to-live (in seconds) value regarding the access token.    int accessTokenTTL = [[_accessTokenInfoDictionary objectForKey:@"expires_in"] intValue];    // Get the date that the access token file was created.    NSDate *accessTokenInfoFileCreated = [[[ defaultManager] NSFileManager attributesOfItemAtPath:_accessTokenInfoFile error:&error]                                          fileCreationDate];
    // Check if any error occured.    if (error != nil) {        [self .gOAuthDelegate errorOccuredWithShortDescription : @"Cannot read access token file's creation date."                                              andErrorDetails :[error localizedDescription]];   
        return YES;    }    else{        // Get the time difference between the file creation date and now.        NSTimeInterval interval = [[ date] NSDate timeIntervalSinceDate:accessTokenInfoFileCreated];
        // Check if the interval value is equal or greater than the accessTokenTTL value.        // If that's the case then the access token should be refreshed.        if (interval >= accessTokenTTL) {            // In this case the access token should be refreshed.            return YES;        }        else{            // Otherwise the access token is valid.            return NO;        }    }}
لذا، في حالة يجب أن يتم تحديث الرمز المميز للوصول نعود نعم، إلا أننا نعود رقم كل شيء أوضح الذاتي، ذلك التعليق ليس كذلك هنا
الخطوة 8
هناك طريقة واحدة فقط التي قد تركت خارج هذه الخطوات، makeRequest
 هذا الأسلوب ليس له أي علاقة خاصة أو الخاصة أود أن أشير إلى
 أنه موجود فقط لتجنب كتابة التعليمات البرمجية نفسها في كل مرة نريد أن نجعل طلبات نسورلريكويست
 لذا، كما سوف تشاهد على الفور، ما نفعله هو تفريغ الكائن receivedData بتعيين الطول إلى صفر وتقديم طلب جديد
-(void )makeRequest:(NSMutableURLRequest *)request{    // Set the length of the _receivedData mutableData object to zero.    [_receivedData setLength:0];
    // Make the request.    _urlConnection = [NSURLConnection connectionWithRequest:request delegate:self];}
14-نسورلكونيكشن الإضافات
الخطوة 1
هناك عدد قليل من الأشياء التي ينبغي أن نضيف داخل connectionDidFinishLoading: طريقة لجعل هذه الفئة أكثر اكتمالا. حتى الآن وقد أضفنا الدعم للتعامل مع الاستجابات بشأن
طلبات غير صالح
المنح غير صالح مثل رمز تحديث منتهية الصلاحية
الحصول على رمز الوصول
ما نحن يجب أيضا إضافة الدعم لهو حالة بيانات اعتماد غير صالحة، وأي استجابة الأخرى التي قد تحتوي على كلمة خطأ في داخله
 وصول استجابة يحتوي على رسالة بيانات الاعتماد غير صحيحة عندما يتم استدعاء API والرمز المميز للوصول غير صالح
 في التنفيذ، ونحن دائماً التحقق إذا كان الرمز المميز للوصول صالحاً أو لا قبل القيام بأية طلبات بيد أن هذا لا يزال قضية حافة التي ينبغي أن نتوقع
 لأي حالة أخرى عامة أن يصف الرد خطأ، ونحن نسمي أسلوب التفويضerrorInResponseWithBody
 ذلك، في النهاية connectionDidFinishLoading:، أضف المقطع التالي من التعليمات البرمجية
// Check for invalid credentials.// This checking is useful when an API is called without prior checking whether the// access token is valid or not.if ([responseJSON rangeOfString:@"Invalid Credentials"].location != NSNotFound ||    [responseJSON rangeOfString:@"401"] .location != NSNotFound) {    [self refreshAccessToken];
    isAPIResponse = NO;}

// This is the case where any other error message exists in the response.if ([responseJSON rangeOfString:@"error"].location != NSNotFound) {    [self .gOAuthDelegate errorInResponseWithBody :responseJSON];    isAPIResponse = NO;}
إذا كنت ننظر الآن connectionDidFinishLoading: محتوى الأسلوب، سترى جميع الحالات التي ينبغي أن تأخذ الرعاية من فيما يتعلق بالردود جوجل
 للاستخدام العادي، وغرض هذا البرنامج التعليمي، تقريبا أي شيء آخر يحتاج إلى إضافة، عدا شيء واحد
 الدعوة إلىresponseFromServiceWasReceived:andResponseJSONAsData: تفويض الأسلوب
 سيتم استدعاء هذا الأسلوب في كل مرة أن يتم استرداد ردا حول استدعاء API فئة الطالب ينبغي التعامل معها، وأنها لا تأتي تحت أي من الحالات السابقة الأخرى
 هنا
// If execution successfully arrives here then notify the caller class that a response was received.if (isAPIResponse) {    [self .gOAuthDelegate responseFromServiceWasReceived :responseJSON andResponseJSONAsData :_receivedData];}
الخطوة 2
سيكون من المفيد (وخاصة عند التصحيح) أن يكون الأسلوب التالي تنفيذها، وكذلك
-(void )connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;    NSLog(@"%d", [httpResponse statusCode]);}
الكائن httpResponse يحتوي على رمز حالة HTTP يتم إرجاعه للطلب التي تم إجراؤها
 إذا كان كل شيء فات عادة، قيمة هذا الرمز هو 200
 البحث حول الإنترنت لمزيد من المعلومات حول رموز حالة HTTP إذا كنت تريد

15. إلغاء الرمز المميز الوصول

وهناك حالات قد تحتاج إلى إبطال الوصول الذي أعطيته في التطبيق جوجل يوفر URL الذي يمكن التقدم بطلب، وعندما يجري إبطال الوصول
فتح فئة GoogleOAuth.h لتعريف أسلوب عمومي جديد، كالتالي الضوء على
@interface GoogleOAuth : UIWebView < UIWebViewDelegate , NSURLConnectionDataDelegate>@property (nonatomic, strong) id <GoogleOAuthDelegate> gOAuthDelegate;-(void )authorizeUserWithClienID:(NSString *)client_ID andClientSecret:(NSString *)client_Secret                  andParentView :( UIView *)parent_View andScopes:(NSArray *)scopes;-(void )revokeAccessToken;
@end
الآن اذهب إلى الملف GoogleOAuth.m لتنفيذ ذلك
-(void )revokeAccessToken{    // Set the revoke URL string.    NSString *revokeURLString = [NSString stringWithFormat:@"https://accounts.google.com/o/oauth2/revoke?token=%@",                                 [_accessTokenInfoDictionary objectForKey:@"access_token"]                                 ];    // Create and make a request based on the URL string.    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:revokeURLString]];    [self makeRequest :request];
    // Now that the request for revoking the access in Google has been made,    // all local files regarding the access token should be removed as well.    NSError *error = nil;    // If the access token info file exists then delete it.    if ([self checkIfAccessTokenInfoFileExists]) {        [[NSFileManager defaultManager ] removeItemAtPath:_accessTokenInfoFile error:&error];   
        if (error != nil) {            // If an error occurs while removing the access token info file then notify the caller class through the            // next delegate method.            [self .gOAuthDelegate errorOccuredWithShortDescription : @"Unable to delete access token info file."                                                  andErrorDetails :[error localizedDescription]];        }    }
    // Check now if the refresh token file exists and then remove it.    if ([self checkIfRefreshTokenFileExists]) {        [[NSFileManager defaultManager ] removeItemAtPath:_refreshTokenFile error:&error];   
        if (error != nil) {            // In case of an error while removing the file then notify the caller class through the delegate method.            [self .gOAuthDelegate errorOccuredWithShortDescription : @"Unable to delete refresh token info file."                                                  andErrorDetails :[error localizedDescription]];        }    }

    if (error == nil) {        // If no error occured during file removals then use the next delegate method        // to notify the caller class that the access has been revoked.        [self .gOAuthDelegate accessTokenWasRevoked];    }}
في البداية، علينا إعداد سلسلة عنوان URL بإبطال وإجراء الطلب
 ثم، يتم حذف أي ملف المتصلة بالرمز المميز للوصول، وأخيراً، يتم استدعاء الأسلوب مندوب accessTokenWasRevoked

16-استدعاء API

لدينا فئة مستعدة وتعمل بكامل طاقتها وإذا كنت تستخدم الآن سوف تكون قادرة على الحصول على الرمز مميز لوصول من جوجل
 ولكن، دون تنفيذ طريقة لاستدعاء واجهات برمجة التطبيقات، هو أن البيانات الوحيدة التي يمكنك الحصول على المعلومات الشخصية الخاصة بك
 ولذلك دعونا تنفيذ لدينا الأسلوب الأخير، والجمهور، واحد حقاً هاما وضروريا
انتقل إلى الملف GoogleOAuth.h وتعريف الأسلوب التالي مثلما تراه
-(void )callAPI:(NSString *)apiURL withHttpMethod:(HTTP_Method)httpMethod                    postParameterNames :( NSArray *)params postParameterValues:(NSArray *)values;
ملاحظة يجب أن يكون أي API التي تتطلب بيانات نشرها في جوجل في زوج قيمة المفتاح المعلمات لهذا
apiURL: سلسلة عنوان URL المطلوب لجعل استدعاء API
httpMethod: أسلوب HTTP المطلوب لاستدعاء API
 هذا هو حيث يتم استخدام نوع enum أنشأنا في البداية
params: كائن نصري يحتوي على مفاتيح معلمات النموذج زوج قيمة المفتاح
values: كائن نصري التي تحتوي على قيم معلمات النموذج زوج قيمة المفتاح
الآن قم بتشغيل الملف GoogleOAuth.m وتطبيق الأسلوب
-(void )callAPI:(NSString *)apiURL withHttpMethod:(HTTP_Method)httpMethod                            postParameterNames :( NSArray *)params                            postParameterValues :( NSArray *)values{
    // Check if the httpMethod value is valid.    // If not then notify for error.    if (httpMethod != httpMethod_GET && httpMethod != httpMethod_POST && httpMethod != httpMethod_DELETE && httpMethod != httpMethod_PUT) {        [self .gOAuthDelegate errorOccuredWithShortDescription : @"Invalid HTTP Method in API call" andErrorDetails:@""];    }    else{        // Create a string containing the API URL along with the access token.        NSString *urlString = [NSString stringWithFormat:@"%@?access_token=%@", apiURL, [_accessTokenInfoDictionary objectForKey:@"access_token"]];        // Create a mutable request.        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];   
        // Depending on the httpMethod value set the respective property of the request object.        switch (httpMethod) {            case httpMethod_GET:                [request setHTTPMethod:@"GET"];                break;            case httpMethod_POST:                [request setHTTPMethod:@"POST"];                break;            case httpMethod_DELETE:                [request setHTTPMethod:@"DELETE"];                break;            case httpMethod_PUT:                [request setHTTPMethod:@"PUT"];                break;           
            default:                break;        }   
   
        // In case of POST httpMethod value, set the parameters and any other necessary properties.  
        if (httpMethod == httpMethod_POST) {            // A string with the POST parameters should be built.            // Create an empty string.            NSString *postParams = @"";            // Iterrate through all parameters and append every POST parameter to the postParams string.            for (int i=0; i<[params count]; i++) {                postParams = [postParams stringByAppendingString:[NSString stringWithFormat:@"%@=%@",                                                                  [params objectAtIndex:i], [values objectAtIndex:i]]];           
                // If the current parameter is not the last one then add the "&" symbol to separate post parameters.                if (i < [params count] - 1) {                    postParams = [postParams stringByAppendingString:@"&"];                }            }       
            // Set any other necessary options.            [request setHTTPBody:[postParams dataUsingEncoding:NSUTF8StringEncoding]];            [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];        }   
   
        // Make the request.        [self makeRequest :request];    }}
لا يوجد شيء صعب في هذا الأسلوب الذي يحتاج إلى مناقشة
لدينا فئة مستعدة الآن لأن توضع موضع التنفيذ
 دعونا نذهب إلى الأمام للتطبيق التجريبي لدينا لمحاولة بها!
17-تكوين التطبيق التجريبي
الخطوة 1
في بداية تنفيذ هذا المشروع، بينما لا يزال العمل من "واجهة البناء"، ونحن إضافة طريقة عرض جدول لمشروعنا والآن حان الوقت لإعداده
 لذا، في البداية، انتقل إلى الملف ViewController.h واعتماد البروتوكولات المقبلة، كما ترون في الرمز المميز
@interface ViewController : UIViewController < UITableViewDelegate , UITableViewDataSource>@property (weak, nonatomic) IBOutlet UITableView *table;
- (IBAction )showProfile:(id)sender;- (IBAction )revokeAccess:(id)sender;
@end
وإلى جانب البروتوكولين أعلاه، نحتاج أيضا إلى اعتماد البروتوكول الخاص بنا فيما يتعلق بفئة لدينا
 لذا، في الجزء العلوي من الملف، استيراد الملف GoogleOAuth.h وأيضا اعتماد البروتوكول GoogleOAuthDelegate
#import <UIKit/UIKit.h>#import "GoogleOAuth.h"@interface ViewController : UIViewController < UITableViewDelegate , UITableViewDataSource , GoogleOAuthDelegate>@property (weak, nonatomic) IBOutlet UITableView *table;
- (IBAction )showProfile:(id)sender;- (IBAction )revokeAccess:(id)sender;
@end
الخطوة 2انتقل الآن إلى الملف ViewController.h
 في قسم خاص للواجهة، إضافة هذه صفيفين قابلة للتغيير، كما أننا بحاجة إلى تخزين معلومات المستخدم الشخصية التي سيتم عرضها في وقت لاحق داخل طريقة عرض الجدول
@interface ViewController ()@property (nonatomic, strong) NSMutableArray *arrProfileInfo;@property (nonatomic, strong) NSMutableArray *arrProfileInfoLabel;@end
في الواقع، arrProfileInfoLabel سوف تحتوي على البيانات التي تصف كل الحقول من المعلومات الشخصية التي يتم إرجاعها بواسطة جوجل وسوف توضع هذه البيانات في ديتيلتيكستلابيل لكل خلية ونحتاج أيضا كائن من الفئة التي تم إنشاؤها حديثا لدينا لذا، الحق فيما يلي تعريفات الصفيف، إضافة هذا
@interface ViewController ()@property (nonatomic, strong) NSMutableArray *arrProfileInfo;@property (nonatomic, strong) NSMutableArray *arrProfileInfoLabel;@property (nonatomic, strong) GoogleOAuth *googleOAuth;
@end
الخطوة 3
دعونا تهيئة الكائنات لدينا وتعيين مندوبينا
 الانتقال داخل الأسلوب viewDidLoad لتهيئة صفائف اثنين والكائنgoogleOAuth ، فضلا عن تعيين المندوبين، بما في ذلك التفويض الخاص بطريقة العرض جدول
- (void )viewDidLoad{    [super viewDidLoad];
    [_table setDelegate:self];    [_table setDataSource:self];
    _arrProfileInfo = [[NSMutableArray alloc] init];    _arrProfileInfoLabel = [[NSMutableArray alloc] init];
    _googleOAuth = [[GoogleOAuth alloc] initWithFrame:self.view.frame];    [_googleOAuth setGOAuthDelegate:self];
}
الخطوة 4
الآن يجب علينا إنشاء طرق عرض الجدول
 وسوف نضع في العمل الصفيفين أعلنا سابقا، على الرغم من أنه لا يزال هناك لا توجد بيانات بشأنها
 في مقطع التعليمات البرمجية التالي أقدم جميع الطرق تحتاج إلى إكمال
-(NSInteger)numberOfSectionsInTableView:( UITableView *)tableView{    return 1;}

-(NSInteger)tableView:( UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    return [_arrProfileInfo count];}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString * CellIdentifier = @"Cell";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
    if (cell == nil) {        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];   
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];        [cell setAccessoryType:UITableViewCellAccessoryNone];   
        [[cell textLabel] setFont:[UIFont fontWithName:@"Trebuchet MS" size:15.0]];        [[cell textLabel] setShadowOffset:CGSizeMake(1.0, 1.0)];        [[cell textLabel] setShadowColor:[UIColor whiteColor]];   
        [[cell detailTextLabel] setFont:[UIFont fontWithName:@"Trebuchet MS" size:13.0]];        [[cell detailTextLabel] setTextColor:[UIColor grayColor]];    }
    [[cell textLabel] setText:[_arrProfileInfo objectAtIndex:[indexPath row]]];    [[cell detailTextLabel] setText:[_arrProfileInfoLabel objectAtIndex:[indexPath row]]];
    return cell;}

-(CGFloat)tableView:( UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{    return 6 0 .0;}
الخطوة 5
حان الوقت لاستخدام ما لقد بنينا بتنفيذ هاتين الطريقتين إيباكشن أنشأنا في بداية المشروع

 بدءاً من showProfile:الأسلوب، وسوف ندعو authorizeUserWithClienID: andClientSecret: andParentView: andScopes: من فئة جوجليواوث، والذي سيتم إطلاق النار تدفق إذن
 ولتنفيذ ذلك
- (IBAction )showProfile:(id)sender {    [_googleOAuth authorizeUserWithClienID:@"YOUR_CLIENT_ID"                           andClientSecret : @"YOUR_CLIENT_SECRET"                           andParentView : self .view                           andScopes :[NSArray arrayWithObjects:@"https://www.googleapis.com/auth/userinfo.profile", nil]     ];}
تأكد من تعيين معرف العميل والعميل السري القيم الخاصة بك
دعونا تنفيذ revokeAccess: إيباكشن الأسلوب الآن
 سطر واحد فقط من التعليمات البرمجية
- (IBAction )revokeAccess:(id)sender {    [_googleOAuth revokeAccessToken];}
الخطوة 6
وأخيراً، هو الشيء الوحيد الذي تبقى لنا أساليب التفويض باستخدام الأسلوب إيباكشن الأول، نحن قوة تدفق الإذن تبدأ باستخدام الأساليب المفوض أننا سوف السيطرة على كل شيء وإننا سوف استرداد البيانات نريد لذا، دعونا تنفيذ واحداً تلو الآخرعلينا أن نبدأ من authorizationWasSuccessful: الأسلوب, يتم استدعاء هذا الأسلوب بعد أن يتم بنجاح الحصول على رمز وصول جديد أو رمز موجود لا يزال صالحاً لذا، نحن على استعداد المضي قدما مع استدعاء API.
 هذا واحد بسيط جداً كما أننا نطلب فقط للتشكيل الجانبي للمستخدم ولا توجد أي بيانات إلى آخر
-(void )authorizationWasSuccessful{    [_googleOAuth callAPI:@"https://www.googleapis.com/oauth2/v1/userinfo"            withHttpMethod :httpMethod_GET            postParameterNames :nil postParameterValues :nil];}
تواصل مع accessTokenWasRevoked: الأسلوب
 ونحن ببساطة سوف تظهر طريقة عرض تنبيه للمستخدم ونحن سوف فارغة في الصفيف ومحتويات الجدول
-(void )accessTokenWasRevoked{    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""                                                    message : @"Your access was revoked!"                                                   delegate : self cancelButtonTitle :nil otherButtonTitles : @"OK" , nil];    [alert show];
    [_arrProfileInfo removeAllObjects];    [_arrProfileInfoLabel removeAllObjects];
    [_table reloadData];
}
للتعامل مع الأساليب الخطأ أننا سوف ببساطة تسجيل رسائل إعلام بالخطأ وهذا كل شيء
 وفيما يلي كل منهما
-(void )errorOccuredWithShortDescription:(NSString *)errorShortDescription andErrorDetails:(NSString *)errorDetails{    NSLog(@"%@", errorShortDescription);    NSLog(@"%@", errorDetails);}

-(void )errorInResponseWithBody:(NSString *)errorMessage{    NSLog(@"%@", errorMessage);}
أخيرا، أهم أسلوب التفويض، الذي سنقوم برد جوجل مع معلومات ملف تعريف المستخدم ونحن سوف ملء لدينا صفائف
أننا التحقق إذا كان الحقل family_name موجود في رد JSON للتأكد معلومات المستخدم الشخصية الموجودة في الاستجابة
-(void )responseFromServiceWasReceived:(NSString *)responseJSONAsString andResponseJSONAsData:(NSData *)responseJSONAsData{    if ([responseJSONAsString rangeOfString:@"family_name"].location != NSNotFound) {        NSError *error;        NSMutableDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:responseJSONAsData                                                                          options :NSJSONReadingMutableContainers                                                                            error :&error];        if (error) {            NSLog(@"An error occured while converting JSON data to dictionary.");            return;        }        else{            if (_arrProfileInfoLabel != nil) {                _arrProfileInfoLabel = nil;                _arrProfileInfo = nil;                _arrProfileInfo = [[NSMutableArray alloc] init];            }       
            _arrProfileInfoLabel = [[ alloc] NSMutableArray initWithArray:[dictionary allKeys] copyItems:YES];            for (int i=0; i<[_arrProfileInfoLabel count]; i++) {                [_arrProfileInfo addObject:[dictionary objectForKey:[_arrProfileInfoLabel objectAtIndex:i]]];            }       
            [_table reloadData];        }    }}
نحن الآن مستعدون
 دعونا نجربة!
18-OAuth 2.0 في العمل
تشغيل المشروع والسماح لأي فون تظهر محاكاة في البداية، طريقة عرض الجدول فارغة، كما لا توجد بيانات انقر فوق الزر ملف التعريف الخاص بي وقم بإدخال بيانات الاعتماد الخاصة بك لتسجيل الدخول إلى حساب Google الخاص بك في الإطار التالي، السماح للتطبيق للوصول إلى المعلومات الشخصية الخاصة بك، والمضي قدما
 حالما تحصل على العودة إلى طريقة عرض جدول، سترى البيانات الشخصية التي تظهر على الشاشة.
إيقاف تشغيل التطبيق والبدء من جديد مرة أخرى انقر مرة أخرى فوق الزر التشكيل الجانبي ولاحظ أن التفويض لا سيطلب هذا الوقت
 بدلاً من ذلك، يتم استرداد المعلومات الشخصية الخاصة بك وسوف تظهر في طريقة عرض الجدول المقبل، في محاولة لإلغاء حق الوصول الخاص بك وثم الذهاب إلى التشكيل الجانبي الخاص بك مرة أخرى. هذه المرة، سوف يطلب منك للحصول على أذونات مرة أخرى.
الاستنتاج
في هذا البرنامج التعليمي، حاولت أن أغطي كل الجوانب اللازمة لتنفيذ خدمات جوجل مع OAuth 2.0
في درس المقبل، سوف نستخدم هذه الفئة في مثال العالم الحقيقي أثناء العمل مع جوجل التقويم. وحتى ذلك الحين، تلعب حولها والحصول على طعم كبيرة من فلسفة بروتوكول OAuth 2.0!

الكــاتــب

    • مشاركة

ليست هناك تعليقات:

جميع الحقوق محفوظة لــ الشبح للمعلوميات 2019 ©