OCast 2.0.3

OCast 2.0.3

测试已测试
语言语言 SwiftSwift
许可证 Apache-2.0
发布上次发布2020 年 9 月
SPM支持 SPM

Philippe BesombeChristophe AZEMARFrançois Suc 维护。



 
依赖
CocoaAsyncSocket~> 7.6.3
DynamicCodable~> 1.0
Starscream~> 3.1.0
 

OCast 2.0.3

  • Orange

OCast

License

Pod version Build Status

Orange OCast SDK 为实现与 OCast 设备交互的 cast 应用程序提供了所有必要的 API 方法。

Objective-C 和 Swift 应用程序都可以使用 Orange OCast SDK 来使用 OCast 协议定义的 API。但是,需要使用 Swift 才能发送自定义命令的 API。

示例项目旨在演示 Orange OCast SDK 的基本指令集,以帮助您开始。

安装

OCast 可以通过 CocoaPods 获得。要安装它,只需将以下行添加到 Podfile

pod "OCast"

您还可以通过克隆仓库来检索源代码以构建项目

git clone https://github.com/Orange-OpenSource/OCast-iOS.git

以下是向 Swift 应用程序导入框架的方法

import OCast

以下是向 Objective-C 应用程序导入框架的方法

@import OCast;

使用

1. 注册您的设备类型

您必须将您的设备类型注册到制造商的 DeviceCenter。制造商必须与UPNP设备描述响应中的制造商相同。

let deviceCenter = DeviceCenter()
center.registerDevice(ReferenceDevice.self, forManufacturer: "Manufacturer")

2. 发现设备

您需要调用 resumeDiscovery() 方法来启动设备发现。然后,您可以通过设置代理或注册通知来接受 DeviceCenter 的通知。

如果您的网络上找到了设备,将触发 center(_:didAdd:) 方法和 deviceCenterAddDevicesNotification 通知。

如果设备丢失(网络问题或设备已关闭),将触发 center(_:didRemove:) 方法和 deviceCenterRemoveDevicesNotification 通知。

deviceCenter.delegate = self
deviceCenter.resumeDiscovery()

// DeviceCenter delegate methods
func center(_ center: DeviceCenter, didAdd devices: [Device]) {}
func center(_ center: DeviceCenter, didRemove devices: [Device]) {}
func centerDidStop(_ center: DeviceCenter, withError error: Error?) {}

您可以通过调用 stopDiscovery() 方法来停止设备发现。这会触发 centerDidStop(_:withError:) 方法和 deviceCenterDiscoveryStoppedNotification 通知。发现的设备列表将被清理,因此如果您想保留它们,请改为调用 pauseDiscovery()。这有助于管理应用的背景状态。

如果发生网络错误,也会调用 centerDidStop(_:withError:) 方法和 deviceCenterDiscoveryStoppedNotification,但错误参数将填充问题原因。

默认情况下,设备列表每30秒刷新一次。您可以通过设置 discoveryInterval 属性来减少此间隔。当设备列表显示时,您应该这样做;稍后恢复默认值,以避免耗尽手机电池。

3. 连接到设备

要连接到设备并在您自己的应用中使用 OCast 媒体命令,您必须设置设备的 applicationName 属性。一旦您连接到设备,当您发送媒体命令时,应用将自动启动。您也可以手动管理应用状态。请参阅管理应用状态

device.applicationName = "MyWebApp"

如果您要执行安全连接,可以设置具有您自定义设置的 SSLConfiguration 对象。然后,您必须调用 connect(_:completion:) 方法。如果连接成功执行,则不会在错误块中调用完成。因此,您可以向您的设备发送命令。

let sslConfiguration = SSLConfiguration()
// Configure your own SSL Configuration
// ...
//
device.connect(sslConfiguration, completion: { error in
    if (error == nil) {
        // Use the commands
    }
})

您可以使用 disconnect(completion:) 方法从设备断开连接。这有助于管理应用的背景状态。

如果发生网络错误,将触发 deviceDisconnectedEventNotification 通知,并带有问题原因。

4. 发送OCast命令

您可以在设备的Device协议中使用SDK提供的OCast命令。命令列表在此描述:[http://www.ocast.org/OCast-Protocol.pdf](http://www.ocast.org/OCast-Protocol.pdf)

let params = PrepareMediaCommandParams(url: "http://myMovie.mp4",
                                       frequency: 1,
                                       title: "Movie Sample",
                                       subtitle: "OCast",
                                       logo: "",
                                       mediaType: .video,
                                       transferMode: .buffered,
                                       autoPlay: true)
device.prepareMedia(params, completion: { error in })

5. 接收OCast事件

设备可以发送OCast协议中定义的事件。根据事件:会触发以下通知:playbackStatusEventNotificationmetadataChangedEventNotificationupdateStatusEventNotification

// Register to the notification
NotificationCenter.default.addObserver(self, 
                                       selector: #selector(playbackStatusNotification),
                                       name: .playbackStatusEventNotification,
                                       object: device)

// Method triggered for the playback status event
@objc func playbackStatusNotification(_ notification: Notification) {}

6. 发送自定义命令

如果您需要发送OCast协议中未定义的命令,您可以使用send(_:on:completion)方法。您必须为命令和回复构建OCastMessage对象。

public class CustomCommandParams: OCastMessage {
        
    public let myParameter: String
        
    public init(myParameter: String) {
        self.myParameter = myParameter
    }
        
    // ...
}
    
public class CustomReplyParams: OCastMessage {
        
    public let myValue: String
        
    // ...
}

let data = OCastDataLayer(name: "customCommand", params: CustomCommandParams(myParameter: "paramValue"))
let message = OCastApplicationLayer(service: "customService", data: data)
let completionBlock: ResultHandler<CustomReplyParams> = { result, error in
    // result is a CustomReplyParams?
}
device.sender?.send(message, on: .browser, completion: completionBlock)

7. 接收自定义事件

如果您需要接收OCast协议中未定义的事件,您可以使用registerEvent(_:completion)方法。当接收到那个名称的事件时,完成块将被调用。您必须为事件构建一个OCastMessage对象。

public class CustomEvent: OCastMessage {
        
    public let myEventValue: String
        
    // ...
}

device.registerEvent("customEvent", completion: { [weak self] data in
    if let customEvent = try? JSONDecoder().decode(OCastDeviceLayer<CustomEvent>.self, from: data) {
        DispatchQueue.main.async {
            // Update your UI
            self?.myLabel.text = customEvent.message.data.params.myEventValue
        }
    }
})

8. 管理应用状态

您可以手动管理应用状态。startApplication(completion:)方法启动由applicationName属性标识的应用程序,而stopApplication(completion:)方法则停止它。

示例应用

提供Objective-C和Swift示例应用。为了在您的设备上正确运行这些应用,必须设置OCastDemoManufacturerNameOCastDemoApplicationName变量。

作者

Orange

许可

OCast遵循Apache v2许可证。有关更多信息,请参阅LICENSE文件。