আপনার iOS অ্যাপে কাস্ট সংহত করুন

এই ডেভেলপার গাইডে বর্ণনা করা হয়েছে, কীভাবে iOS Sender SDK ব্যবহার করে আপনার iOS সেন্ডার অ্যাপে Google Cast সাপোর্ট যোগ করবেন।

মোবাইল ডিভাইস বা ল্যাপটপটি হলো প্রেরক , যা প্লেব্যাক নিয়ন্ত্রণ করে, এবং গুগল কাস্ট ডিভাইসটি হলো গ্রাহক , যা টিভিতে বিষয়বস্তু প্রদর্শন করে।

সেন্ডার ফ্রেমওয়ার্ক বলতে রানটাইমে সেন্ডারে উপস্থিত Cast ক্লাস লাইব্রেরি বাইনারি এবং সংশ্লিষ্ট রিসোর্সসমূহকে বোঝায়। সেন্ডার অ্যাপ বা Cast অ্যাপ বলতে সেন্ডারে চলমান একটি অ্যাপকে বোঝায়। ওয়েব রিসিভার অ্যাপ বলতে ওয়েব রিসিভারে চলমান HTML অ্যাপ্লিকেশনটিকে বোঝায়।

প্রেরক ফ্রেমওয়ার্কটি প্রেরক অ্যাপকে ইভেন্ট সম্পর্কে অবহিত করতে এবং কাস্ট অ্যাপের জীবনচক্রের বিভিন্ন অবস্থার মধ্যে রূপান্তর ঘটাতে একটি অ্যাসিঙ্ক্রোনাস কলব্যাক ডিজাইন ব্যবহার করে।

অ্যাপ প্রবাহ

নিম্নলিখিত ধাপগুলো একটি প্রেরক iOS অ্যাপের সাধারণ উচ্চ-স্তরের কার্যপ্রবাহ বর্ণনা করে:

  • ডিভাইস স্ক্যান করা শুরু করার জন্য, Cast ফ্রেমওয়ার্কটি GCKCastOptions এ প্রদত্ত প্রোপার্টিগুলোর উপর ভিত্তি করে GCKDiscoveryManager চালু করে।
  • যখন ব্যবহারকারী কাস্ট বোতামে ক্লিক করেন, তখন ফ্রেমওয়ার্কটি আবিষ্কৃত কাস্ট ডিভাইসগুলির তালিকা সহ কাস্ট ডায়ালগটি প্রদর্শন করে।
  • যখন ব্যবহারকারী একটি কাস্ট ডিভাইস নির্বাচন করেন, তখন ফ্রেমওয়ার্কটি সেই কাস্ট ডিভাইসে ওয়েব রিসিভার অ্যাপটি চালু করার চেষ্টা করে।
  • ওয়েব রিসিভার অ্যাপটি চালু হয়েছে কিনা, তা নিশ্চিত করার জন্য ফ্রেমওয়ার্কটি প্রেরক অ্যাপে কলব্যাক আহ্বান করে।
  • এই ফ্রেমওয়ার্কটি প্রেরক এবং ওয়েব রিসিভার অ্যাপগুলোর মধ্যে একটি যোগাযোগ চ্যানেল তৈরি করে।
  • ফ্রেমওয়ার্কটি ওয়েব রিসিভারে মিডিয়া প্লেব্যাক লোড ও নিয়ন্ত্রণ করতে কমিউনিকেশন চ্যানেলটি ব্যবহার করে।
  • ফ্রেমওয়ার্কটি প্রেরক এবং ওয়েব রিসিভারের মধ্যে মিডিয়া প্লেব্যাকের অবস্থা সিঙ্ক্রোনাইজ করে: যখন ব্যবহারকারী প্রেরক UI-তে কোনো কাজ করেন, ফ্রেমওয়ার্কটি সেই মিডিয়া নিয়ন্ত্রণের অনুরোধগুলো ওয়েব রিসিভারের কাছে পাঠিয়ে দেয়, এবং যখন ওয়েব রিসিভার মিডিয়ার স্ট্যাটাস আপডেট পাঠায়, তখন ফ্রেমওয়ার্কটি প্রেরক UI-এর অবস্থা আপডেট করে।
  • যখন ব্যবহারকারী কাস্ট ডিভাইস থেকে সংযোগ বিচ্ছিন্ন করার জন্য কাস্ট বোতামে ক্লিক করেন, তখন ফ্রেমওয়ার্কটি প্রেরক অ্যাপটিকে ওয়েব রিসিভার থেকে সংযোগ বিচ্ছিন্ন করে দেবে।

আপনার প্রেরকের সমস্যা সমাধান করতে, আপনাকে লগিং চালু করতে হবে।

Google Cast iOS ফ্রেমওয়ার্কের সমস্ত ক্লাস, মেথড এবং ইভেন্টের একটি বিশদ তালিকার জন্য, Google Cast iOS API Reference দেখুন। নিম্নলিখিত বিভাগগুলিতে আপনার iOS অ্যাপে Cast সংহত করার ধাপগুলি আলোচনা করা হয়েছে।

প্রধান থ্রেড থেকে মেথড কল করুন

কাস্ট কনটেক্সট শুরু করুন

Cast ফ্রেমওয়ার্কের একটি গ্লোবাল সিঙ্গেলটন অবজেক্ট রয়েছে, যার নাম GCKCastContext , যা ফ্রেমওয়ার্কের সমস্ত কার্যকলাপ সমন্বয় করে। এই অবজেক্টটি অবশ্যই অ্যাপ্লিকেশনের লাইফসাইকেলের শুরুতে ইনিশিয়ালাইজ করতে হবে, সাধারণত অ্যাপ ডেলিগেটের -[application:didFinishLaunchingWithOptions:] মেথডে, যাতে প্রেরক অ্যাপ পুনরায় চালু হলে স্বয়ংক্রিয় সেশন পুনঃপ্রবর্তন সঠিকভাবে ট্রিগার হতে পারে।

GCKCastContext ইনিশিয়ালাইজ করার সময় একটি GCKCastOptions অবজেক্ট অবশ্যই সরবরাহ করতে হবে। এই ক্লাসে এমন কিছু অপশন থাকে যা ফ্রেমওয়ার্কের আচরণকে প্রভাবিত করে। এগুলোর মধ্যে সবচেয়ে গুরুত্বপূর্ণ হলো ওয়েব রিসিভার অ্যাপ্লিকেশন আইডি, যা ডিসকভারি রেজাল্ট ফিল্টার করতে এবং একটি কাস্ট সেশন শুরু হলে ওয়েব রিসিভার অ্যাপটি চালু করতে ব্যবহৃত হয়।

ফ্রেমওয়ার্ক থেকে লগিং মেসেজ গ্রহণ করার জন্য একটি লগিং ডেলিগেট সেট আপ করতে -[application:didFinishLaunchingWithOptions:] মেথডটিও একটি ভালো জায়গা। এগুলো ডিবাগিং এবং ট্রাবলশুটিংয়ের জন্য সহায়ক হতে পারে।

সুইফট
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GCKLoggerDelegate {
  let kReceiverAppID = kGCKDefaultMediaReceiverApplicationID
  let kDebugLoggingEnabled = true

  var window: UIWindow?

  func applicationDidFinishLaunching(_ application: UIApplication) {
    let criteria = GCKDiscoveryCriteria(applicationID: kReceiverAppID)
    let options = GCKCastOptions(discoveryCriteria: criteria)
    GCKCastContext.setSharedInstanceWith(options)

    // Enable logger.
    GCKLogger.sharedInstance().delegate = self

    ...
  }

  // MARK: - GCKLoggerDelegate

  func logMessage(_ message: String,
                  at level: GCKLoggerLevel,
                  fromFunction function: String,
                  location: String) {
    if (kDebugLoggingEnabled) {
      print(function + " - " + message)
    }
  }
}
উদ্দেশ্য-সি

AppDelegate.h

@interface AppDelegate () <GCKLoggerDelegate>
@end

AppDelegate.m

@implementation AppDelegate

static NSString *const kReceiverAppID = @"AABBCCDD";
static const BOOL kDebugLoggingEnabled = YES;

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  GCKDiscoveryCriteria *criteria = [[GCKDiscoveryCriteria alloc]
                                    initWithApplicationID:kReceiverAppID];
  GCKCastOptions *options = [[GCKCastOptions alloc] initWithDiscoveryCriteria:criteria];
  [GCKCastContext setSharedInstanceWithOptions:options];

  // Enable logger.
  [GCKLogger sharedInstance].delegate = self;

  ...

  return YES;
}

...

#pragma mark - GCKLoggerDelegate

- (void)logMessage:(NSString *)message
           atLevel:(GCKLoggerLevel)level
      fromFunction:(NSString *)function
          location:(NSString *)location {
  if (kDebugLoggingEnabled) {
    NSLog(@"%@ - %@, %@", function, message, location);
  }
}

@end

কাস্ট ইউএক্স উইজেটগুলি

Cast iOS SDK এই উইজেটগুলি প্রদান করে যা Cast ডিজাইন চেকলিস্ট মেনে চলে:

  • প্রারম্ভিক ওভারলে : GCKCastContext ক্লাসে presentCastInstructionsViewControllerOnceWithCastButton নামে একটি মেথড আছে, যা কোনো ওয়েব রিসিভার প্রথমবার উপলব্ধ হলে কাস্ট বাটনটিকে বিশেষভাবে তুলে ধরতে ব্যবহার করা যেতে পারে। প্রেরক অ্যাপটি এর টেক্সট, টাইটেল টেক্সটের অবস্থান এবং ডিসমিস বাটনটি নিজের মতো করে সাজিয়ে নিতে পারে।

  • কাস্ট বাটন : কাস্ট আইওএস সেন্ডার এসডিকে ৪.৬.০ থেকে শুরু করে, প্রেরক ডিভাইসটি ওয়াই-ফাই এর সাথে সংযুক্ত থাকলে কাস্ট বাটনটি সর্বদা দৃশ্যমান থাকে। অ্যাপটি প্রথমবার চালু করার পর ব্যবহারকারী যখন প্রথমবার কাস্ট বাটনে ট্যাপ করেন, তখন একটি অনুমতি ডায়ালগ বক্স প্রদর্শিত হয়, যাতে ব্যবহারকারী নেটওয়ার্কের ডিভাইসগুলোতে অ্যাপটিকে লোকাল নেটওয়ার্ক অ্যাক্সেসের অনুমতি দিতে পারেন। পরবর্তীতে, ব্যবহারকারী যখন কাস্ট বাটনে ট্যাপ করেন, তখন একটি কাস্ট ডায়ালগ বক্স প্রদর্শিত হয়, যেখানে খুঁজে পাওয়া ডিভাইসগুলোর তালিকা থাকে। ডিভাইসটি সংযুক্ত থাকা অবস্থায় ব্যবহারকারী যখন কাস্ট বাটনে ট্যাপ করেন, তখন এটি বর্তমান মিডিয়ার মেটাডেটা (যেমন শিরোনাম, রেকর্ডিং স্টুডিওর নাম এবং একটি থাম্বনেইল ছবি) প্রদর্শন করে অথবা ব্যবহারকারীকে কাস্ট ডিভাইস থেকে সংযোগ বিচ্ছিন্ন করার সুযোগ দেয়। যখন কোনো ডিভাইস উপলব্ধ না থাকা অবস্থায় ব্যবহারকারী কাস্ট বাটনে ট্যাপ করেন, তখন একটি স্ক্রিন প্রদর্শিত হবে, যেখানে ডিভাইস খুঁজে না পাওয়ার কারণ এবং এর সমাধান সম্পর্কে তথ্য দেওয়া থাকবে।

  • মিনি কন্ট্রোলার : যখন ব্যবহারকারী কন্টেন্ট কাস্ট করার সময় বর্তমান কন্টেন্ট পেজ থেকে অন্য কোনো স্ক্রিনে চলে যান বা কন্ট্রোলারটি এক্সপ্যান্ড করে সেন্ডার অ্যাপের অন্য কোনো স্ক্রিনে যান, তখন স্ক্রিনের নিচে মিনি কন্ট্রোলারটি প্রদর্শিত হয়। এর মাধ্যমে ব্যবহারকারী বর্তমানে কাস্ট হওয়া মিডিয়ার মেটাডেটা দেখতে এবং প্লেব্যাক নিয়ন্ত্রণ করতে পারেন।

  • বর্ধিত কন্ট্রোলার : যখন ব্যবহারকারী কন্টেন্ট কাস্ট করেন, তখন তিনি যদি মিডিয়া নোটিফিকেশন বা মিনি কন্ট্রোলারে ক্লিক করেন, তাহলে বর্ধিত কন্ট্রোলারটি চালু হয়, যা বর্তমানে প্লে হওয়া মিডিয়ার মেটাডেটা প্রদর্শন করে এবং মিডিয়া প্লেব্যাক নিয়ন্ত্রণ করার জন্য কয়েকটি বাটন প্রদান করে।

একটি কাস্ট বোতাম যোগ করুন

ফ্রেমওয়ার্কটি UIButton সাবক্লাস হিসেবে একটি Cast বাটন কম্পোনেন্ট প্রদান করে। এটিকে একটি UIBarButtonItem মধ্যে র‍্যাপ করে অ্যাপের টাইটেল বারে যোগ করা যায়। একটি সাধারণ UIViewController সাবক্লাস নিম্নোক্তভাবে একটি Cast বাটন ইনস্টল করতে পারে:

সুইফট
let castButton = GCKUICastButton(frame: CGRect(x: 0, y: 0, width: 24, height: 24))
castButton.tintColor = UIColor.gray
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: castButton)
উদ্দেশ্য-সি
GCKUICastButton *castButton = [[GCKUICastButton alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
castButton.tintColor = [UIColor grayColor];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:castButton];

ডিফল্টরূপে, বাটনটিতে ট্যাপ করলে ফ্রেমওয়ার্ক কর্তৃক প্রদত্ত কাস্ট ডায়ালগটি খুলবে।

GCKUICastButton সরাসরি স্টোরিবোর্ডেও যোগ করা যেতে পারে।

ডিভাইস আবিষ্কার কনফিগার করুন

এই ফ্রেমওয়ার্কে ডিভাইস শনাক্তকরণ স্বয়ংক্রিয়ভাবে সম্পন্ন হয়। আপনি যদি কোনো কাস্টম UI প্রয়োগ না করেন, তবে এই শনাক্তকরণ প্রক্রিয়াটি স্পষ্টভাবে শুরু বা বন্ধ করার কোনো প্রয়োজন নেই।

ফ্রেমওয়ার্কে ডিভাইস আবিষ্কার GCKDiscoveryManager ক্লাস দ্বারা পরিচালিত হয়, যা GCKCastContext এর একটি প্রপার্টি। ফ্রেমওয়ার্কটি ডিভাইস নির্বাচন ও নিয়ন্ত্রণের জন্য একটি ডিফল্ট কাস্ট ডায়ালগ কম্পোনেন্ট প্রদান করে। ডিভাইসের তালিকাটি ডিভাইসের সহজবোধ্য নাম অনুসারে আভিধানিকভাবে সাজানো থাকে।

সেশন ম্যানেজমেন্ট কীভাবে কাজ করে

কাস্ট এসডিকে (Cast SDK) কাস্ট সেশনের ধারণাটি প্রবর্তন করেছে, যা স্থাপন করার জন্য একটি ডিভাইসের সাথে সংযোগ স্থাপন, একটি ওয়েব রিসিভার অ্যাপ চালু করা (বা তাতে যোগদান করা), সেই অ্যাপের সাথে সংযোগ স্থাপন এবং একটি মিডিয়া কন্ট্রোল চ্যানেল ইনিশিয়ালাইজ করার ধাপগুলো একত্রিত করা হয়। কাস্ট সেশন এবং ওয়েব রিসিভারের জীবনচক্র সম্পর্কে আরও তথ্যের জন্য ওয়েব রিসিভার অ্যাপ্লিকেশন জীবনচক্র নির্দেশিকাটি দেখুন।

সেশনগুলি GCKSessionManager ক্লাস দ্বারা পরিচালিত হয়, যা GCKCastContext এর একটি প্রপার্টি। স্বতন্ত্র সেশনগুলি GCKSession ক্লাসের সাবক্লাস দ্বারা প্রতিনিধিত্ব করা হয়: উদাহরণস্বরূপ, GCKCastSession কাস্ট ডিভাইসগুলির সাথে সেশনগুলিকে প্রতিনিধিত্ব করে। আপনি GCKSessionManager এর currentCastSession প্রপার্টি হিসাবে বর্তমানে সক্রিয় কাস্ট সেশনটি (যদি থাকে) অ্যাক্সেস করতে পারেন।

GCKSessionManagerListener ইন্টারফেসটি সেশন ইভেন্ট, যেমন সেশন তৈরি, স্থগিতকরণ, পুনরায় চালু করা এবং সমাপ্তি নিরীক্ষণ করতে ব্যবহার করা যেতে পারে। যখন প্রেরক অ্যাপটি ব্যাকগ্রাউন্ডে যায় তখন ফ্রেমওয়ার্কটি স্বয়ংক্রিয়ভাবে সেশন স্থগিত করে এবং অ্যাপটি ফোরগ্রাউন্ডে ফিরে এলে (অথবা সেশন সক্রিয় থাকা অবস্থায় কোনো অস্বাভাবিক/হঠাৎ অ্যাপ বন্ধ হয়ে যাওয়ার পর পুনরায় চালু হলে) সেগুলোকে পুনরায় চালু করার চেষ্টা করে।

কাস্ট ডায়ালগ ব্যবহার করা হলে, ব্যবহারকারীর অঙ্গভঙ্গির প্রতিক্রিয়ায় সেশনগুলি স্বয়ংক্রিয়ভাবে তৈরি এবং বন্ধ হয়ে যায়। অন্যথায়, অ্যাপটি GCKSessionManager এর মেথডগুলির মাধ্যমে সুস্পষ্টভাবে সেশন শুরু এবং শেষ করতে পারে।

সেশন লাইফসাইকেল ইভেন্টের প্রতিক্রিয়ায় অ্যাপটির যদি বিশেষ কোনো প্রসেসিং করার প্রয়োজন হয়, তবে এটি GCKSessionManager এর সাথে এক বা একাধিক GCKSessionManagerListener ইনস্ট্যান্স রেজিস্টার করতে পারে। GCKSessionManagerListener হলো একটি প্রোটোকল যা সেশন শুরু, সেশন শেষ ইত্যাদির মতো ইভেন্টগুলোর জন্য কলব্যাক নির্ধারণ করে।

প্রবাহ স্থানান্তর

সেশন স্টেট সংরক্ষণ করাই হলো স্ট্রিম ট্রান্সফারের ভিত্তি, যার মাধ্যমে ব্যবহারকারীরা ভয়েস কমান্ড, গুগল হোম অ্যাপ বা স্মার্ট ডিসপ্লে ব্যবহার করে ডিভাইসগুলোর মধ্যে বিদ্যমান অডিও এবং ভিডিও স্ট্রিম স্থানান্তর করতে পারেন। একটি ডিভাইসে (সোর্স) মিডিয়া প্লে হওয়া বন্ধ হয়ে যায় এবং অন্যটিতে (ডেস্টিনেশন) তা আবার চলতে থাকে। সর্বশেষ ফার্মওয়্যারযুক্ত যেকোনো কাস্ট ডিভাইস স্ট্রিম ট্রান্সফারের ক্ষেত্রে সোর্স বা ডেস্টিনেশন হিসেবে কাজ করতে পারে।

স্ট্রিম ট্রান্সফারের সময় নতুন গন্তব্য ডিভাইস পেতে, [sessionManager:didResumeCastSession:] কলব্যাকে GCKCastSession#device প্রপার্টিটি ব্যবহার করুন।

আরও তথ্যের জন্য ওয়েব রিসিভারে স্ট্রিম ট্রান্সফার দেখুন।

স্বয়ংক্রিয় পুনঃসংযোগ

কাস্ট ফ্রেমওয়ার্কটি অনেক সূক্ষ্ম ব্যতিক্রমী ক্ষেত্রে স্বয়ংক্রিয়ভাবে পুনঃসংযোগ পরিচালনা করার জন্য পুনঃসংযোগ লজিক যোগ করে, যেমন:

  • সাময়িক ওয়াইফাই সংযোগ বিচ্ছিন্ন হলে তা থেকে পুনরুদ্ধার করুন।
  • ডিভাইস স্লিপ থেকে পুনরুদ্ধার করুন
  • অ্যাপটিকে ব্যাকগ্রাউন্ড থেকে পুনরুদ্ধার করুন
  • অ্যাপটি ক্র্যাশ করলে পুনরুদ্ধার করুন

গণমাধ্যম নিয়ন্ত্রণ কীভাবে কাজ করে

যদি মিডিয়া নেমস্পেস সমর্থন করে এমন কোনো ওয়েব রিসিভার অ্যাপের সাথে একটি কাস্ট সেশন স্থাপিত হয়, তাহলে ফ্রেমওয়ার্ক দ্বারা স্বয়ংক্রিয়ভাবে GCKRemoteMediaClient এর একটি ইনস্ট্যান্স তৈরি হবে; এটিকে GCKCastSession ইনস্ট্যান্সের remoteMediaClient প্রপার্টি হিসেবে অ্যাক্সেস করা যাবে।

GCKRemoteMediaClient এর যে সকল মেথড ওয়েব রিসিভারে অনুরোধ পাঠায়, সেগুলো একটি GCKRequest অবজেক্ট রিটার্ন করে, যা সেই অনুরোধটি ট্র্যাক করতে ব্যবহার করা যেতে পারে। অপারেশনটির চূড়ান্ত ফলাফল সম্পর্কে নোটিফিকেশন পাওয়ার জন্য এই অবজেক্টটিতে একটি GCKRequestDelegate অ্যাসাইন করা যেতে পারে।

আশা করা যায় যে, অ্যাপের একাধিক অংশ GCKRemoteMediaClient এর ইনস্ট্যান্সটি ব্যবহার করতে পারে, এবং প্রকৃতপক্ষে ফ্রেমওয়ার্কের কিছু অভ্যন্তরীণ উপাদান, যেমন কাস্ট ডায়ালগ এবং মিনি মিডিয়া কন্ট্রোল, এই ইনস্ট্যান্সটি শেয়ার করে থাকে। এই উদ্দেশ্যে, GCKRemoteMediaClient একাধিক GCKRemoteMediaClientListener নিবন্ধনের সুবিধা দেয়।

মিডিয়া মেটাডেটা সেট করুন

GCKMediaMetadata ক্লাসটি এমন একটি মিডিয়া আইটেম সম্পর্কিত তথ্য উপস্থাপন করে যা আপনি কাস্ট করতে চান। নিম্নলিখিত উদাহরণটি একটি মুভির নতুন GCKMediaMetadata ইনস্ট্যান্স তৈরি করে এবং এর টাইটেল, সাবটাইটেল, রেকর্ডিং স্টুডিওর নাম ও দুটি ছবি সেট করে।

সুইফট
let metadata = GCKMediaMetadata()
metadata.setString("Big Buck Bunny (2008)", forKey: kGCKMetadataKeyTitle)
metadata.setString("Big Buck Bunny tells the story of a giant rabbit with a heart bigger than " +
  "himself. When one sunny day three rodents rudely harass him, something " +
  "snaps... and the rabbit ain't no bunny anymore! In the typical cartoon " +
  "tradition he prepares the nasty rodents a comical revenge.",
                   forKey: kGCKMetadataKeySubtitle)
metadata.addImage(GCKImage(url: URL(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg")!,
                           width: 480,
                           height: 360))
উদ্দেশ্য-সি
GCKMediaMetadata *metadata = [[GCKMediaMetadata alloc]
                                initWithMetadataType:GCKMediaMetadataTypeMovie];
[metadata setString:@"Big Buck Bunny (2008)" forKey:kGCKMetadataKeyTitle];
[metadata setString:@"Big Buck Bunny tells the story of a giant rabbit with a heart bigger than "
 "himself. When one sunny day three rodents rudely harass him, something "
 "snaps... and the rabbit ain't no bunny anymore! In the typical cartoon "
 "tradition he prepares the nasty rodents a comical revenge."
             forKey:kGCKMetadataKeySubtitle];
[metadata addImage:[[GCKImage alloc]
                    initWithURL:[[NSURL alloc] initWithString:@"https://commondatastorage.googleapis.com/"
                                 "gtv-videos-bucket/sample/images/BigBuckBunny.jpg"]
                    width:480
                    height:360]];

মিডিয়া মেটাডেটার সাথে ছবির ব্যবহার সম্পর্কে জানতে ছবি নির্বাচন এবং ক্যাশিং বিভাগটি দেখুন।

মিডিয়া লোড করুন

একটি মিডিয়া আইটেম লোড করতে, মিডিয়াটির মেটাডেটা ব্যবহার করে একটি GCKMediaInformation ইনস্ট্যান্স তৈরি করুন। তারপর বর্তমান GCKCastSession নিন এবং এর GCKRemoteMediaClient ব্যবহার করে রিসিভার অ্যাপে মিডিয়াটি লোড করুন। এরপর আপনি রিসিভারে চলমান একটি মিডিয়া প্লেয়ার অ্যাপ নিয়ন্ত্রণ করার জন্য, যেমন প্লে, পজ এবং স্টপ করার জন্য, GCKRemoteMediaClient ব্যবহার করতে পারবেন।

সুইফট
let url = URL.init(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
guard let mediaURL = url else {
  print("invalid mediaURL")
  return
}

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentURL: mediaURL)
mediaInfoBuilder.streamType = GCKMediaStreamType.none;
mediaInfoBuilder.contentType = "video/mp4"
mediaInfoBuilder.metadata = metadata;
mediaInformation = mediaInfoBuilder.build()

guard let mediaInfo = mediaInformation else {
  print("invalid mediaInformation")
  return
}

if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia(mediaInfo) {
  request.delegate = self
}
উদ্দেশ্য-সি
GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentURL:
   [NSURL URLWithString:@"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"]];
mediaInfoBuilder.streamType = GCKMediaStreamTypeNone;
mediaInfoBuilder.contentType = @"video/mp4";
mediaInfoBuilder.metadata = metadata;
self.mediaInformation = [mediaInfoBuilder build];

GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
  request.delegate = self;
}

মিডিয়া ট্র্যাক ব্যবহার সংক্রান্ত অংশটিও দেখুন।

4K ভিডিও ফরম্যাট

আপনার মিডিয়া কোন ভিডিও ফরম্যাটের, তা নির্ধারণ করতে GCKMediaStatus এর videoInfo প্রপার্টি ব্যবহার করে GCKVideoInfo এর বর্তমান ইনস্ট্যান্সটি নিন। এই ইনস্ট্যান্সটিতে HDR টিভি ফরম্যাটের ধরন এবং পিক্সেলে এর উচ্চতা ও প্রস্থ উল্লেখ থাকে। 4K ফরম্যাটের বিভিন্ন সংস্করণ hdrType প্রপার্টিতে GCKVideoInfoHDRType নামক enum ভ্যালু দ্বারা নির্দেশিত হয়।

মিনি কন্ট্রোলার যোগ করুন

কাস্ট ডিজাইন চেকলিস্ট অনুসারে, একটি প্রেরক অ্যাপে মিনি কন্ট্রোলার নামে একটি স্থায়ী কন্ট্রোল থাকা উচিত, যা ব্যবহারকারী বর্তমান কন্টেন্ট পেজ থেকে অন্য পেজে গেলে প্রদর্শিত হবে। মিনি কন্ট্রোলারটি তাৎক্ষণিক অ্যাক্সেস এবং বর্তমান কাস্ট সেশনের জন্য একটি দৃশ্যমান রিমাইন্ডার প্রদান করে।

Cast ফ্রেমওয়ার্কটি GCKUIMiniMediaControlsViewController নামে একটি কন্ট্রোল বার প্রদান করে, যা সেইসব সিন-এ যোগ করা যেতে পারে যেখানে আপনি মিনি কন্ট্রোলারটি দেখাতে চান।

যখন আপনার প্রেরক অ্যাপ কোনো ভিডিও বা অডিও লাইভ স্ট্রিম চালায়, তখন এসডিকে স্বয়ংক্রিয়ভাবে মিনি কন্ট্রোলারের প্লে/পজ বাটনের পরিবর্তে একটি প্লে/স্টপ বাটন প্রদর্শন করে।

আপনার প্রেরক অ্যাপ কীভাবে কাস্ট উইজেটগুলির চেহারা কনফিগার করতে পারে, তা জানতে "iOS প্রেরক UI কাস্টমাইজ করুন" দেখুন।

একটি প্রেরক অ্যাপে মিনি কন্ট্রোলার যোগ করার দুটি উপায় রয়েছে:

  • আপনার বিদ্যমান ভিউ কন্ট্রোলারকে নিজস্ব ভিউ কন্ট্রোলার দিয়ে র‍্যাপ করে কাস্ট ফ্রেমওয়ার্ককে মিনি কন্ট্রোলারের লেআউট পরিচালনা করতে দিন।
  • স্টোরিবোর্ডে একটি সাবভিউ যোগ করে আপনার বিদ্যমান ভিউ কন্ট্রোলারে মিনি কন্ট্রোলার উইজেটটি যুক্ত করার মাধ্যমে এর লেআউট নিজেই পরিচালনা করুন।

GCKUICastContainerViewController ব্যবহার করে র‍্যাপ করুন

প্রথম উপায়টি হলো GCKUICastContainerViewController ব্যবহার করা, যা অন্য একটি ভিউ কন্ট্রোলারকে র‍্যাপ করে এবং এর নিচে একটি GCKUIMiniMediaControlsViewController যুক্ত করে। এই পদ্ধতির সীমাবদ্ধতা হলো, আপনি এর অ্যানিমেশন কাস্টমাইজ করতে পারবেন না এবং কন্টেইনার ভিউ কন্ট্রোলারের আচরণ কনফিগার করতে পারবেন না।

এই প্রথম পদ্ধতিটি সাধারণত অ্যাপ ডেলিগেটের -[application:didFinishLaunchingWithOptions:] মেথডে করা হয়ে থাকে:

সুইফট
func applicationDidFinishLaunching(_ application: UIApplication) {
  ...

  // Wrap main view in the GCKUICastContainerViewController and display the mini controller.
  let appStoryboard = UIStoryboard(name: "Main", bundle: nil)
  let navigationController = appStoryboard.instantiateViewController(withIdentifier: "MainNavigation")
  let castContainerVC =
          GCKCastContext.sharedInstance().createCastContainerController(for: navigationController)
  castContainerVC.miniMediaControlsItemEnabled = true
  window = UIWindow(frame: UIScreen.main.bounds)
  window!.rootViewController = castContainerVC
  window!.makeKeyAndVisible()

  ...
}
উদ্দেশ্য-সি
- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  // Wrap main view in the GCKUICastContainerViewController and display the mini controller.
  UIStoryboard *appStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
  UINavigationController *navigationController =
          [appStoryboard instantiateViewControllerWithIdentifier:@"MainNavigation"];
  GCKUICastContainerViewController *castContainerVC =
          [[GCKCastContext sharedInstance] createCastContainerControllerForViewController:navigationController];
  castContainerVC.miniMediaControlsItemEnabled = YES;
  self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
  self.window.rootViewController = castContainerVC;
  [self.window makeKeyAndVisible];
  ...

}
সুইফট
var castControlBarsEnabled: Bool {
  set(enabled) {
    if let castContainerVC = self.window?.rootViewController as? GCKUICastContainerViewController {
      castContainerVC.miniMediaControlsItemEnabled = enabled
    } else {
      print("GCKUICastContainerViewController is not correctly configured")
    }
  }
  get {
    if let castContainerVC = self.window?.rootViewController as? GCKUICastContainerViewController {
      return castContainerVC.miniMediaControlsItemEnabled
    } else {
      print("GCKUICastContainerViewController is not correctly configured")
      return false
    }
  }
}
উদ্দেশ্য-সি

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;
@property (nonatomic, assign) BOOL castControlBarsEnabled;

@end

AppDelegate.m

@implementation AppDelegate

...

- (void)setCastControlBarsEnabled:(BOOL)notificationsEnabled {
  GCKUICastContainerViewController *castContainerVC;
  castContainerVC =
      (GCKUICastContainerViewController *)self.window.rootViewController;
  castContainerVC.miniMediaControlsItemEnabled = notificationsEnabled;
}

- (BOOL)castControlBarsEnabled {
  GCKUICastContainerViewController *castContainerVC;
  castContainerVC =
      (GCKUICastContainerViewController *)self.window.rootViewController;
  return castContainerVC.miniMediaControlsItemEnabled;
}

...

@end

বিদ্যমান ভিউ কন্ট্রোলারে এমবেড করুন

দ্বিতীয় উপায়টি হলো, createMiniMediaControlsViewController ব্যবহার করে একটি GCKUIMiniMediaControlsViewController ইনস্ট্যান্স তৈরি করা এবং তারপর সেটিকে কন্টেইনার ভিউ কন্ট্রোলারে একটি সাবভিউ হিসেবে যুক্ত করার মাধ্যমে মিনি কন্ট্রোলারটিকে সরাসরি আপনার বিদ্যমান ভিউ কন্ট্রোলারে যোগ করা।

অ্যাপ ডেলিগেটে আপনার ভিউ কন্ট্রোলার সেট আপ করুন:

সুইফট
func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  ...

  GCKCastContext.sharedInstance().useDefaultExpandedMediaControls = true
  window?.clipsToBounds = true

  let rootContainerVC = (window?.rootViewController as? RootContainerViewController)
  rootContainerVC?.miniMediaControlsViewEnabled = true

  ...

  return true
}
উদ্দেশ্য-সি
- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  [GCKCastContext sharedInstance].useDefaultExpandedMediaControls = YES;

  self.window.clipsToBounds = YES;

  RootContainerViewController *rootContainerVC;
  rootContainerVC =
      (RootContainerViewController *)self.window.rootViewController;
  rootContainerVC.miniMediaControlsViewEnabled = YES;

  ...

  return YES;
}

আপনার রুট ভিউ কন্ট্রোলারে, একটি GCKUIMiniMediaControlsViewController ইনস্ট্যান্স তৈরি করুন এবং এটিকে কন্টেইনার ভিউ কন্ট্রোলারে একটি সাবভিউ হিসেবে যুক্ত করুন:

সুইফট
let kCastControlBarsAnimationDuration: TimeInterval = 0.20

@objc(RootContainerViewController)
class RootContainerViewController: UIViewController, GCKUIMiniMediaControlsViewControllerDelegate {
  @IBOutlet weak private var _miniMediaControlsContainerView: UIView!
  @IBOutlet weak private var _miniMediaControlsHeightConstraint: NSLayoutConstraint!
  private var miniMediaControlsViewController: GCKUIMiniMediaControlsViewController!
  var miniMediaControlsViewEnabled = false {
    didSet {
      if self.isViewLoaded {
        self.updateControlBarsVisibility()
      }
    }
  }

  var overriddenNavigationController: UINavigationController?

  override var navigationController: UINavigationController? {

    get {
      return overriddenNavigationController
    }

    set {
      overriddenNavigationController = newValue
    }
  }
  var miniMediaControlsItemEnabled = false

  override func viewDidLoad() {
    super.viewDidLoad()
    let castContext = GCKCastContext.sharedInstance()
    self.miniMediaControlsViewController = castContext.createMiniMediaControlsViewController()
    self.miniMediaControlsViewController.delegate = self
    self.updateControlBarsVisibility()
    self.installViewController(self.miniMediaControlsViewController,
                               inContainerView: self._miniMediaControlsContainerView)
  }

  func updateControlBarsVisibility() {
    if self.miniMediaControlsViewEnabled && self.miniMediaControlsViewController.active {
      self._miniMediaControlsHeightConstraint.constant = self.miniMediaControlsViewController.minHeight
      self.view.bringSubview(toFront: self._miniMediaControlsContainerView)
    } else {
      self._miniMediaControlsHeightConstraint.constant = 0
    }
    UIView.animate(withDuration: kCastControlBarsAnimationDuration, animations: {() -> Void in
      self.view.layoutIfNeeded()
    })
    self.view.setNeedsLayout()
  }

  func installViewController(_ viewController: UIViewController?, inContainerView containerView: UIView) {
    if let viewController = viewController {
      self.addChildViewController(viewController)
      viewController.view.frame = containerView.bounds
      containerView.addSubview(viewController.view)
      viewController.didMove(toParentViewController: self)
    }
  }

  func uninstallViewController(_ viewController: UIViewController) {
    viewController.willMove(toParentViewController: nil)
    viewController.view.removeFromSuperview()
    viewController.removeFromParentViewController()
  }

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "NavigationVCEmbedSegue" {
      self.navigationController = (segue.destination as? UINavigationController)
    }
  }

...
উদ্দেশ্য-সি

RootContainerViewController.h

static const NSTimeInterval kCastControlBarsAnimationDuration = 0.20;

@interface RootContainerViewController () <GCKUIMiniMediaControlsViewControllerDelegate> {
  __weak IBOutlet UIView *_miniMediaControlsContainerView;
  __weak IBOutlet NSLayoutConstraint *_miniMediaControlsHeightConstraint;
  GCKUIMiniMediaControlsViewController *_miniMediaControlsViewController;
}

@property(nonatomic, weak, readwrite) UINavigationController *navigationController;

@property(nonatomic, assign, readwrite) BOOL miniMediaControlsViewEnabled;
@property(nonatomic, assign, readwrite) BOOL miniMediaControlsItemEnabled;

@end

RootContainerViewController.m

@implementation RootContainerViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  GCKCastContext *castContext = [GCKCastContext sharedInstance];
  _miniMediaControlsViewController =
      [castContext createMiniMediaControlsViewController];
  _miniMediaControlsViewController.delegate = self;

  [self updateControlBarsVisibility];
  [self installViewController:_miniMediaControlsViewController
              inContainerView:_miniMediaControlsContainerView];
}

- (void)setMiniMediaControlsViewEnabled:(BOOL)miniMediaControlsViewEnabled {
  _miniMediaControlsViewEnabled = miniMediaControlsViewEnabled;
  if (self.isViewLoaded) {
    [self updateControlBarsVisibility];
  }
}

- (void)updateControlBarsVisibility {
  if (self.miniMediaControlsViewEnabled &&
      _miniMediaControlsViewController.active) {
    _miniMediaControlsHeightConstraint.constant =
        _miniMediaControlsViewController.minHeight;
    [self.view bringSubviewToFront:_miniMediaControlsContainerView];
  } else {
    _miniMediaControlsHeightConstraint.constant = 0;
  }
  [UIView animateWithDuration:kCastControlBarsAnimationDuration
                   animations:^{
                     [self.view layoutIfNeeded];
                   }];
  [self.view setNeedsLayout];
}

- (void)installViewController:(UIViewController *)viewController
              inContainerView:(UIView *)containerView {
  if (viewController) {
    [self addChildViewController:viewController];
    viewController.view.frame = containerView.bounds;
    [containerView addSubview:viewController.view];
    [viewController didMoveToParentViewController:self];
  }
}

- (void)uninstallViewController:(UIViewController *)viewController {
  [viewController willMoveToParentViewController:nil];
  [viewController.view removeFromSuperview];
  [viewController removeFromParentViewController];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  if ([segue.identifier isEqualToString:@"NavigationVCEmbedSegue"]) {
    self.navigationController =
        (UINavigationController *)segue.destinationViewController;
  }
}

...

@end

GCKUIMiniMediaControlsViewControllerDelegate হোস্ট ভিউ কন্ট্রোলারকে বলে দেয় কখন মিনি কন্ট্রোলারটি দৃশ্যমান হবে:

সুইফট
  func miniMediaControlsViewController(_: GCKUIMiniMediaControlsViewController,
                                       shouldAppear _: Bool) {
    updateControlBarsVisibility()
  }
উদ্দেশ্য-সি
- (void)miniMediaControlsViewController:
            (GCKUIMiniMediaControlsViewController *)miniMediaControlsViewController
                           shouldAppear:(BOOL)shouldAppear {
  [self updateControlBarsVisibility];
}

বর্ধিত কন্ট্রোলার যোগ করুন

গুগল কাস্ট ডিজাইন চেকলিস্ট অনুযায়ী, প্রেরক অ্যাপে কাস্ট করা মিডিয়ার জন্য একটি বর্ধিত কন্ট্রোলার থাকা আবশ্যক। এই বর্ধিত কন্ট্রোলারটি হলো মিনি কন্ট্রোলারের একটি ফুল স্ক্রিন সংস্করণ।

এক্সপান্ডেড কন্ট্রোলার হলো একটি ফুল স্ক্রিন ভিউ, যা রিমোট মিডিয়া প্লেব্যাকের সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে। এই ভিউটি একটি কাস্টিং অ্যাপকে ওয়েব রিসিভার ভলিউম কন্ট্রোল এবং সেশন লাইফসাইকেল (কানেক্ট/স্টপ কাস্টিং) ব্যতীত একটি কাস্ট সেশনের সমস্ত পরিচালনাযোগ্য দিক পরিচালনা করার সুযোগ দেয়। এটি মিডিয়া সেশন সম্পর্কিত সমস্ত স্ট্যাটাস তথ্যও (আর্টওয়ার্ক, টাইটেল, সাবটাইটেল ইত্যাদি) প্রদান করে।

এই ভিউটির কার্যকারিতা GCKUIExpandedMediaControlsViewController ক্লাস দ্বারা বাস্তবায়িত হয়।

সর্বপ্রথম আপনাকে কাস্ট কনটেক্সটে ডিফল্ট এক্সপান্ডেড কন্ট্রোলারটি সক্রিয় করতে হবে। ডিফল্ট এক্সপান্ডেড কন্ট্রোলারটি সক্রিয় করতে অ্যাপ ডেলিগেটটি পরিবর্তন করুন:

সুইফট
func applicationDidFinishLaunching(_ application: UIApplication) {
  ..

  GCKCastContext.sharedInstance().useDefaultExpandedMediaControls = true

  ...
}
উদ্দেশ্য-সি
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  [GCKCastContext sharedInstance].useDefaultExpandedMediaControls = YES;

  ..
}

ব্যবহারকারী যখন ভিডিও কাস্ট করা শুরু করবে, তখন এক্সপান্ডেড কন্ট্রোলারটি লোড করার জন্য আপনার ভিউ কন্ট্রোলারে নিম্নলিখিত কোডটি যোগ করুন:

সুইফট
func playSelectedItemRemotely() {
  GCKCastContext.sharedInstance().presentDefaultExpandedMediaControls()

  ...

  // Load your media
  sessionManager.currentSession?.remoteMediaClient?.loadMedia(mediaInformation)
}
উদ্দেশ্য-সি
- (void)playSelectedItemRemotely {
  [[GCKCastContext sharedInstance] presentDefaultExpandedMediaControls];

  ...

  // Load your media
  [self.sessionManager.currentSession.remoteMediaClient loadMedia:mediaInformation];
}

ব্যবহারকারী মিনি কন্ট্রোলারে ট্যাপ করলে বর্ধিত কন্ট্রোলারটিও স্বয়ংক্রিয়ভাবে চালু হয়ে যাবে।

যখন আপনার প্রেরক অ্যাপ কোনো ভিডিও বা অডিও লাইভ স্ট্রিম চালায়, তখন SDK স্বয়ংক্রিয়ভাবে এক্সপান্ডেড কন্ট্রোলারের প্লে/পজ বাটনের পরিবর্তে একটি প্লে/স্টপ বাটন প্রদর্শন করে।

আপনার প্রেরক অ্যাপ কীভাবে কাস্ট উইজেটগুলির চেহারা কনফিগার করতে পারে, তা জানতে ‘আপনার iOS অ্যাপে কাস্টম স্টাইল প্রয়োগ করুন’ দেখুন।

ভলিউম নিয়ন্ত্রণ

Cast ফ্রেমওয়ার্কটি প্রেরক অ্যাপের জন্য ভলিউম স্বয়ংক্রিয়ভাবে পরিচালনা করে। ফ্রেমওয়ার্কটি সরবরাহকৃত UI উইজেটগুলোর জন্য ওয়েব রিসিভার ভলিউমের সাথে স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ করে। অ্যাপ দ্বারা প্রদত্ত কোনো স্লাইডার সিঙ্ক করতে, GCKUIDeviceVolumeController ব্যবহার করুন।

ফিজিক্যাল বাটন ভলিউম কন্ট্রোল

প্রেরক ডিভাইসের ফিজিক্যাল ভলিউম বাটনগুলো ব্যবহার করে ওয়েব রিসিভারে কাস্ট সেশনের ভলিউম পরিবর্তন করা যায়। এর জন্য GCKCastContext এ সেট করা GCKCastOptions এর physicalVolumeButtonsWillControlDeviceVolume ফ্ল্যাগটি ব্যবহার করতে হয়।

সুইফট
let criteria = GCKDiscoveryCriteria(applicationID: kReceiverAppID)
let options = GCKCastOptions(discoveryCriteria: criteria)
options.physicalVolumeButtonsWillControlDeviceVolume = true
GCKCastContext.setSharedInstanceWith(options)
উদ্দেশ্য-সি
GCKDiscoveryCriteria *criteria = [[GCKDiscoveryCriteria alloc]
                                          initWithApplicationID:kReceiverAppID];
GCKCastOptions *options = [[GCKCastOptions alloc]
                                          initWithDiscoveryCriteria :criteria];
options.physicalVolumeButtonsWillControlDeviceVolume = YES;
[GCKCastContext setSharedInstanceWithOptions:options];

ত্রুটিগুলি পরিচালনা করুন

প্রেরক অ্যাপগুলোর জন্য সমস্ত ত্রুটি কলব্যাক পরিচালনা করা এবং কাস্ট জীবনচক্রের প্রতিটি পর্যায়ে সর্বোত্তম প্রতিক্রিয়া নির্ধারণ করা অত্যন্ত গুরুত্বপূর্ণ। অ্যাপটি ব্যবহারকারীকে ত্রুটির ডায়ালগ প্রদর্শন করতে পারে অথবা কাস্ট সেশনটি শেষ করার সিদ্ধান্ত নিতে পারে।

উল্লেখ্য যে, GCKErrorCode GCKErrorCodeCancelled সহ কিছু ত্রুটি প্রত্যাশিত আচরণ।

GCKErrorCodeCancelled ত্রুটির কারণে ব্যর্থ হওয়া কোনো সংযোগ পুনরায় চেষ্টা করবেন না। এমনটা করলে অপ্রত্যাশিত আচরণ দেখা দিতে পারে।

লগিং

GCKLogger হলো ফ্রেমওয়ার্ক দ্বারা লগিংয়ের জন্য ব্যবহৃত একটি সিঙ্গেলটন। আপনি কীভাবে লগ বার্তাগুলো পরিচালনা করবেন তা কাস্টমাইজ করতে GCKLoggerDelegate ব্যবহার করুন।

GCKLogger ব্যবহার করে, SDK ডিবাগ মেসেজ, এরর এবং ওয়ার্নিং আকারে লগিং আউটপুট তৈরি করে। এই লগ মেসেজগুলো ডিবাগিং-এ সাহায্য করে এবং সমস্যা চিহ্নিত ও সমাধান করার জন্য উপযোগী। ডিফল্টরূপে, লগ আউটপুট বন্ধ থাকে, কিন্তু একটি GCKLoggerDelegate অ্যাসাইন করার মাধ্যমে প্রেরক অ্যাপটি SDK থেকে এই মেসেজগুলো গ্রহণ করে সিস্টেম কনসোলে লগ করতে পারে।

সুইফট
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GCKLoggerDelegate {
  let kReceiverAppID = kGCKDefaultMediaReceiverApplicationID
  let kDebugLoggingEnabled = true

  var window: UIWindow?

  func applicationDidFinishLaunching(_ application: UIApplication) {
    ...

    // Enable logger.
    GCKLogger.sharedInstance().delegate = self

    ...
  }

  // MARK: - GCKLoggerDelegate

  func logMessage(_ message: String,
                  at level: GCKLoggerLevel,
                  fromFunction function: String,
                  location: String) {
    if (kDebugLoggingEnabled) {
      print(function + " - " + message)
    }
  }
}
উদ্দেশ্য-সি

AppDelegate.h

@interface AppDelegate () <GCKLoggerDelegate>
@end

AppDelegate.m

@implementation AppDelegate

static NSString *const kReceiverAppID = @"AABBCCDD";
static const BOOL kDebugLoggingEnabled = YES;

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...

  // Enable logger.
  [GCKLogger sharedInstance].delegate = self;

  ...

  return YES;
}

...

#pragma mark - GCKLoggerDelegate

- (void)logMessage:(NSString *)message
           atLevel:(GCKLoggerLevel)level
      fromFunction:(NSString *)function
          location:(NSString *)location {
  if (kDebugLoggingEnabled) {
    NSLog(@"%@ - %@, %@", function, message, location);
  }
}

@end

ডিবাগ এবং ভার্বোস মেসেজও চালু করতে, ডেলিগেট সেট করার পর (যা আগে দেখানো হয়েছে) কোডে এই লাইনটি যোগ করুন:

সুইফট
let filter = GCKLoggerFilter.init()
filter.minimumLevel = GCKLoggerLevel.verbose
GCKLogger.sharedInstance().filter = filter
উদ্দেশ্য-সি
GCKLoggerFilter *filter = [[GCKLoggerFilter alloc] init];
[filter setMinimumLevel:GCKLoggerLevelVerbose];
[GCKLogger sharedInstance].filter = filter;

আপনি GCKLogger দ্বারা উৎপাদিত লগ বার্তাগুলিও ফিল্টার করতে পারেন। প্রতিটি ক্লাসের জন্য সর্বনিম্ন লগিং স্তর সেট করুন, উদাহরণস্বরূপ:

সুইফট
let filter = GCKLoggerFilter.init()
filter.setLoggingLevel(GCKLoggerLevel.verbose, forClasses: ["GCKUICastButton",
                                                            "GCKUIImageCache",
                                                            "NSMutableDictionary"])
GCKLogger.sharedInstance().filter = filter
উদ্দেশ্য-সি
GCKLoggerFilter *filter = [[GCKLoggerFilter alloc] init];
[filter setLoggingLevel:GCKLoggerLevelVerbose
             forClasses:@[@"GCKUICastButton",
                          @"GCKUIImageCache",
                          @"NSMutableDictionary"
                          ]];
[GCKLogger sharedInstance].filter = filter;

ক্লাসের নামগুলো আক্ষরিক নাম অথবা গ্লোব প্যাটার্ন হতে পারে, যেমন, GCKUI\* এবং GCK\*Session