التشغيل السريع لنظام التشغيل iOS

تشرح الخطوات الموضحة في هذه الصفحة كيفية إنشاء تطبيق iOS بسيط سريعًا يرسل طلبات إلى YouTube Data API. يعرض هذا النموذج كيفية استرداد بيانات قناة GoogleDevelopers على YouTube. وتشمل الشفرة أيضًا التعليقات التي توضح كيفية تعديل طلب البحث لاسترداد بيانات حول قناة المستخدم الحالية على YouTube.

المتطلبات الأساسية

لتنفيذ هذا التشغيل السريع، ستحتاج إلى:

  • Xcode 8.0 أو أحدث.
  • مدير تبعية CocoaPods.
  • الدخول إلى الإنترنت ومتصفح الويب.
  • حساب Google.

الخطوة 1: تفعيل YouTube Data API

  1. يمكنك استخدام هذا المعالج لإنشاء مشروع أو اختياره في Google Developers Console وتفعيل واجهة برمجة التطبيقات تلقائيًا. انقر على متابعة، ثم الانتقال إلى بيانات الاعتماد.

  2. في الصفحة إنشاء بيانات اعتماد، انقر على الزر إلغاء.

  3. في أعلى الصفحة، اختَر علامة التبويب شاشة موافقة OAuth. اختَر عنوان بريد إلكتروني، وأدخِل اسم المنتج إذا لم يسبق لك إعداده، ثم انقر على الزر حفظ.

  4. حدد علامة التبويب بيانات الاعتماد، وانقر على الزر إنشاء بيانات اعتماد، ثم حدد رقم تعريف عميل OAuth.

  5. حدد نوع التطبيق iOS، وأدخل الاسم "YouTube Data API Quickstart"، ومعرف الحزمة com.example.QuickstartApp، ثم انقر على الزر إنشاء.

الخطوة 2: إعداد مساحة العمل

  1. افتح Xcode وأنشئ مشروعًا جديدًا:
    1. انقر على File (ملف) > New (جديد) > Project (مشروع)، واختَر iOS > Application > Single View Application (نموذج العرض الفردي)، وانقر على Next (التالي).
    2. اضبط اسم المنتج على "QuickstartApp" ومعرّف المؤسسة على "com.example" وLanguage إلى Goal-C. أسفل معرّف المؤسسة، من المفترض أن يظهر لك معرّف حزمة تم إنشاؤه يتطابق مع معرّف حزمة iOS (com.example.QuickstartApp) الذي أدخلته في الخطوة 1-ب.
    3. انقر على التالي.
    4. اختَر دليل وجهة للمشروع وانقر على إنشاء.
  2. أغلق المشروع بالنقر على ملف > إغلاق المشروع.
  3. افتح نافذة Terminal وانتقِل إلى الدليل الذي يحتوي على الملف QuickstartApp.xcodeproj الذي أنشأته للتو.
  4. شغّل الأوامر التالية لإنشاء Podfile، ثم ثبّت المكتبة، وافتح مشروع XCode الذي يظهر لك:

    cat << EOF > Podfile &&
    platform :ios, '8.0'
    target 'QuickstartApp' do
        pod 'GoogleAPIClientForREST/YouTube', '~> 1.2.1'
        pod 'Google/SignIn', '~> 3.0.3'
    end
    EOF
    pod install &&
    open QuickstartApp.xcworkspace
    
  5. في XCode Project Navigator، حدد عقدة المشروع "QuickstartApp". ثم انقر على عنصر القائمة ملف > إضافة ملفات إلى "QuickstartApp".

  6. حدِّد موقع ملف GoogleService-Info.plist الذي تم تنزيله في وقت سابق واختَره. انقر على الزر خيارات.

  7. حدد الخيارات التالية في نافذة الخيارات، ثم انقر على الزر إضافة:

    1. حدد مربع الاختيار نسخ العناصر إذا لزم الأمر.
    2. حدّد جميع الاستهدافات المدرجة في القسم إضافة إلى الاستهدافات.

  8. مع استمرار تحديد عقدة المشروع، حدد "QuickstartApp" في قسم TARGETS كما هو موضح في الصورتين أدناه:

    1. انقر على المنطقة المعروضة في لقطة الشاشة هذه:

    2. بعد ذلك، اختَر الهدف المناسب:

  9. حدد علامة التبويب معلومات، ووسع القسم أنواع عناوين URL.

  10. انقر على الزر +، ثم أضف مخطط عنوان URL للرقم التعريفي للعميل العكسي. للعثور على هذه القيمة، افتح ملف إعداد GoogleService-Info.plist الذي حدّدته في الخطوة 2.f ابحث عن مفتاح REVERSED_CLIENT_ID. انسخ قيمة هذا المفتاح، والصقها في مربع مخططات عناوين URL في صفحة التهيئة. اترك الحقول الأخرى فارغة.

  11. إعادة إنشاء المشروع:

    1. انقر على Product > Clean Build Folder (المنتج > مجلد عمليات الإزالة السليمة) (أثناء الضغط مع الاستمرار على مفتاح option).
    2. انقر على المنتج > الإصدار.

الخطوة 3: إعداد النموذج

يمكنك استخدام الرمز المتوفّر بدلاً من محتوى الملفات التالية:

AppDelegate.h
#import <UIKit/UIKit.h>
@import GoogleSignIn;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


@end
AppDelegate.m
#import "AppDelegate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Initialize Google sign-in.
    [GIDSignIn sharedInstance].clientID = @"<YOUR_CLIENT_ID>";

    return YES;
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:sourceApplication
                                      annotation:annotation];
}


@end
ViewController.h
#import <UIKit/UIKit.h>
@import GoogleSignIn;
#import <GTLRYouTube.h>

@interface ViewController : UIViewController <GIDSignInDelegate, GIDSignInUIDelegate>

@property (nonatomic, strong) IBOutlet GIDSignInButton *signInButton;
@property (nonatomic, strong) UITextView *output;
@property (nonatomic, strong) GTLRYouTubeService *service;


@end
ViewController.m
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Configure Google Sign-in.
    GIDSignIn* signIn = [GIDSignIn sharedInstance];
    signIn.delegate = self;
    signIn.uiDelegate = self;
    signIn.scopes = [NSArray arrayWithObjects:kGTLRAuthScopeYouTubeReadonly, nil];
    [signIn signInSilently];

    // Add the sign-in button.
    self.signInButton = [[GIDSignInButton alloc] init];
    [self.view addSubview:self.signInButton];

    // Create a UITextView to display output.
    self.output = [[UITextView alloc] initWithFrame:self.view.bounds];
    self.output.editable = false;
    self.output.contentInset = UIEdgeInsetsMake(20.0, 0.0, 20.0, 0.0);
    self.output.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.output.hidden = true;
    [self.view addSubview:self.output];

    // Initialize the service object.
    self.service = [[GTLRYouTubeService alloc] init];
}

- (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
    if (error != nil) {
        [self showAlert:@"Authentication Error" message:error.localizedDescription];
        self.service.authorizer = nil;
    } else {
        self.signInButton.hidden = true;
        self.output.hidden = false;
        self.service.authorizer = user.authentication.fetcherAuthorizer;
        [self fetchChannelResource];
    }
}


// Construct a query and retrieve the channel resource for the GoogleDevelopers
// YouTube channel. Display the channel title, description, and view count.
- (void)fetchChannelResource {
    GTLRYouTubeQuery_ChannelsList *query =
    [GTLRYouTubeQuery_ChannelsList queryWithPart:@"snippet,statistics"];
  query.identifier = @"UC_x5XG1OV2P6uZZ5FSM9Ttw";
  // To retrieve data for the current user's channel, comment out the previous
  // line (query.identifier ...) and uncomment the next line (query.mine ...).
  // query.mine = true;

  [self.service executeQuery:query
                    delegate:self
           didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)];
}

// Process the response and display output
- (void)displayResultWithTicket:(GTLRServiceTicket *)ticket
             finishedWithObject:(GTLRYouTube_ChannelListResponse *)channels
                          error:(NSError *)error {
  if (error == nil) {
    NSMutableString *output = [[NSMutableString alloc] init];
    if (channels.items.count > 0) {
      [output appendString:@"Channel information:\n"];
      for (GTLRYouTube_Channel *channel in channels) {
        NSString *title = channel.snippet.title;
        NSString *description = channel.snippet.description;
        NSNumber *viewCount = channel.statistics.viewCount;
        [output appendFormat:@"Title: %@\nDescription: %@\nViewCount: %@\n", title, description, viewCount];
      }
    } else {
      [output appendString:@"Channel not found."];
    }
    self.output.text = output;
  } else {
    [self showAlert:@"Error" message:error.localizedDescription];
  }
}


// Helper for showing an alert
- (void)showAlert:(NSString *)title message:(NSString *)message {
    UIAlertController *alert =
    [UIAlertController alertControllerWithTitle:title
                                        message:message
                                 preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *ok =
    [UIAlertAction actionWithTitle:@"OK"
                             style:UIAlertActionStyleDefault
                           handler:^(UIAlertAction * action)
     {
         [alert dismissViewControllerAnimated:YES completion:nil];
     }];
    [alert addAction:ok];
    [self presentViewController:alert animated:YES completion:nil];
}


@end

الخطوة الرابعة: تنفيذ النموذج

يمكنك التبديل إلى مخطط QuickstartApp من خلال النقر على المنتج > المخطط > QuickstartApp وتشغيل النموذج (Cmd+R) باستخدام محاكي الجهاز أو جهاز تمت تهيئته. عند تشغيل النموذج لأول مرة، سيطلب منك تسجيل الدخول إلى حسابك في Google والسماح بالدخول.

ملاحظات

  • يتم تخزين معلومات التفويض في Keychain، لذا لن تطلب عمليات التنفيذ اللاحقة الحصول على تفويض.

قراءات إضافية