একটি iOS অ্যাপ কাস্ট-সক্ষম করুন

1. সংক্ষিপ্ত বিবরণ

গুগল কাস্ট লোগো

এই কোডল্যাবটি আপনাকে শেখাবে কিভাবে একটি বিদ্যমান iOS ভিডিও অ্যাপকে Google Cast-সক্ষম ডিভাইসে কন্টেন্ট কাস্ট করার জন্য পরিবর্তন করতে হয়।

গুগল কাস্ট কী?

গুগল কাস্ট ব্যবহারকারীদের মোবাইল ডিভাইস থেকে টিভিতে কন্টেন্ট কাস্ট করার সুযোগ দেয়। এরপর ব্যবহারকারীরা টিভিতে মিডিয়া প্লেব্যাকের জন্য তাদের মোবাইল ডিভাইসটিকে রিমোট কন্ট্রোল হিসেবে ব্যবহার করতে পারবেন।

Google Cast SDK আপনাকে Google Cast সক্ষম ডিভাইসগুলি (যেমন একটি টিভি বা সাউন্ড সিস্টেম) নিয়ন্ত্রণ করতে আপনার অ্যাপটি প্রসারিত করতে দেয়। Cast SDK আপনাকে Google Cast ডিজাইন চেকলিস্টের উপর ভিত্তি করে প্রয়োজনীয় UI উপাদানগুলি যোগ করতে দেয়।

সমস্ত সমর্থিত প্ল্যাটফর্ম জুড়ে কাস্ট ব্যবহারকারীর অভিজ্ঞতা সহজ এবং অনুমানযোগ্য করার জন্য গুগল কাস্ট ডিজাইন চেকলিস্ট প্রদান করা হয়েছে।

আমরা কী তৈরি করতে যাচ্ছি?

এই কোডল্যাবটি সম্পন্ন করার পর, আপনার কাছে একটি iOS ভিডিও অ্যাপ থাকবে যা একটি Google Cast ডিভাইসে ভিডিও কাস্ট করতে সক্ষম হবে।

তুমি কি শিখবে

  • একটি নমুনা ভিডিও অ্যাপে Google Cast SDK কীভাবে যোগ করবেন।
  • গুগল কাস্ট ডিভাইস নির্বাচন করার জন্য কাস্ট বোতামটি কীভাবে যুক্ত করবেন।
  • কিভাবে একটি কাস্ট ডিভাইসের সাথে সংযোগ করবেন এবং একটি মিডিয়া রিসিভার চালু করবেন।
  • কিভাবে একটি ভিডিও কাস্ট করবেন।
  • আপনার অ্যাপে একটি কাস্ট মিনি কন্ট্রোলার কীভাবে যোগ করবেন।
  • কিভাবে একটি বর্ধিত নিয়ামক যোগ করবেন।
  • কিভাবে একটি পরিচায়ক ওভারলে প্রদান করবেন।
  • কাস্ট উইজেটগুলি কীভাবে কাস্টমাইজ করবেন।
  • কাস্ট কানেক্ট কীভাবে সংহত করবেন

তোমার যা লাগবে

  • সর্বশেষ এক্সকোড
  • iOS 9 বা তার পরবর্তী সংস্করণ (অথবা Xcode সিমুলেটর) সহ একটি মোবাইল ডিভাইস।
  • আপনার মোবাইল ডিভাইসটিকে আপনার ডেভেলপমেন্ট কম্পিউটারের সাথে সংযুক্ত করার জন্য একটি USB ডেটা কেবল (যদি আপনি কোনও ডিভাইস ব্যবহার করেন)।
  • ইন্টারনেট অ্যাক্সেস সহ কনফিগার করা Chromecast বা Android TV এর মতো একটি Google Cast ডিভাইস।
  • HDMI ইনপুট সহ একটি টিভি বা মনিটর।
  • Cast Connect ইন্টিগ্রেশন পরীক্ষা করার জন্য Google TV সহ একটি Chromecast প্রয়োজন, তবে বাকি কোডল্যাবের জন্য এটি ঐচ্ছিক। যদি আপনার কাছে এটি না থাকে, তাহলে এই টিউটোরিয়ালের শেষে "Add Cast Connect Support" ধাপটি এড়িয়ে যেতে দ্বিধা করবেন না।

অভিজ্ঞতা

  • আপনার iOS ডেভেলপমেন্ট সম্পর্কে পূর্বের জ্ঞান থাকতে হবে।
  • আপনার টিভি দেখার পূর্ব জ্ঞানও প্রয়োজন :)

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু পুরোটা পড়ুন এটি পড়ুন এবং অনুশীলনগুলি সম্পূর্ণ করুন।

iOS অ্যাপ তৈরির ক্ষেত্রে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

নবীন মধ্যবর্তী দক্ষ

টিভি দেখার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

নবীন মধ্যবর্তী দক্ষ

2. নমুনা কোড পান

আপনি আপনার কম্পিউটারে সমস্ত নমুনা কোড ডাউনলোড করতে পারেন...

এবং ডাউনলোড করা জিপ ফাইলটি আনপ্যাক করুন।

৩. নমুনা অ্যাপটি চালান

অ্যাপল আইওএস লোগো

প্রথমে দেখা যাক সম্পূর্ণ নমুনা অ্যাপটি কেমন দেখাচ্ছে। অ্যাপটি একটি মৌলিক ভিডিও প্লেয়ার। ব্যবহারকারী একটি তালিকা থেকে একটি ভিডিও নির্বাচন করতে পারেন এবং তারপর ডিভাইসে স্থানীয়ভাবে ভিডিওটি চালাতে পারেন অথবা এটি একটি Google Cast ডিভাইসে কাস্ট করতে পারেন।

কোডটি ডাউনলোড করার পরে, নিম্নলিখিত নির্দেশাবলীতে Xcode-এ সম্পূর্ণ নমুনা অ্যাপটি কীভাবে খুলবেন এবং চালাবেন তা বর্ণনা করা হয়েছে:

সচরাচর জিজ্ঞাস্য

কোকোপডস সেটআপ

CocoaPods সেটআপ করতে, আপনার কনসোলে যান এবং macOS-এ উপলব্ধ ডিফল্ট Ruby ব্যবহার করে ইনস্টল করুন:

sudo gem install cocoapods

যদি আপনার কোন সমস্যা হয়, তাহলে নির্ভরতা ব্যবস্থাপক ডাউনলোড এবং ইনস্টল করতে অফিসিয়াল ডকুমেন্টেশন দেখুন।

প্রকল্প সেটআপ

  1. আপনার টার্মিনালে যান এবং কোডল্যাব ডিরেক্টরিতে যান।
  2. পডফাইল থেকে নির্ভরতা ইনস্টল করুন।
cd app-done
pod update
pod install
  1. এক্সকোড খুলুন এবং অন্য একটি প্রকল্প খুলুন নির্বাচন করুন...
  2. থেকে CastVideos-ios.xcworkspace ফাইলটি নির্বাচন করুন ফোল্ডার আইকন নমুনা কোড ফোল্ডারে app-done ডিরেক্টরি।

অ্যাপটি চালান

লক্ষ্য এবং সিমুলেটর নির্বাচন করুন, এবং তারপর অ্যাপটি চালান:

এক্সকোড অ্যাপ সিমুলেটর টুলবার

কয়েক সেকেন্ড পরে ভিডিও অ্যাপটি আপনার সামনে আসবে।

ইনকামিং নেটওয়ার্ক সংযোগ গ্রহণের বিজ্ঞপ্তিটি উপস্থিত হলে 'অনুমতি দিন' এ ক্লিক করতে ভুলবেন না। এই বিকল্পটি গ্রহণ না করা হলে কাস্ট আইকনটি প্রদর্শিত হবে না।

ইনবাউন্ড নেটওয়ার্ক সংযোগ গ্রহণের অনুমতি চাওয়ার জন্য নিশ্চিতকরণ ডায়ালগ

কাস্ট বোতামে ক্লিক করুন এবং আপনার গুগল কাস্ট ডিভাইসটি নির্বাচন করুন।

একটি ভিডিও নির্বাচন করুন, প্লে বোতামে ক্লিক করুন।

ভিডিওটি আপনার Google Cast ডিভাইসে চলতে শুরু করবে।

প্রসারিত কন্ট্রোলারটি প্রদর্শিত হবে। প্লেব্যাক নিয়ন্ত্রণ করতে আপনি প্লে/পজ বোতামটি ব্যবহার করতে পারেন।

ভিডিওর তালিকায় ফিরে যান।

স্ক্রিনের নীচে এখন একটি মিনি কন্ট্রোলার দৃশ্যমান।

নীচে মিনি কন্ট্রোলারটি দেখাচ্ছে এমন আইফোনে CastVideos অ্যাপ চালানোর চিত্র।

রিসিভারে ভিডিও থামাতে মিনি কন্ট্রোলারের পজ বোতামে ক্লিক করুন। আবার ভিডিও চালানো চালিয়ে যেতে মিনি কন্ট্রোলারের প্লে বোতামে ক্লিক করুন।

Google Cast ডিভাইসে কাস্টিং বন্ধ করতে Cast বোতামে ক্লিক করুন।

৪. শুরুর প্রকল্পটি প্রস্তুত করুন

আইফোনে CastVideos অ্যাপ চালানোর চিত্র

আপনার ডাউনলোড করা স্টার্ট অ্যাপটিতে Google Cast-এর জন্য সাপোর্ট যোগ করতে হবে। এখানে কিছু Google Cast পরিভাষা দেওয়া হল যা আমরা এই কোডল্যাবে ব্যবহার করব:

  • একটি প্রেরক অ্যাপ একটি মোবাইল ডিভাইস বা ল্যাপটপে চলে,
  • গুগল কাস্ট ডিভাইসে একটি রিসিভার অ্যাপ চলে।

প্রকল্প সেটআপ

এখন আপনি Xcode ব্যবহার করে স্টার্টার প্রজেক্টের উপরে তৈরি করতে প্রস্তুত:

  1. আপনার টার্মিনালে যান এবং কোডল্যাব ডিরেক্টরিতে যান।
  2. পডফাইল থেকে নির্ভরতা ইনস্টল করুন।
cd app-start
pod update
pod install
  1. এক্সকোড খুলুন এবং অন্য একটি প্রকল্প খুলুন নির্বাচন করুন...
  2. থেকে CastVideos-ios.xcworkspace ফাইলটি নির্বাচন করুন ফোল্ডার আইকন নমুনা কোড ফোল্ডারে app-start ডিরেক্টরি।

অ্যাপ ডিজাইন

অ্যাপটি একটি দূরবর্তী ওয়েব সার্ভার থেকে ভিডিওগুলির একটি তালিকা নিয়ে আসে এবং ব্যবহারকারীকে ব্রাউজ করার জন্য একটি তালিকা প্রদান করে। ব্যবহারকারীরা বিস্তারিত দেখতে একটি ভিডিও নির্বাচন করতে পারেন অথবা মোবাইল ডিভাইসে স্থানীয়ভাবে ভিডিওটি চালাতে পারেন।

অ্যাপটিতে দুটি প্রধান ভিউ কন্ট্রোলার রয়েছে: MediaTableViewController এবং MediaViewController.

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

এই UITableViewController একটি MediaListModel ইনস্ট্যান্স থেকে ভিডিওগুলির একটি তালিকা প্রদর্শন করে। ভিডিওগুলির তালিকা এবং তাদের সাথে সম্পর্কিত মেটাডেটা একটি রিমোট সার্ভারে একটি JSON ফাইল হিসাবে হোস্ট করা হয়। MediaListModel এই JSONটি আনে এবং MediaItem অবজেক্টের একটি তালিকা তৈরি করতে এটি প্রক্রিয়া করে।

একটি MediaItem অবজেক্ট একটি ভিডিও এবং এর সাথে সম্পর্কিত মেটাডেটা মডেল করে, যেমন এর শিরোনাম, বিবরণ, একটি ছবির URL এবং স্ট্রিমের URL।

MediaTableViewController একটি MediaListModel ইনস্ট্যান্স তৈরি করে এবং তারপর নিজেকে MediaListModelDelegate হিসেবে নিবন্ধিত করে যাতে মিডিয়া মেটাডেটা ডাউনলোড হয়ে গেলে তা জানানো হয় যাতে এটি টেবিল ভিউ লোড করতে পারে।

ব্যবহারকারীকে প্রতিটি ভিডিওর জন্য একটি সংক্ষিপ্ত বিবরণ সহ ভিডিও থাম্বনেইলের একটি তালিকা উপস্থাপন করা হয়। যখন একটি আইটেম নির্বাচন করা হয়, তখন সংশ্লিষ্ট MediaItem MediaViewController এ পাঠানো হয়।

মিডিয়াভিউকন্ট্রোলার

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

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

সচরাচর জিজ্ঞাস্য

৫. কাস্ট বোতাম যোগ করা

CastVideos অ্যাপটি চালানো একটি iPhone এর উপরের তৃতীয়াংশের চিত্র, যেখানে উপরের ডানদিকের কোণায় Cast বোতামটি দেখানো হয়েছে।

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

কনফিগারেশন

স্টার্ট প্রজেক্টের জন্য সম্পূর্ণ নমুনা অ্যাপের মতো একই নির্ভরতা এবং Xcode সেটআপ প্রয়োজন। সেই বিভাগে ফিরে যান এবং স্টার্ট অ্যাপ প্রজেক্টে GoogleCast.framework যোগ করার জন্য একই ধাপগুলি অনুসরণ করুন।

আরম্ভকরণ

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

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

Cast ফ্রেমওয়ার্ক থেকে লগিং বার্তা গ্রহণের জন্য লগিং ডেলিগেট সেট আপ করার জন্য application(_:didFinishLaunchingWithOptions:) পদ্ধতিটিও একটি ভালো জায়গা। এটি ডিবাগিং এবং সমস্যা সমাধানের জন্য কার্যকর হতে পারে।

যখন আপনি নিজের কাস্ট-সক্ষম অ্যাপ তৈরি করেন, তখন আপনাকে কাস্ট ডেভেলপার হিসেবে নিবন্ধন করতে হবে এবং তারপর আপনার অ্যাপের জন্য একটি অ্যাপ্লিকেশন আইডি সংগ্রহ করতে হবে। এই কোডল্যাবের জন্য, আমরা একটি নমুনা অ্যাপ আইডি ব্যবহার করব।

ব্যবহারকারীর ডিফল্ট থেকে অ্যাপ্লিকেশন আইডি দিয়ে GCKCastContext আরম্ভ করতে AppDelegate.swift এ নিম্নলিখিত কোডটি যুক্ত করুন এবং Google Cast ফ্রেমওয়ার্কের জন্য একটি লগার যুক্ত করুন:

import GoogleCast

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  fileprivate var enableSDKLogging = true

  ...

  func application(_: UIApplication,
                   didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    ...
    let options = GCKCastOptions(discoveryCriteria: GCKDiscoveryCriteria(applicationID: kReceiverAppID))
    options.physicalVolumeButtonsWillControlDeviceVolume = true
    GCKCastContext.setSharedInstanceWith(options)

    window?.clipsToBounds = true
    setupCastLogging()
    ...
  }
  ...
  func setupCastLogging() {
    let logFilter = GCKLoggerFilter()
    let classesToLog = ["GCKDeviceScanner", "GCKDeviceProvider", "GCKDiscoveryManager", "GCKCastChannel",
                        "GCKMediaControlChannel", "GCKUICastButton", "GCKUIMediaController", "NSMutableDictionary"]
    logFilter.setLoggingLevel(.verbose, forClasses: classesToLog)
    GCKLogger.sharedInstance().filter = logFilter
    GCKLogger.sharedInstance().delegate = self
  }
}

...

// MARK: - GCKLoggerDelegate

extension AppDelegate: GCKLoggerDelegate {
  func logMessage(_ message: String,
                  at _: GCKLoggerLevel,
                  fromFunction function: String,
                  location: String) {
    if enableSDKLogging {
      // Send SDK's log messages directly to the console.
      print("\(location): \(function) - \(message)")
    }
  }
}

কাস্ট বোতাম

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

MediaTableViewController.swift এবং MediaViewController.swift এ নিম্নলিখিত কোডটি যোগ করুন:

import GoogleCast

@objc(MediaTableViewController)
class MediaTableViewController: UITableViewController, GCKSessionManagerListener,
  MediaListModelDelegate, GCKRequestDelegate {
  private var castButton: GCKUICastButton!
  ...
  override func viewDidLoad() {
    print("MediaTableViewController - viewDidLoad")
    super.viewDidLoad()

    ...
    castButton = GCKUICastButton(frame: CGRect(x: CGFloat(0), y: CGFloat(0),
                                               width: CGFloat(24), height: CGFloat(24)))
    // Overwrite the UIAppearance theme in the AppDelegate.
    castButton.tintColor = UIColor.white
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: castButton)

    ...
  }
  ...
}

এরপর, আপনার MediaViewController.swift এ নিম্নলিখিত কোডটি যোগ করুন:

import GoogleCast

@objc(MediaViewController)
class MediaViewController: UIViewController, GCKSessionManagerListener, GCKRemoteMediaClientListener,
  LocalPlayerViewDelegate, GCKRequestDelegate {
  private var castButton: GCKUICastButton!
  ...
  override func viewDidLoad() {
    super.viewDidLoad()
    print("in MediaViewController viewDidLoad")
    ...
    castButton = GCKUICastButton(frame: CGRect(x: CGFloat(0), y: CGFloat(0),
                                               width: CGFloat(24), height: CGFloat(24)))
    // Overwrite the UIAppearance theme in the AppDelegate.
    castButton.tintColor = UIColor.white
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: castButton)

    ...
  }
  ...
}

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

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

৬. ভিডিও কন্টেন্ট কাস্ট করা

একটি আইফোনে চলমান CastVideos অ্যাপের চিত্র, যা একটি নির্দিষ্ট ভিডিওর ('টিয়ার্স অফ স্টিল') বিস্তারিত দেখায়। নীচে মিনি প্লেয়ারটি রয়েছে।

আমরা নমুনা অ্যাপটিকে কাস্ট ডিভাইসে দূরবর্তীভাবে ভিডিও চালানোর জন্যও প্রসারিত করব। এটি করার জন্য আমাদের কাস্ট ফ্রেমওয়ার্ক দ্বারা তৈরি বিভিন্ন ইভেন্ট শুনতে হবে।

কাস্টিং মিডিয়া

উচ্চ স্তরে, যদি আপনি একটি Cast ডিভাইসে একটি মিডিয়া চালাতে চান, তাহলে নিম্নলিখিতগুলি ঘটতে হবে:

  1. Cast SDK থেকে একটি GCKMediaInformation অবজেক্ট তৈরি করুন যা একটি মিডিয়া আইটেমের মডেল তৈরি করে।
  2. আপনার রিসিভার অ্যাপ্লিকেশন চালু করার জন্য ব্যবহারকারী কাস্ট ডিভাইসের সাথে সংযোগ স্থাপন করে।
  3. আপনার রিসিভারে GCKMediaInformation অবজেক্টটি লোড করুন এবং কন্টেন্টটি চালান।
  4. মিডিয়ার অবস্থা ট্র্যাক করুন।
  5. ব্যবহারকারীর মিথস্ক্রিয়ার উপর ভিত্তি করে রিসিভারকে প্লেব্যাক কমান্ড পাঠান।

ধাপ ১ হলো একটি বস্তুর সাথে অন্য বস্তুর ম্যাপিং করা; GCKMediaInformation হল এমন একটি জিনিস যা Cast SDK বোঝে এবং MediaItem হল আমাদের অ্যাপের একটি মিডিয়া আইটেমের জন্য এনক্যাপসুলেশন; আমরা সহজেই একটি MediaItem GCKMediaInformation এ ম্যাপ করতে পারি। আমরা ইতিমধ্যেই পূর্ববর্তী বিভাগে ধাপ ২ সম্পন্ন করেছি। ধাপ ৩ কাস্ট SDK দিয়ে করা সহজ।

নমুনা অ্যাপ MediaViewController ইতিমধ্যেই এই enum ব্যবহার করে স্থানীয় বনাম দূরবর্তী প্লেব্যাকের মধ্যে পার্থক্য করে:

enum PlaybackMode: Int {
  case none = 0
  case local
  case remote
}

private var playbackMode = PlaybackMode.none

এই কোডল্যাবে আপনার জন্য সমস্ত নমুনা প্লেয়ার লজিক কীভাবে কাজ করে তা সঠিকভাবে বোঝা গুরুত্বপূর্ণ নয়। এটি বোঝা গুরুত্বপূর্ণ যে দুটি প্লেব্যাক অবস্থান একইভাবে জানার জন্য আপনার অ্যাপের মিডিয়া প্লেয়ারটি পরিবর্তন করতে হবে।

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

কাস্ট সেশন ম্যানেজমেন্ট

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

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

কাস্ট সেশনগুলি GCKSessionManager দ্বারা পরিচালিত হয়, যা GCKCastContext.sharedInstance().sessionManager এর মাধ্যমে অ্যাক্সেস করা যেতে পারে। GCKSessionManagerListener কলব্যাকগুলি সেশন ইভেন্টগুলি পর্যবেক্ষণ করতে ব্যবহার করা যেতে পারে, যেমন তৈরি, সাসপেনশন, পুনঃসূচনা এবং সমাপ্তি।

প্রথমে আমাদের সেশন লিসেনার নিবন্ধন করতে হবে এবং কিছু ভেরিয়েবল ইনিশিয়ালাইজ করতে হবে:

class MediaViewController: UIViewController, GCKSessionManagerListener,
  GCKRemoteMediaClientListener, LocalPlayerViewDelegate, GCKRequestDelegate {

  ...
  private var sessionManager: GCKSessionManager!
  ...

  required init?(coder: NSCoder) {
    super.init(coder: coder)

    sessionManager = GCKCastContext.sharedInstance().sessionManager

    ...
  }

  override func viewWillAppear(_ animated: Bool) {
    ...

    let hasConnectedSession: Bool = (sessionManager.hasConnectedSession())
    if hasConnectedSession, (playbackMode != .remote) {
      populateMediaInfo(false, playPosition: 0)
      switchToRemotePlayback()
    } else if sessionManager.currentSession == nil, (playbackMode != .local) {
      switchToLocalPlayback()
    }

    sessionManager.add(self)

    ...
  }

  override func viewWillDisappear(_ animated: Bool) {
    ...

    sessionManager.remove(self)
    sessionManager.currentCastSession?.remoteMediaClient?.remove(self)
    ...
    super.viewWillDisappear(animated)
  }

  func switchToLocalPlayback() {
    ...

    sessionManager.currentCastSession?.remoteMediaClient?.remove(self)

    ...
  }

  func switchToRemotePlayback() {
    ...

    sessionManager.currentCastSession?.remoteMediaClient?.add(self)

    ...
  }


  // MARK: - GCKSessionManagerListener

  func sessionManager(_: GCKSessionManager, didStart session: GCKSession) {
    print("MediaViewController: sessionManager didStartSession \(session)")
    setQueueButtonVisible(true)
    switchToRemotePlayback()
  }

  func sessionManager(_: GCKSessionManager, didResumeSession session: GCKSession) {
    print("MediaViewController: sessionManager didResumeSession \(session)")
    setQueueButtonVisible(true)
    switchToRemotePlayback()
  }

  func sessionManager(_: GCKSessionManager, didEnd _: GCKSession, withError error: Error?) {
    print("session ended with error: \(String(describing: error))")
    let message = "The Casting session has ended.\n\(String(describing: error))"
    if let window = appDelegate?.window {
      Toast.displayMessage(message, for: 3, in: window)
    }
    setQueueButtonVisible(false)
    switchToLocalPlayback()
  }

  func sessionManager(_: GCKSessionManager, didFailToStartSessionWithError error: Error?) {
    if let error = error {
      showAlert(withTitle: "Failed to start a session", message: error.localizedDescription)
    }
    setQueueButtonVisible(false)
  }

  func sessionManager(_: GCKSessionManager,
                      didFailToResumeSession _: GCKSession, withError _: Error?) {
    if let window = UIApplication.shared.delegate?.window {
      Toast.displayMessage("The Casting session could not be resumed.",
                           for: 3, in: window)
    }
    setQueueButtonVisible(false)
    switchToLocalPlayback()
  }

  ...
}

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

বর্তমানে সক্রিয় সেশনটি GCKCastContext.sharedInstance().sessionManager.currentCastSession হিসাবে অ্যাক্সেসযোগ্য। Cast ডায়ালগ থেকে ব্যবহারকারীর অঙ্গভঙ্গির প্রতিক্রিয়ায় সেশনগুলি স্বয়ংক্রিয়ভাবে তৈরি এবং ভেঙে ফেলা হয়।

মিডিয়া লোড হচ্ছে

Cast SDK-তে, GCKRemoteMediaClient রিসিভারে রিমোট মিডিয়া প্লেব্যাক পরিচালনা করার জন্য সুবিধাজনক API-এর একটি সেট প্রদান করে। মিডিয়া প্লেব্যাক সমর্থন করে এমন একটি GCKCastSession জন্য, SDK দ্বারা স্বয়ংক্রিয়ভাবে GCKRemoteMediaClient এর একটি ইনস্ট্যান্স তৈরি করা হবে। এটি GCKCastSession ইনস্ট্যান্সের remoteMediaClient সম্পত্তি হিসাবে অ্যাক্সেস করা যেতে পারে।

নির্বাচিত ভিডিওটি রিসিভারে লোড করতে MediaViewController.swift এ নিম্নলিখিত কোডটি যোগ করুন:

@objc(MediaViewController)
class MediaViewController: UIViewController, GCKSessionManagerListener,
  GCKRemoteMediaClientListener, LocalPlayerViewDelegate, GCKRequestDelegate {
  ...

  @objc func playSelectedItemRemotely() {
    loadSelectedItem(byAppending: false)
  }

  /**
   * Loads the currently selected item in the current cast media session.
   * @param appending If YES, the item is appended to the current queue if there
   * is one. If NO, or if
   * there is no queue, a new queue containing only the selected item is created.
   */
  func loadSelectedItem(byAppending appending: Bool) {
    print("enqueue item \(String(describing: mediaInfo))")
    if let remoteMediaClient = sessionManager.currentCastSession?.remoteMediaClient {
      let mediaQueueItemBuilder = GCKMediaQueueItemBuilder()
      mediaQueueItemBuilder.mediaInformation = mediaInfo
      mediaQueueItemBuilder.autoplay = true
      mediaQueueItemBuilder.preloadTime = TimeInterval(UserDefaults.standard.integer(forKey: kPrefPreloadTime))
      let mediaQueueItem = mediaQueueItemBuilder.build()
      if appending {
        let request = remoteMediaClient.queueInsert(mediaQueueItem, beforeItemWithID: kGCKMediaQueueInvalidItemID)
        request.delegate = self
      } else {
        let queueDataBuilder = GCKMediaQueueDataBuilder(queueType: .generic)
        queueDataBuilder.items = [mediaQueueItem]
        queueDataBuilder.repeatMode = remoteMediaClient.mediaStatus?.queueRepeatMode ?? .off

        let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder()
        mediaLoadRequestDataBuilder.mediaInformation = mediaInfo
        mediaLoadRequestDataBuilder.queueData = queueDataBuilder.build()

        let request = remoteMediaClient.loadMedia(with: mediaLoadRequestDataBuilder.build())
        request.delegate = self
      }
    }
  }
  ...
}

এখন রিমোট প্লেব্যাক সমর্থন করার জন্য কাস্ট সেশন লজিক ব্যবহার করার জন্য বিভিন্ন বিদ্যমান পদ্ধতি আপডেট করুন:

required init?(coder: NSCoder) {
  super.init(coder: coder)
  ...
  castMediaController = GCKUIMediaController()
  ...
}

func switchToLocalPlayback() {
  print("switchToLocalPlayback")
  if playbackMode == .local {
    return
  }
  setQueueButtonVisible(false)
  var playPosition: TimeInterval = 0
  var paused: Bool = false
  var ended: Bool = false
  if playbackMode == .remote {
    playPosition = castMediaController.lastKnownStreamPosition
    paused = (castMediaController.lastKnownPlayerState == .paused)
    ended = (castMediaController.lastKnownPlayerState == .idle)
    print("last player state: \(castMediaController.lastKnownPlayerState), ended: \(ended)")
  }
  populateMediaInfo((!paused && !ended), playPosition: playPosition)
  sessionManager.currentCastSession?.remoteMediaClient?.remove(self)
  playbackMode = .local
}

func switchToRemotePlayback() {
  print("switchToRemotePlayback; mediaInfo is \(String(describing: mediaInfo))")
  if playbackMode == .remote {
    return
  }
  // If we were playing locally, load the local media on the remote player
  if playbackMode == .local, (_localPlayerView.playerState != .stopped), (mediaInfo != nil) {
    print("loading media: \(String(describing: mediaInfo))")
    let paused: Bool = (_localPlayerView.playerState == .paused)
    let mediaQueueItemBuilder = GCKMediaQueueItemBuilder()
    mediaQueueItemBuilder.mediaInformation = mediaInfo
    mediaQueueItemBuilder.autoplay = !paused
    mediaQueueItemBuilder.preloadTime = TimeInterval(UserDefaults.standard.integer(forKey: kPrefPreloadTime))
    mediaQueueItemBuilder.startTime = _localPlayerView.streamPosition ?? 0
    let mediaQueueItem = mediaQueueItemBuilder.build()

    let queueDataBuilder = GCKMediaQueueDataBuilder(queueType: .generic)
    queueDataBuilder.items = [mediaQueueItem]
    queueDataBuilder.repeatMode = .off

    let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder()
    mediaLoadRequestDataBuilder.queueData = queueDataBuilder.build()

    let request = sessionManager.currentCastSession?.remoteMediaClient?.loadMedia(with: mediaLoadRequestDataBuilder.build())
    request?.delegate = self
  }
  _localPlayerView.stop()
  _localPlayerView.showSplashScreen()
  setQueueButtonVisible(true)
  sessionManager.currentCastSession?.remoteMediaClient?.add(self)
  playbackMode = .remote
}

/* Play has been pressed in the LocalPlayerView. */
func continueAfterPlayButtonClicked() -> Bool {
  let hasConnectedCastSession = sessionManager.hasConnectedCastSession
  if mediaInfo != nil, hasConnectedCastSession() {
    // Display an alert box to allow the user to add to queue or play
    // immediately.
    if actionSheet == nil {
      actionSheet = ActionSheet(title: "Play Item", message: "Select an action", cancelButtonText: "Cancel")
      actionSheet?.addAction(withTitle: "Play Now", target: self,
                             selector: #selector(playSelectedItemRemotely))
    }
    actionSheet?.present(in: self, sourceView: _localPlayerView)
    return false
  }
  return true
}

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

৭. মিনি কন্ট্রোলার

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

মিনি কন্ট্রোলারের উপর ফোকাস করে CastVideos অ্যাপ চালানো একটি iPhone এর নীচের অংশের চিত্রণ

কাস্ট SDK একটি কন্ট্রোল বার প্রদান করে, GCKUIMiniMediaControlsViewController , যা আপনি যে দৃশ্যগুলিতে স্থায়ী নিয়ন্ত্রণগুলি দেখাতে চান সেখানে যোগ করা যেতে পারে।

নমুনা অ্যাপের জন্য, আমরা GCKUICastContainerViewController ব্যবহার করব যা অন্য একটি ভিউ কন্ট্রোলারকে মোড়ানো হবে এবং নীচে একটি GCKUIMiniMediaControlsViewController যোগ করবে।

AppDelegate.swift ফাইলটি পরিবর্তন করুন এবং নিম্নলিখিত পদ্ধতিতে if useCastContainerViewController শর্তের জন্য নিম্নলিখিত কোডটি যুক্ত করুন:

func application(_: UIApplication,
                 didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  ...
  let appStoryboard = UIStoryboard(name: "Main", bundle: nil)
  guard let navigationController = appStoryboard.instantiateViewController(withIdentifier: "MainNavigation")
    as? UINavigationController else { return false }
  let castContainerVC = GCKCastContext.sharedInstance().createCastContainerController(for: navigationController)
    as GCKUICastContainerViewController
  castContainerVC.miniMediaControlsItemEnabled = true
  window = UIWindow(frame: UIScreen.main.bounds)
  window?.rootViewController = castContainerVC
  window?.makeKeyAndVisible()
  ...
}

মিনি কন্ট্রোলারের দৃশ্যমানতা নিয়ন্ত্রণ করতে এই বৈশিষ্ট্য এবং সেটার/গেটার যোগ করুন (আমরা পরবর্তী বিভাগে এগুলি ব্যবহার করব):

var isCastControlBarsEnabled: Bool {
    get {
      if useCastContainerViewController {
        let castContainerVC = (window?.rootViewController as? GCKUICastContainerViewController)
        return castContainerVC!.miniMediaControlsItemEnabled
      } else {
        let rootContainerVC = (window?.rootViewController as? RootContainerViewController)
        return rootContainerVC!.miniMediaControlsViewEnabled
      }
    }
    set(notificationsEnabled) {
      if useCastContainerViewController {
        var castContainerVC: GCKUICastContainerViewController?
        castContainerVC = (window?.rootViewController as? GCKUICastContainerViewController)
        castContainerVC?.miniMediaControlsItemEnabled = notificationsEnabled
      } else {
        var rootContainerVC: RootContainerViewController?
        rootContainerVC = (window?.rootViewController as? RootContainerViewController)
        rootContainerVC?.miniMediaControlsViewEnabled = notificationsEnabled
      }
    }
  }

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

৮. ভূমিকা ওভারলে

গুগল কাস্ট ডিজাইন চেকলিস্টের জন্য একটি প্রেরক অ্যাপের প্রয়োজন যা বিদ্যমান ব্যবহারকারীদের কাছে কাস্ট বোতামটি পরিচয় করিয়ে দেবে যাতে তারা জানতে পারে যে প্রেরক অ্যাপটি এখন কাস্টিং সমর্থন করে এবং গুগল কাস্টে নতুন ব্যবহারকারীদেরও সহায়তা করে।

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

GCKCastContext ক্লাসের একটি পদ্ধতি আছে, presentCastInstructionsViewControllerOnce , যা ব্যবহারকারীদের প্রথম দেখানোর সময় Cast বোতামটি হাইলাইট করতে ব্যবহার করা যেতে পারে। MediaViewController.swift এবং MediaTableViewController.swift এ নিম্নলিখিত কোডটি যোগ করুন:

override func viewDidLoad() {
  ...

  NotificationCenter.default.addObserver(self, selector: #selector(castDeviceDidChange),
                                         name: NSNotification.Name.gckCastStateDidChange,
                                         object: GCKCastContext.sharedInstance())
}

@objc func castDeviceDidChange(_: Notification) {
  if GCKCastContext.sharedInstance().castState != .noDevicesAvailable {
    // You can present the instructions on how to use Google Cast on
    // the first time the user uses you app
    GCKCastContext.sharedInstance().presentCastInstructionsViewControllerOnce(with: castButton)
  }
}

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

9. সম্প্রসারিত নিয়ামক

Google Cast ডিজাইন চেকলিস্টে কাস্ট করা মিডিয়ার জন্য বর্ধিত কন্ট্রোলার প্রদানের জন্য একটি প্রেরক অ্যাপের প্রয়োজন। বর্ধিত কন্ট্রোলার হল মিনি কন্ট্রোলারের একটি পূর্ণ স্ক্রিন সংস্করণ।

CastVideos অ্যাপটি চালানোর সময় একটি iPhone ভিডিও চালাচ্ছে এবং নীচে প্রসারিত কন্ট্রোলারটি দেখাচ্ছে।

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

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

প্রথমে আপনাকে যা করতে হবে তা হল কাস্ট প্রসঙ্গে ডিফল্ট এক্সপেন্ডেড কন্ট্রোলার সক্ষম করা। ডিফল্ট এক্সপেন্ডেড কন্ট্রোলার সক্ষম করতে AppDelegate.swift পরিবর্তন করুন:

import GoogleCast

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  ...

  func application(_: UIApplication,
                   didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    ...
    // Add after the setShareInstanceWith(options) is set.
    GCKCastContext.sharedInstance().useDefaultExpandedMediaControls = true
    ...
  }
  ...
}

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

@objc func playSelectedItemRemotely() {
  ...
  appDelegate?.isCastControlBarsEnabled = false
  GCKCastContext.sharedInstance().presentDefaultExpandedMediaControls()
}

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

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

১০. কাস্ট কানেক্ট সাপোর্ট যোগ করুন

কাস্ট কানেক্ট লাইব্রেরি বিদ্যমান প্রেরক অ্যাপ্লিকেশনগুলিকে কাস্ট প্রোটোকলের মাধ্যমে অ্যান্ড্রয়েড টিভি অ্যাপ্লিকেশনগুলির সাথে যোগাযোগ করার অনুমতি দেয়। কাস্ট কানেক্ট কাস্ট অবকাঠামোর উপরে তৈরি হয়, যেখানে আপনার অ্যান্ড্রয়েড টিভি অ্যাপটি রিসিভার হিসেবে কাজ করে।

নির্ভরতা

আপনার Podfile এ, নিশ্চিত করুন যে google-cast-sdk নীচে তালিকাভুক্ত 4.4.8 বা তার বেশি ভার্সনের দিকে নির্দেশিত। যদি আপনি ফাইলটিতে কোনও পরিবর্তন করে থাকেন, তাহলে আপনার প্রকল্পের সাথে পরিবর্তনটি সিঙ্ক করতে কনসোল থেকে pod update চালান।

pod 'google-cast-sdk', '>=4.4.8'

GCKLaunchOptions সম্পর্কে

Android TV অ্যাপ্লিকেশন, যা Android Receiver নামেও পরিচিত, চালু করার জন্য, আমাদের GCKLaunchOptions অবজেক্টে androidReceiverCompatible ফ্ল্যাগটিকে true তে সেট করতে হবে। এই GCKLaunchOptions অবজেক্টটি নির্দেশ করে যে রিসিভারটি কীভাবে চালু করা হয় এবং GCKCastOptions এ কীভাবে পাস করা হয় যা GCKCastContext.setSharedInstanceWith ব্যবহার করে শেয়ার্ড ইনস্ট্যান্সে সেট করা হয়।

আপনার AppDelegate.swift এ নিম্নলিখিত লাইনগুলি যোগ করুন:

let options = GCKCastOptions(discoveryCriteria:
                          GCKDiscoveryCriteria(applicationID: kReceiverAppID))
...
/** Following code enables CastConnect */
let launchOptions = GCKLaunchOptions()
launchOptions.androidReceiverCompatible = true
options.launchOptions = launchOptions

GCKCastContext.setSharedInstanceWith(options)

লঞ্চ শংসাপত্র সেট করুন

প্রেরকের পাশে, আপনি GCKCredentialsData নির্দিষ্ট করতে পারেন যাতে সেশনে কে যোগ দিচ্ছেন তা বোঝা যায়। credentials হল একটি স্ট্রিং যা ব্যবহারকারী-সংজ্ঞায়িত করা যেতে পারে, যতক্ষণ না আপনার ATV অ্যাপ এটি বুঝতে পারে। GCKCredentialsData শুধুমাত্র লঞ্চ বা যোগদানের সময় আপনার Android TV অ্যাপে পাঠানো হয়। আপনি যদি সংযুক্ত থাকাকালীন এটি আবার সেট করেন, তাহলে এটি আপনার Android TV অ্যাপে পাঠানো হবে না।

লঞ্চ ক্রেডেনশিয়াল সেট করার জন্য GCKCredentialsData GCKLaunchOptions সেট করার পরে যেকোনো সময় সংজ্ঞায়িত করতে হবে। এটি প্রদর্শনের জন্য, সেশন স্থাপনের সময় পাস করার জন্য ক্রেডেনশিয়াল সেট করার জন্য Creds বোতামের জন্য লজিক যোগ করা যাক। আপনার MediaTableViewController.swift এ নিম্নলিখিত কোডটি যোগ করুন:

class MediaTableViewController: UITableViewController, GCKSessionManagerListener, MediaListModelDelegate, GCKRequestDelegate {
  ...
  private var credentials: String? = nil
  ...
  override func viewDidLoad() {
    ...
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Creds", style: .plain,
                                                       target: self, action: #selector(toggleLaunchCreds))
    ...
    setLaunchCreds()
  }
  ...
  @objc func toggleLaunchCreds(_: Any){
    if (credentials == nil) {
        credentials = "{\"userId\":\"id123\"}"
    } else {
        credentials = nil
    }
    Toast.displayMessage("Launch Credentials: "+(credentials ?? "Null"), for: 3, in: appDelegate?.window)
    print("Credentials set: "+(credentials ?? "Null"))
    setLaunchCreds()
  }
  ...
  func setLaunchCreds() {
    GCKCastContext.sharedInstance()
        .setLaunch(GCKCredentialsData(credentials: credentials))
  }
}

লোড অনুরোধে শংসাপত্র সেট করুন

আপনার ওয়েব এবং অ্যান্ড্রয়েড টিভি রিসিভার অ্যাপ উভয়ের ক্ষেত্রেই credentials পরিচালনা করার জন্য, loadSelectedItem ফাংশনের অধীনে আপনার MediaTableViewController.swift ক্লাসে নিম্নলিখিত কোডটি যোগ করুন:

let mediaLoadRequestDataBuilder = GCKMediaLoadRequestDataBuilder()
...
mediaLoadRequestDataBuilder.credentials = credentials
...

আপনার প্রেরক কোন রিসিভার অ্যাপে কাস্ট করছেন তার উপর নির্ভর করে, SDK স্বয়ংক্রিয়ভাবে চলমান সেশনে উপরের শংসাপত্রগুলি প্রয়োগ করবে।

কাস্ট কানেক্ট পরীক্ষা করা হচ্ছে

গুগল টিভির মাধ্যমে Chromecast-এ Android TV APK ইনস্টল করার ধাপ

  1. আপনার অ্যান্ড্রয়েড টিভি ডিভাইসের আইপি ঠিকানা খুঁজুন। সাধারণত, এটি সেটিংস > নেটওয়ার্ক এবং ইন্টারনেট > (আপনার ডিভাইসটি যে নেটওয়ার্কের সাথে সংযুক্ত) এর অধীনে পাওয়া যায়। ডানদিকে এটি নেটওয়ার্কে আপনার ডিভাইসের আইপি এবং বিস্তারিত তথ্য দেখাবে।
  2. টার্মিনাল ব্যবহার করে ADB এর মাধ্যমে আপনার ডিভাইসের সাথে সংযোগ স্থাপনের জন্য IP ঠিকানাটি ব্যবহার করুন:
$ adb connect <device_ip_address>:5555
  1. আপনার টার্মিনাল উইন্ডো থেকে, এই কোডল্যাবের শুরুতে ডাউনলোড করা কোডল্যাব নমুনাগুলির জন্য শীর্ষ স্তরের ফোল্ডারে নেভিগেট করুন। উদাহরণস্বরূপ:
$ cd Desktop/ios_codelab_src
  1. এই ফোল্ডারে থাকা .apk ফাইলটি আপনার Android TV তে ইনস্টল করুন:
$ adb -s <device_ip_address>:5555 install android-tv-app.apk
  1. এখন আপনার অ্যান্ড্রয়েড টিভি ডিভাইসের " ইওর অ্যাপস" মেনুতে "কাস্ট ভিডিও" নামে একটি অ্যাপ দেখতে পাবেন।
  2. একবার হয়ে গেলে, একটি এমুলেটর বা মোবাইল ডিভাইসে অ্যাপটি তৈরি করুন এবং চালান। আপনার অ্যান্ড্রয়েড টিভি ডিভাইসের সাথে একটি কাস্ট সেশন স্থাপন করার পরে, এটি এখন আপনার অ্যান্ড্রয়েড টিভিতে অ্যান্ড্রয়েড রিসিভার অ্যাপ্লিকেশনটি চালু করবে। আপনার iOS মোবাইল সেন্ডার থেকে একটি ভিডিও প্লে করার মাধ্যমে, ভিডিওটি অ্যান্ড্রয়েড রিসিভারে চালু হবে এবং আপনার অ্যান্ড্রয়েড টিভি ডিভাইসের জন্য রিমোট ব্যবহার করে প্লেব্যাক নিয়ন্ত্রণ করতে পারবেন।

১১. কাস্ট উইজেট কাস্টমাইজ করুন

আরম্ভকরণ

App-Done ফোল্ডার দিয়ে শুরু করুন। আপনার AppDelegate.swift ফাইলের applicationDidFinishLaunchingWithOptions পদ্ধতিতে নিম্নলিখিতটি যোগ করুন।

func application(_: UIApplication,
                 didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  ...
  let styler = GCKUIStyle.sharedInstance()
  ...
}

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

styler.apply()

কাস্ট ভিউ কাস্টমাইজ করা

কাস্ট অ্যাপ্লিকেশন ফ্রেমওয়ার্ক যে সমস্ত ভিউ পরিচালনা করে তা আপনি ভিউ জুড়ে ডিফল্ট স্টাইলিং নির্দেশিকা ব্যবহার করে কাস্টমাইজ করতে পারেন। উদাহরণস্বরূপ, আইকনের রঙ পরিবর্তন করা যাক।

styler.castViews.iconTintColor = .lightGray

প্রয়োজনে আপনি প্রতি-স্ক্রিনের ভিত্তিতে ডিফল্ট ওভাররাইড করতে পারেন। উদাহরণস্বরূপ, শুধুমাত্র প্রসারিত মিডিয়া কন্ট্রোলারের জন্য আইকন টিন্ট রঙের জন্য লাইটগ্রে কালার ওভাররাইড করতে।

styler.castViews.mediaControl.expandedController.iconTintColor = .green

রঙ পরিবর্তন

আপনি সমস্ত ভিউয়ের জন্য (অথবা প্রতিটি ভিউয়ের জন্য পৃথকভাবে) ব্যাকগ্রাউন্ড কালার কাস্টমাইজ করতে পারেন। নিম্নলিখিত কোডটি আপনার সমস্ত কাস্ট অ্যাপ্লিকেশন ফ্রেমওয়ার্ক প্রদত্ত ভিউয়ের জন্য ব্যাকগ্রাউন্ড কালার নীল করে।

styler.castViews.backgroundColor = .blue
styler.castViews.mediaControl.miniController.backgroundColor = .yellow

ফন্ট পরিবর্তন করা হচ্ছে

কাস্ট ভিউতে দেখা বিভিন্ন লেবেলের জন্য আপনি ফন্ট কাস্টমাইজ করতে পারেন। চিত্রের উদ্দেশ্যে সমস্ত ফন্ট 'কুরিয়ার-অবলিক' তে সেট করা যাক।

styler.castViews.headingTextFont = UIFont.init(name: "Courier-Oblique", size: 16) ?? UIFont.systemFont(ofSize: 16)
styler.castViews.mediaControl.headingTextFont = UIFont.init(name: "Courier-Oblique", size: 6) ?? UIFont.systemFont(ofSize: 6)

ডিফল্ট বোতামের ছবি পরিবর্তন করা হচ্ছে

প্রকল্পে আপনার নিজস্ব কাস্টম ছবি যোগ করুন, এবং স্টাইল করার জন্য ছবিগুলিকে আপনার বোতামগুলিতে বরাদ্দ করুন।

let muteOnImage = UIImage.init(named: "yourImage.png")
if let muteOnImage = muteOnImage {
  styler.castViews.muteOnImage = muteOnImage
}

কাস্ট বোতাম থিম পরিবর্তন করা হচ্ছে

আপনি UIAppearance প্রোটোকল ব্যবহার করে কাস্ট উইজেট থিম করতে পারেন। নিম্নলিখিত কোডটি GCKUICastButton প্রদর্শিত সমস্ত ভিউতে থিম করে:

GCKUICastButton.appearance().tintColor = UIColor.gray

১২. অভিনন্দন

iOS-এ Cast SDK উইজেট ব্যবহার করে কীভাবে একটি ভিডিও অ্যাপ Cast-সক্ষম করবেন তা এখন আপনি জানেন।

আরও বিস্তারিত জানার জন্য, iOS প্রেরক ডেভেলপার নির্দেশিকা দেখুন।