แคสต์แอป iOS

1. ภาพรวม

โลโก้ Google Cast

Codelab นี้จะสอนวิธีแก้ไขแอปวิดีโอ iOS ที่มีอยู่เพื่อแคสต์เนื้อหาบนอุปกรณ์ที่พร้อมใช้งาน Google Cast

Google Cast คืออะไร

Google Cast ช่วยให้ผู้ใช้แคสต์เนื้อหาจากอุปกรณ์เคลื่อนที่ไปยัง TV ได้ จากนั้นผู้ใช้จะใช้อุปกรณ์เคลื่อนที่เป็นรีโมตคอนโทรลในการเล่นสื่อบนทีวีได้

Google Cast SDK ช่วยให้คุณขยายแอปไปยังอุปกรณ์ที่รองรับ Google Cast (เช่น ทีวีหรือระบบเสียง) Cast SDK ช่วยให้คุณเพิ่มคอมโพเนนต์ UI ที่จําเป็นได้ตามรายการตรวจสอบการออกแบบ Google Cast

รายการตรวจสอบการออกแบบ Google Cast มีไว้ให้ผู้ใช้ของ Cast ใช้งานได้ง่ายและคาดการณ์ได้ในทุกแพลตฟอร์มที่รองรับ

สิ่งที่เรากําลังจะสร้าง

หลังจากที่คุณทํา Codelab นี้เสร็จแล้ว คุณจะมีแอปวิดีโอ iOS ที่สามารถแคสต์วิดีโอไปยังอุปกรณ์ Google Cast ได้

สิ่งที่คุณจะได้เรียนรู้

  • วิธีเพิ่ม Google Cast SDK ลงในตัวอย่างแอปวิดีโอ
  • วิธีการเพิ่มปุ่ม "แคสต์" เพื่อเลือกอุปกรณ์ Google Cast
  • วิธีเชื่อมต่ออุปกรณ์ Cast และเปิดตัวรับสื่อ
  • วิธีแคสต์วิดีโอ
  • วิธีเพิ่มตัวควบคุม Mini mini ลงในแอป
  • วิธีเพิ่มตัวควบคุมแบบขยาย
  • วิธีแสดงการวางซ้อนที่แนะนํา
  • วิธีปรับแต่งวิดเจ็ตแคสต์
  • วิธีผสานรวม Cast Connect

สิ่งที่ต้องมี

  • Xcode ล่าสุด
  • อุปกรณ์เคลื่อนที่ 1 เครื่องที่ใช้ iOS 9 ขึ้นไป (หรือเครื่องจําลอง Xcode)
  • สายเชื่อมต่อข้อมูล USB เพื่อเชื่อมต่ออุปกรณ์เคลื่อนที่กับคอมพิวเตอร์ที่กําลังพัฒนา (หากใช้อุปกรณ์)
  • อุปกรณ์ Google Cast เช่น Chromecast หรือ Android TV ที่กําหนดค่าด้วยการเข้าถึงอินเทอร์เน็ต
  • ทีวีหรือจอภาพที่มีอินพุต HDMI
  • ต้องมี Chromecast ที่มี Google TV เพื่อทดสอบการผสานรวม Cast Connect แต่ไม่บังคับสําหรับ Codelab ส่วนที่เหลือ หากคุณไม่มี คุณสามารถข้ามขั้นตอนเพิ่มการสนับสนุน Cast Connect ไปที่ด้านล่างของบทแนะนํานี้

ประสบการณ์การใช้งาน

  • คุณจะต้องมีความรู้เกี่ยวกับการพัฒนา iOS มาก่อน
  • และคุณก็คงต้องมีความรู้ก่อนดูทีวีด้วย :)

คุณจะใช้บทแนะนํานี้อย่างไร

อ่านอย่างเดียว อ่านแบบฝึกหัดจนจบ

คุณจะให้คะแนนประสบการณ์ในการสร้างแอป iOS มากน้อยเพียงใด

มือใหม่ ขั้นกลาง เชี่ยวชาญ

คุณจะให้คะแนนประสบการณ์การดูทีวีอย่างไร

ผู้ฝึกหัด ขั้นกลาง ผู้ชํานาญ

2. รับโค้ดตัวอย่าง

คุณสามารถดาวน์โหลดตัวอย่างโค้ดทั้งหมดลงในคอมพิวเตอร์ของคุณได้...

และคลายไฟล์ ZIP ที่ดาวน์โหลด

3. เรียกใช้แอปตัวอย่าง

โลโก้ Apple iOS

ก่อนอื่น เรามาดูว่าแอปตัวอย่างที่สมบูรณ์มีลักษณะเป็นอย่างไร แอปนี้เป็นโปรแกรมเล่นวิดีโอพื้นฐาน ผู้ใช้สามารถเลือกวิดีโอจากรายการ จากนั้นจะสามารถเล่นวิดีโอในเครื่อง หรือแคสต์ไปยังอุปกรณ์ Google Cast ได้

เมื่อดาวน์โหลดโค้ดแล้ว คําแนะนําต่อไปนี้อธิบายวิธีเปิดและเรียกใช้แอปตัวอย่างที่สมบูรณ์ใน Xcode

คำถามที่พบบ่อย

การตั้งค่า CocoaPods

หากต้องการตั้งค่า CocoaPods ไปที่คอนโซลแล้วติดตั้งโดยใช้ Ruby เริ่มต้นที่พร้อมใช้งานใน macOS ดังนี้

sudo gem install cocoapods

หากพบปัญหา โปรดดูเอกสารประกอบอย่างเป็นทางการเพื่อดาวน์โหลดและติดตั้งเครื่องมือจัดการทรัพยากร Dependency

ตั้งค่าโครงการ

  1. ไปที่เทอร์มินัลและไปที่ไดเรกทอรี Codelab
  2. ติดตั้งการอ้างอิงจาก Podfile
cd app-done
pod update
pod install
  1. เปิด Xcode แล้วเลือกเปิดโครงการอื่น...
  2. เลือกไฟล์ CastVideos-ios.xcworkspace จากไดเรกทอรี ไอคอนโฟลเดอร์app-done ในโฟลเดอร์ตัวอย่างโค้ด

เรียกใช้แอป

เลือกเป้าหมายและเครื่องจําลอง แล้วเรียกใช้แอปดังนี้

แถบเครื่องมือเครื่องจําลองแอป XCode

จากนั้นแอปวิดีโอจะปรากฏหลังจากผ่านไป 2-3 วินาที

อย่าลืมคลิก "อนุญาต" เมื่อการแจ้งเตือนปรากฏขึ้นเกี่ยวกับการยอมรับการเชื่อมต่อเครือข่ายขาเข้า ไอคอน Cast จะไม่ปรากฏขึ้นหากไม่ยอมรับตัวเลือกนี้

กล่องโต้ตอบการยืนยันกําลังขอสิทธิ์ยอมรับการเชื่อมต่อเครือข่ายขาเข้า

คลิกปุ่ม "แคสต์" และเลือกอุปกรณ์ Google Cast

เลือกวิดีโอ คลิกปุ่มเล่น

วิดีโอจะเริ่มเล่นในอุปกรณ์ Google Cast

ตัวควบคุมที่ขยายแล้วจะปรากฏขึ้น คุณสามารถใช้ปุ่มเล่น/หยุดชั่วคราวเพื่อควบคุมการเล่นได้

กลับไปยังรายการวิดีโอ

ตัวควบคุมขนาดเล็กจะปรากฏที่ด้านล่างของหน้าจอแล้ว

ภาพ iPhone ที่ใช้แอป CastVideos โดยมีตัวควบคุมขนาดเล็กปรากฏอยู่ด้านล่าง

คลิกปุ่มหยุดชั่วคราวในตัวควบคุมขนาดเล็กเพื่อหยุดวิดีโอชั่วคราวในฝั่งผู้รับ คลิกที่ปุ่มเล่นในตัวควบคุมขนาดเล็กเพื่อเล่นวิดีโอต่อ

คลิกปุ่ม "แคสต์" เพื่อหยุดแคสต์ไปยังอุปกรณ์ Google Cast

4. เตรียมโปรเจ็กต์เริ่มต้น

ภาพ iPhone ที่ใช้แอป CastVideos

เราจําเป็นต้องเพิ่มการสนับสนุนสําหรับ Google Cast ไปยังแอปพลิเคชันเริ่มต้นที่คุณดาวน์โหลด ต่อไปนี้คือคําศัพท์ของ Google Cast ที่เราจะใช้ใน Codelab นี้

  • แอปผู้ส่งทํางานในอุปกรณ์เคลื่อนที่หรือแล็ปท็อป
  • แอปตัวรับจะทํางานบนอุปกรณ์ Google Cast

ตั้งค่าโครงการ

ตอนนี้คุณพร้อมที่จะสร้างโปรเจ็กต์เริ่มต้นด้วย Xcode แล้ว

  1. ไปที่เทอร์มินัลและไปที่ไดเรกทอรี Codelab
  2. ติดตั้งการอ้างอิงจาก Podfile
cd app-start
pod update
pod install
  1. เปิด Xcode แล้วเลือกเปิดโครงการอื่น...
  2. เลือกไฟล์ CastVideos-ios.xcworkspace จากไดเรกทอรี ไอคอนโฟลเดอร์app-start ในโฟลเดอร์ตัวอย่างโค้ด

การออกแบบแอป

แอปจะดึงรายการวิดีโอจากเว็บเซิร์ฟเวอร์ระยะไกลและแสดงรายการสําหรับผู้ใช้ที่จะเรียกดู ผู้ใช้สามารถเลือกวิดีโอเพื่อดูรายละเอียดหรือเล่นวิดีโอในเครื่องบนอุปกรณ์เคลื่อนที่ได้

แอปประกอบด้วยตัวควบคุมมุมมองหลัก 2 ตัว ได้แก่ MediaTableViewController และ MediaViewController.

ตัวควบคุมมุมมองตารางสื่อ

UITableViewController นี้แสดงรายการวิดีโอจากอินสแตนซ์ MediaListModel รายการวิดีโอและข้อมูลเมตาที่เกี่ยวข้องจะโฮสต์บนเซิร์ฟเวอร์ระยะไกลเป็นไฟล์ JSON MediaListModel ดึงข้อมูล JSON นี้ และประมวลผลเพื่อสร้างรายการออบเจ็กต์ MediaItem

วัตถุ MediaItem สร้างโมเดลวิดีโอและข้อมูลเมตาที่เกี่ยวข้อง เช่น ชื่อ คําอธิบาย URL ของรูปภาพ และ URL สําหรับสตรีม

MediaTableViewController จะสร้างอินสแตนซ์ MediaListModel จากนั้นลงทะเบียนตัวเองเป็น MediaListModelDelegate เพื่อรับการแจ้งเตือนเมื่อดาวน์โหลดข้อมูลเมตาของสื่อเพื่อให้โหลดมุมมองตารางได้

ผู้ใช้จะแสดงรายการภาพขนาดย่อของวิดีโอพร้อมคําอธิบายสั้นๆ ของวิดีโอแต่ละรายการ เมื่อเลือกรายการแล้ว ระบบจะส่ง MediaItem ที่เกี่ยวข้องไปยัง MediaViewController

ตัวควบคุม MediaView

ตัวควบคุมมุมมองนี้จะแสดงข้อมูลเมตาเกี่ยวกับวิดีโอที่เฉพาะเจาะจงและช่วยให้ผู้ใช้เล่นวิดีโอบนอุปกรณ์เคลื่อนที่ในเครื่องได้

ตัวควบคุมมุมมองจะเป็นตัวควบคุม LocalPlayerView ตัวควบคุมสื่อบางส่วน และพื้นที่ข้อความเพื่อแสดงคําอธิบายของวิดีโอที่เลือก โปรแกรมเล่นครอบคลุมส่วนบนของหน้าจอ เพื่อให้คําอธิบายของวิดีโออยู่ด้านล่าง โดยผู้ใช้สามารถเล่น/หยุดชั่วคราว หรือเรียกดูการเล่นวิดีโอในเครื่องได้

คำถามที่พบบ่อย

5. การเพิ่มปุ่ม "แคสต์"

ภาพ 3 ใน 3 แรกของ iPhone ที่ใช้แอป CastVideos แสดงปุ่ม "แคสต์" ที่มุมบนขวา

แอปพลิเคชันที่พร้อมใช้งาน Cast จะแสดงปุ่ม "แคสต์" ในตัวควบคุมมุมมองแต่ละรายการ การคลิกปุ่ม "แคสต์" จะแสดงรายการอุปกรณ์แคสต์ที่ผู้ใช้สามารถเลือกได้ หากผู้ใช้เล่นเนื้อหาบนอุปกรณ์เครื่องส่ง การเลือกอุปกรณ์แคสต์จะเริ่มหรือกลับมาเล่นอีกครั้งในอุปกรณ์แคสต์นั้น ผู้ใช้สามารถคลิกปุ่ม "แคสต์" และหยุดแคสต์แอปพลิเคชันไปยังอุปกรณ์แคสต์ได้ทุกเมื่อในระหว่างเซสชันการแคสต์ ผู้ใช้จะต้องสามารถเชื่อมต่อหรือยกเลิกการเชื่อมต่อจากอุปกรณ์ Cast ได้ในขณะที่อยู่ในหน้าจอของแอปพลิเคชันใดก็ตาม ตามที่อธิบายในรายการตรวจสอบการออกแบบ Google Cast

การกำหนดค่า

โครงการเริ่มต้นต้องใช้ทรัพยากร Dependency และตั้งค่า Xcode แบบเดียวกับที่ทําสําหรับแอปตัวอย่างเสร็จสมบูรณ์ กลับไปยังส่วนดังกล่าวและทําตามขั้นตอนเดียวกันเพื่อเพิ่ม GoogleCast.framework ลงในโปรเจ็กต์แอปเริ่มต้น

การเริ่มต้น

เฟรมเวิร์กแคสต์มีออบเจ็กต์ Singleton ทั่วโลก นั่นคือ GCKCastContext ซึ่งจะประสานงานกิจกรรมของเฟรมเวิร์กทั้งหมด ออบเจ็กต์นี้ต้องมีการเริ่มต้นในวงจรแอปพลิเคชัน ซึ่งโดยปกติจะใช้ในเมธอด application(_:didFinishLaunchingWithOptions:) ของการมอบสิทธิ์แอป ดังนั้นการเริ่มเซสชันอัตโนมัติด้วยการรีสตาร์ทแอปพลิเคชันของผู้ส่งจึงจะมีการเรียกใช้อย่างถูกต้อง และเริ่มการสแกนอุปกรณ์ได้

ต้องระบุออบเจ็กต์ GCKCastOptions เมื่อเริ่มต้น GCKCastContext คลาสนี้มีตัวเลือกที่ส่งผลต่อลักษณะการทํางานของเฟรมเวิร์ก สิ่งสําคัญที่สุดคือรหัสแอปพลิเคชันตัวรับสัญญาณ ซึ่งใช้เพื่อกรองผลลัพธ์การค้นหาอุปกรณ์ Cast และเปิดแอปพลิเคชันผู้รับเมื่อเซสชันการแคสต์เริ่มต้น

นอกจากนี้ เมธอด application(_:didFinishLaunchingWithOptions:) ยังเหมาะสําหรับการตั้งค่าการมอบสิทธิ์การบันทึกให้รับข้อความการบันทึกจากเฟรมเวิร์กแคสต์ เครื่องมือเหล่านี้อาจมีประโยชน์สําหรับการแก้ไขข้อบกพร่องและการแก้ปัญหา

ขณะพัฒนาแอปที่พร้อมใช้งาน Cast ของคุณเอง คุณจะต้องลงทะเบียนเป็นนักพัฒนา Cast แล้วรับรหัสแอปพลิเคชันสําหรับแอปของคุณ สําหรับ Codelab นี้ เราจะใช้รหัสแอปตัวอย่าง

เพิ่มโค้ดต่อไปนี้ลงใน AppDelegate.swift เพื่อเริ่มต้น GCKCastContext ด้วยรหัสแอปพลิเคชันจากค่าเริ่มต้นของผู้ใช้ และเพิ่มบันทึกสําหรับเฟรมเวิร์ก 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 SDK มีคอมโพเนนต์ปุ่ม "แคสต์" ชื่อ GCKUICastButton เป็นคลาสย่อย UIButton และสามารถเพิ่มลงในแถบชื่อของแอปพลิเคชันโดยรวมไว้ใน UIBarButtonItem เราต้องเพิ่มปุ่ม "แคสต์" ทั้งใน MediaTableViewController และ MediaViewController

เพิ่มโค้ดต่อไปนี้ลงใน 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)

    ...
  }
  ...
}

ตอนนี้ให้เรียกใช้แอปพลิเคชัน คุณควรจะเห็นปุ่ม Cast ในแถบนําทางของแอป และเมื่อคุณคลิกที่ปุ่มนี้ แอปพลิเคชันจะแสดงรายการอุปกรณ์ Cast ในเครือข่ายภายในของคุณ GCKCastContext จะเป็นผู้จัดการการค้นพบอุปกรณ์โดยอัตโนมัติ เลือกอุปกรณ์ Cast และแอปตัวรับสัญญาณตัวอย่างจะโหลดในอุปกรณ์ Cast คุณสามารถไปยังส่วนต่างๆ ระหว่างกิจกรรมการท่องเว็บและกิจกรรมในเครื่อง และสถานะของปุ่ม "แคสต์" จะซิงค์กันอยู่เสมอ

เรายังไม่ได้รองรับการใช้งานการเล่นสื่อใดๆ เลย คุณจึงยังไม่สามารถเล่นวิดีโอในอุปกรณ์ Cast ได้ คลิกปุ่ม "แคสต์" เพื่อหยุดแคสต์

6. การแคสต์เนื้อหาวิดีโอ

ภาพ iPhone ที่ใช้แอป CastVideos ซึ่งแสดงรายละเอียดเกี่ยวกับวิดีโอแต่ละรายการ ("Tears of Steel") ที่ด้านล่างคือมินิเพลเยอร์

เราจะขยายเวลาแอปตัวอย่างให้เล่นวิดีโอระยะไกลในอุปกรณ์แคสต์ด้วย เราต้องฟังเหตุการณ์ต่างๆ ที่เฟรมเวิร์ก Cast สร้างขึ้น

กําลังแคสต์สื่อ

ในระดับสูง หากต้องการเล่นสื่อในอุปกรณ์ Cast คุณต้องดําเนินการต่อไปนี้

  1. สร้างออบเจ็กต์ GCKMediaInformation จาก Cast SDK ซึ่งสร้างแบบจําลองรายการสื่อ
  2. ผู้ใช้เชื่อมต่อกับอุปกรณ์แคสต์เพื่อเริ่มใช้งานแอปพลิเคชันตัวรับสัญญาณ
  3. โหลดออบเจ็กต์ GCKMediaInformation ลงในตัวรับและเล่นเนื้อหา
  4. ติดตามสถานะสื่อ
  5. ส่งคําสั่งการเล่นไปยังเครื่องรับตามการโต้ตอบของผู้ใช้

ขั้นตอนที่ 1 ในการจับคู่ออบเจ็กต์หนึ่งกับออบเจ็กต์อื่น GCKMediaInformation คือสิ่งที่ Cast SDK เข้าใจและ MediaItem เป็นการรวมของแอปของเราสําหรับรายการสื่อ เราสามารถแมป MediaItem กับ GCKMediaInformation ได้อย่างง่ายดาย เราได้ทําตามขั้นตอนที่ 2 ในส่วนก่อนหน้าเรียบร้อยแล้ว ขั้นตอนที่ 3 ทําได้ง่ายด้วย Cast SDK

ตัวอย่างแอป MediaViewController แยกความแตกต่างระหว่างการเล่นในเครื่องกับการเล่นระยะไกลไปแล้วโดยใช้ Enum นี้

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

private var playbackMode = PlaybackMode.none

การเขียนโค้ดนี้ไม่สําคัญสําหรับคุณที่จะต้องเข้าใจวิธีการทํางานของตรรกะของตัวอย่างโปรแกรมเล่นทั้งหมด คุณจะต้องเข้าใจว่าโปรแกรมเล่นสื่อของแอปจะต้องได้รับการแก้ไขให้ทราบเกี่ยวกับตําแหน่งการเล่น 2 แห่งในลักษณะที่คล้ายกัน

ตอนนี้โปรแกรมเล่นในพื้นที่จะอยู่ในสถานะการเล่นในเครื่องอยู่เสมอ เนื่องจากยังไม่ไม่ทราบสถานะของการแคสต์ เราจําเป็นต้องอัปเดต UI ตามการเปลี่ยนแปลงสถานะที่เกิดขึ้นในกรอบการทํางาน Cast เช่น หากเราเริ่มแคสต์ เราจะต้องหยุดการเล่นในเครื่องและปิดใช้การควบคุมบางรายการ ในทํานองเดียวกัน หากเราหยุดส่งเมื่อเราอยู่ในตัวควบคุมมุมมองนี้ จะต้องสลับไปใช้การเล่นในเครื่อง ในการจัดการว่าเราจําเป็นต้องฟังเหตุการณ์ต่างๆ ที่เฟรมเวิร์ก Cast สร้างขึ้น

การจัดการเซสชันการแคสต์

สําหรับกรอบ "แคสต์" เซสชันแคสต์จะรวมขั้นตอนการเชื่อมต่ออุปกรณ์ การเปิด (หรือการเข้าร่วม) การเชื่อมต่อกับแอปพลิเคชันตัวรับสัญญาณ และการเริ่มต้นช่องควบคุมสื่อตามความเหมาะสม ช่องทางการควบคุมสื่อคือวิธีที่เฟรมเวิร์ก Cast ส่งและรับข้อความจากโปรแกรมเล่นสื่อของผู้รับ

เซสชันการแคสต์จะเริ่มต้นโดยอัตโนมัติเมื่อผู้ใช้เลือกอุปกรณ์จากปุ่ม "แคสต์" และจะหยุดโดยอัตโนมัติเมื่อผู้ใช้ยกเลิกการเชื่อมต่อ เฟรมเวิร์ก "แคสต์" จะเชื่อมต่อเซสชันผู้รับอีกครั้งเนื่องจากปัญหาการเชื่อมต่อโดยอัตโนมัติ

เซสชันการแคสต์ได้รับการจัดการโดย GCKSessionManager ซึ่งสามารถเข้าถึงได้ทาง GCKCastContext.sharedInstance().sessionManager คุณใช้โค้ดเรียกกลับ GCKSessionManagerListener เพื่อตรวจสอบเหตุการณ์ของเซสชันได้ เช่น การสร้าง การระงับ การเริ่มใหม่ และการสิ้นสุด

ก่อนอื่น เราต้องลงทะเบียน Listener เซสชันและเริ่มต้นตัวแปรบางอย่าง:

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 SDK GCKRemoteMediaClient มีชุด API ที่สะดวกสําหรับการจัดการการเล่นสื่อระยะไกลบนตัวรับ สําหรับ GCKCastSession ที่รองรับการเล่นสื่อ SDK จะสร้างอินสแตนซ์ของ GCKRemoteMediaClient โดยอัตโนมัติ คุณสามารถเข้าถึงพร็อพเพอร์ตี้เป็น remoteMediaClient ของอินสแตนซ์ GCKCastSession ได้

เพิ่มโค้ดต่อไปนี้ลงใน 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
}

ตอนนี้ ให้เรียกใช้แอปบนอุปกรณ์เคลื่อนที่ของคุณ เชื่อมต่ออุปกรณ์ Cast และเริ่มเล่นวิดีโอ คุณควรเห็นวิดีโอที่กําลังเล่นในเครื่องรับ

7. ตัวควบคุมขนาดเล็ก

รายการตรวจสอบการออกแบบ Cast กําหนดให้แอปแคสต์ทั้งหมดต้องมีตัวควบคุมขนาดเล็กปรากฏขึ้นเมื่อผู้ใช้ออกจากหน้าเนื้อหาปัจจุบัน ตัวควบคุมขนาดจิ๋วมอบการเข้าถึงทันทีและการช่วยเตือนที่มองเห็นได้ในเซสชันการแคสต์ปัจจุบัน

ภาพส่วนล่างของ iPhone ที่ใช้แอป CastVideos ซึ่งเน้นไปที่ตัวควบคุมขนาดเล็ก

Cast 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
      }
    }
  }

เรียกใช้แอปและส่งวิดีโอ เมื่อการเล่นเริ่มขึ้นบนตัวรับสัญญาณ คุณจะเห็นตัวควบคุมขนาดเล็กปรากฏขึ้นที่ด้านล่างของแต่ละฉาก คุณสามารถควบคุมการเล่นระยะไกลโดยใช้ตัวควบคุมขนาดเล็ก หากคุณไปยังส่วนต่างๆ ระหว่างกิจกรรมการท่องเว็บและกิจกรรมของโปรแกรมเล่นในเครื่อง สถานะตัวควบคุมขนาดเล็กควรซิงค์กับสถานะการเล่นสื่อของผู้รับอยู่เสมอ

8. การวางซ้อนที่แนะนํา

รายการตรวจสอบการออกแบบ Google Cast กําหนดให้แอปผู้ส่งแนะนําปุ่ม "แคสต์" ให้แก่ผู้ใช้ปัจจุบัน เพื่อแจ้งให้ทราบว่าขณะนี้แอปผู้ส่งรองรับการแคสต์แล้วและช่วยผู้ใช้ที่เพิ่งเริ่มต้นใช้งาน Google Cast

ภาพ iPhone ที่ใช้แอป CastVideos ซึ่งมีปุ่ม "แคสต์" วางซ้อนอยู่ ไฮไลต์ปุ่ม "แคสต์" และแสดงข้อความ "แตะเพื่อแคสต์สื่อไปยังทีวีและลําโพง"

GCKCastContext ชั้นเรียนมีเมธอด presentCastInstructionsViewControllerOnce ที่สามารถใช้เพื่อไฮไลต์ปุ่ม "แคสต์" เมื่อแสดงต่อผู้ใช้เป็นครั้งแรก เพิ่มโค้ดต่อไปนี้ลงใน 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 กําหนดให้แอปของผู้ส่งมีตัวควบคุมแบบขยายสําหรับสื่อที่กําลังแคสต์ ตัวควบคุมที่ขยายเป็นเวอร์ชันเต็มหน้าจอของตัวควบคุมขนาดเล็ก

ภาพ iPhone ที่ใช้แอป CastVideos กําลังเล่นวิดีโอที่ตัวควบคุมขยายอยู่ด้านล่าง

ตัวควบคุมที่ขยายแล้วเป็นมุมมองแบบเต็มหน้าจอซึ่งให้คุณควบคุมการเล่นสื่อระยะไกลได้อย่างเต็มรูปแบบ มุมมองนี้ควรอนุญาตให้แอปแคสต์จัดการทุกๆ แง่มุมที่สามารถจัดการได้ของเซสชันการแคสต์ ยกเว้นตัวควบคุมระดับเสียงของผู้รับและวงจรเซสชัน (เชื่อมต่อ/หยุดแคสต์) นอกจากนี้ยังมีข้อมูลสถานะทั้งหมดเกี่ยวกับเซสชันสื่อ (อาร์ตเวิร์ก ชื่อ ชื่อรอง และอื่นๆ)

ฟังก์ชันของมุมมองนี้มีการใช้งานโดยคลาส 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()
}

ตัวควบคุมที่ขยายจะเปิดตัวโดยอัตโนมัติเมื่อผู้ใช้แตะตัวควบคุมขนาดเล็ก

เรียกใช้แอปและส่งวิดีโอ คุณควรเห็นตัวควบคุมที่ขยายแล้ว กลับไปที่รายการวิดีโอและเมื่อคุณคลิกตัวควบคุมขนาดเล็ก ตัวควบคุมที่ขยายแล้วจะโหลดอีกครั้ง

10. เพิ่มการรองรับ Cast Connect

ไลบรารีของ Cast Connect ช่วยให้แอปพลิเคชันของผู้ส่งที่มีอยู่สามารถสื่อสารกับแอปพลิเคชัน Android TV ผ่านโปรโตคอลของ Cast Cast Connect สร้างขึ้นบนโครงสร้างพื้นฐานของ Cast และแอป Android TV ของคุณทําหน้าที่เป็นตัวรับสัญญาณ

การอ้างอิง

ใน Podfile โปรดตรวจสอบว่า google-cast-sdk ชี้ไปยัง 4.4.8 หรือสูงกว่าดังที่แสดงด้านล่าง หากแก้ไขไฟล์ ให้เรียกใช้ pod update จากคอนโซลเพื่อซิงค์การเปลี่ยนแปลงกับโปรเจ็กต์

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

GCKLaunchOptions

ในการเปิดใช้แอปพลิเคชัน Android TV หรือเรียกอีกอย่างว่า Android Receiver เราจําเป็นต้องตั้งค่าสถานะของ androidReceiverCompatible เป็น true ในออบเจ็กต์ GCKLaunchOptions ออบเจ็กต์ 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 แล้ว ในการสาธิตนี้ โปรดเพิ่มตรรกะสําหรับปุ่มสายเพื่อตั้งค่าข้อมูลเข้าสู่ระบบที่จะส่งผ่านเมื่อสร้างเซสชันแล้ว เพิ่มโค้ดต่อไปนี้ลงใน 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 ทั้งในแอปตัวรับสัญญาณเว็บและแอปของ Android ให้เพิ่มโค้ดต่อไปนี้ในชั้นเรียน MediaTableViewController.swift ในฟังก์ชัน loadSelectedItem

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

SDK จะใช้ข้อมูลรับรองข้างต้นกับเซสชันที่ดําเนินอยู่โดยอัตโนมัติ ทั้งนี้ขึ้นอยู่กับแอปของผู้รับที่ผู้ส่งของคุณส่งไป

กําลังทดสอบ Cast Connect

ขั้นตอนการติดตั้ง APK ของ Android TV บน Chromecast ที่มี Google TV

  1. ค้นหาที่อยู่ IP ของอุปกรณ์ Android TV ของคุณ โดยปกติแล้วจะอยู่ในการตั้งค่า > เครือข่ายและอินเทอร์เน็ต > (ชื่อเครือข่ายที่อุปกรณ์ของคุณเชื่อมต่อ) ทางด้านขวาจะแสดงรายละเอียดและ IP ของอุปกรณ์ในเครือข่าย
  2. ใช้ที่อยู่ IP ของอุปกรณ์เพื่อเชื่อมต่อผ่าน ADB โดยใช้เทอร์มินัล
$ adb connect <device_ip_address>:5555
  1. จากหน้าต่างเทอร์มินัล ให้ไปที่โฟลเดอร์ระดับบนสุดของตัวอย่าง Codelab ที่คุณดาวน์โหลดในตอนต้นของ Codelab นี้ เช่น
$ cd Desktop/ios_codelab_src
  1. ติดตั้งไฟล์ .apk ในโฟลเดอร์นี้ไปยัง Android TV โดยเรียกใช้:
$ adb -s <device_ip_address>:5555 install android-tv-app.apk
  1. ขณะนี้คุณควรเห็นแอปใดแอปหนึ่งที่ชื่อแคสต์วิดีโอในเมนูแอปของคุณบนอุปกรณ์ Android TV
  2. เมื่อทําแล้ว ให้สร้างและเรียกใช้แอปในโปรแกรมจําลองหรืออุปกรณ์เคลื่อนที่ เมื่อตั้งค่าเซสชันการแคสต์ด้วยอุปกรณ์ Android TV แล้ว ระบบจะเรียกใช้แอปพลิเคชัน Android Receiver บน Android TV การเล่นวิดีโอจากผู้ส่งบนอุปกรณ์เคลื่อนที่ iOS ควรเปิดวิดีโอในตัวรับสัญญาณ Android และช่วยให้คุณควบคุมการเล่นโดยใช้รีโมตสําหรับอุปกรณ์ Android TV ได้

11. ปรับแต่งวิดเจ็ตแคสต์

การเริ่มต้น

เริ่มด้วยโฟลเดอร์ "เสร็จสิ้นในแอป" เพิ่มโค้ดต่อไปนี้ลงในเมธอด applicationDidFinishLaunchingWithOptions ในไฟล์ AppDelegate.swift

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

เมื่อคุณดําเนินการปรับแต่งอย่างน้อยหนึ่งรายการแล้ว ตามที่ระบุไว้ในส่วนที่เหลือของ Codelab นี้ ให้ใช้รูปแบบโดยเรียกใช้โค้ดด้านล่างนี้

styler.apply()

การปรับแต่งมุมมองแคสต์

คุณสามารถปรับแต่งมุมมองทั้งหมดที่เฟรมเวิร์กแอปพลิเคชัน Cast จัดการได้โดยการกําหนดหลักเกณฑ์การจัดรูปแบบเริ่มต้นในข้อมูลพร็อพเพอร์ตี้ ตัวอย่างเช่น มาเปลี่ยนสีอ่อนของไอคอนกัน

styler.castViews.iconTintColor = .lightGray

คุณลบล้างค่าเริ่มต้นสําหรับแต่ละหน้าจอได้หากจําเป็น ตัวอย่างเช่น หากต้องการลบล้าง lightGrayColor สําหรับสีแต้มของไอคอนเฉพาะสําหรับตัวควบคุมสื่อแบบขยาย

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

การเปลี่ยนสี

คุณสามารถปรับแต่งสีพื้นหลังของมุมมองทั้งหมดได้ (หรือแต่ละมุมมอง) โค้ดต่อไปนี้จะตั้งค่าสีพื้นหลังเป็นมุมมองที่แสดงสําหรับแอปพลิเคชัน Application Cast เฟรมเวิร์กทั้งหมด

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

การเปลี่ยนแบบอักษร

คุณสามารถปรับแต่งแบบอักษรสําหรับป้ายกํากับต่างๆ ที่เห็นภายในมุมมองแคสต์ มาตั้งค่าแบบอักษรทั้งหมดเป็น "Courier-Oblique" ในการสาธิตกัน

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
}

การเปลี่ยนธีมปุ่ม "แคสต์"

นอกจากนี้คุณยังสามารถธีมวิดเจ็ตแคสต์โดยใช้โปรโตคอลลักษณะที่ปรากฏของ UI ได้อีกด้วย โค้ดต่อไปนี้จะแสดงธีม GCKUICastButton ในการแสดงผลทั้งหมดที่ปรากฏอยู่

GCKUICastButton.appearance().tintColor = UIColor.gray

12. ขอแสดงความยินดี

ตอนนี้คุณก็รู้วิธีเปิดใช้แอป "แคสต์วิดีโอ" โดยใช้วิดเจ็ต Cast SDK บน iOS แล้ว

สําหรับรายละเอียดเพิ่มเติม โปรดดูคู่มือนักพัฒนาซอฟต์แวร์ผู้ส่ง iOS