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

এই ডেভেলপার নির্দেশিকাটি বর্ণনা করে যে কীভাবে iOS সেন্ডার SDK ব্যবহার করে আপনার iOS সেন্ডার অ্যাপে Google Cast সমর্থন যোগ করবেন।

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

প্রেরক কাঠামো বলতে প্রেরকের রানটাইমে উপস্থিত কাস্ট ক্লাস লাইব্রেরি বাইনারি এবং সংশ্লিষ্ট রিসোর্সগুলিকে বোঝায়। প্রেরক অ্যাপ বা কাস্ট অ্যাপ বলতে প্রেরকের উপর চলমান একটি অ্যাপকেও বোঝায়। ওয়েব রিসিভার অ্যাপ বলতে ওয়েব রিসিভারে চলমান HTML অ্যাপ্লিকেশনকে বোঝায়।

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

অ্যাপ প্রবাহ

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

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

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

গুগল কাস্ট iOS ফ্রেমওয়ার্কের সকল ক্লাস, পদ্ধতি এবং ইভেন্টের একটি বিস্তৃত তালিকার জন্য, গুগল কাস্ট iOS API রেফারেন্স দেখুন। নিম্নলিখিত বিভাগগুলিতে আপনার iOS অ্যাপে কাস্টকে একীভূত করার পদক্ষেপগুলি অন্তর্ভুক্ত করা হয়েছে।

প্রধান থ্রেড থেকে কল পদ্ধতি

কাস্ট প্রসঙ্গ শুরু করুন

কাস্ট ফ্রেমওয়ার্কে একটি গ্লোবাল সিঙ্গেলটন অবজেক্ট রয়েছে, 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

কাস্ট ইউএক্স উইজেট

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

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

  • কাস্ট বোতাম : কাস্ট iOS সেন্ডার SDK 4.6.0 দিয়ে শুরু করে, যখন প্রেরক ডিভাইসটি Wi-Fi এর সাথে সংযুক্ত থাকে তখন কাস্ট বোতামটি সর্বদা দৃশ্যমান হয়। অ্যাপটি শুরু করার পরে ব্যবহারকারী যখন প্রথমবার কাস্ট বোতামে ট্যাপ করেন, তখন একটি অনুমতি ডায়ালগ প্রদর্শিত হয় যাতে ব্যবহারকারী নেটওয়ার্কে থাকা ডিভাইসগুলিতে অ্যাপটিকে স্থানীয় নেটওয়ার্ক অ্যাক্সেস দিতে পারেন। পরবর্তীতে, যখন ব্যবহারকারী কাস্ট বোতামে ট্যাপ করেন, তখন একটি কাস্ট ডায়ালগ প্রদর্শিত হয় যা আবিষ্কৃত ডিভাইসগুলির তালিকা করে। ডিভাইসটি সংযুক্ত থাকা অবস্থায় ব্যবহারকারী যখন কাস্ট বোতামে ট্যাপ করেন, তখন এটি বর্তমান মিডিয়া মেটাডেটা (যেমন শিরোনাম, রেকর্ডিং স্টুডিওর নাম এবং একটি থাম্বনেইল চিত্র) প্রদর্শন করে অথবা ব্যবহারকারীকে কাস্ট ডিভাইস থেকে সংযোগ বিচ্ছিন্ন করার অনুমতি দেয়। যখন ব্যবহারকারী কোনও ডিভাইস উপলব্ধ না থাকা অবস্থায় কাস্ট বোতামে ট্যাপ করেন, তখন একটি স্ক্রিন প্রদর্শিত হবে যা ব্যবহারকারীকে ডিভাইসগুলি কেন খুঁজে পাওয়া যাচ্ছে না এবং কীভাবে সমস্যা সমাধান করতে হবে সে সম্পর্কে তথ্য দেবে।

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

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

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

ফ্রেমওয়ার্কটিতে 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 এর একটি সম্পত্তি। ফ্রেমওয়ার্কটি ডিভাইস নির্বাচন এবং নিয়ন্ত্রণের জন্য একটি ডিফল্ট কাস্ট ডায়ালগ উপাদান প্রদান করে। ডিভাইস তালিকাটি ডিভাইস-বান্ধব নামের দ্বারা অভিধানিকভাবে সাজানো হয়।

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

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

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

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

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

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

স্ট্রিম ট্রান্সফার

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

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

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

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

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

  • ওয়াইফাইয়ের অস্থায়ী ক্ষতি থেকে সেরে উঠুন
  • ডিভাইস স্লিপ থেকে পুনরুদ্ধার করুন
  • অ্যাপের ব্যাকগ্রাউন্ডিং থেকে পুনরুদ্ধার করুন
  • অ্যাপ ক্র্যাশ হলে পুনরুদ্ধার করুন

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

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

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

আশা করা হচ্ছে যে GCKRemoteMediaClient এর ইনস্ট্যান্স অ্যাপের একাধিক অংশ দ্বারা শেয়ার করা হতে পারে, এবং প্রকৃতপক্ষে ফ্রেমওয়ার্কের কিছু অভ্যন্তরীণ উপাদান যেমন Cast ডায়ালগ এবং মিনি মিডিয়া নিয়ন্ত্রণগুলি ইনস্ট্যান্সটি শেয়ার করে। সেই লক্ষ্যে, 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 প্রোপার্টিতে enum মান GCKVideoInfoHDRType দ্বারা নির্দেশিত হয়।

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

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

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

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

আপনার প্রেরক অ্যাপ কীভাবে কাস্ট উইজেটের উপস্থিতি কনফিগার করতে পারে তার জন্য 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)
    }
  }

...
অবজেক্টিভ-সি

রুটকন্টেইনারভিউকন্ট্রোলার.এইচ

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

রুটকন্টেইনারভিউকন্ট্রোলার.এম

@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 অ্যাপে কাস্টম স্টাইল প্রয়োগ করুন দেখুন।

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

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

ভৌত বোতাম ভলিউম নিয়ন্ত্রণ

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

সুইফট
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