SparkBroadcastExtensionKit 1.4.1

SparkBroadcastExtensionKit 1.4.1

Zhiyu Liu维护。



  • Spark SDK团队

Cisco Spark iOS SDK

CocoaPods Travis CI license

Cisco Spark iOS SDK使得在iOS应用中轻松集成安全的Cisco Spark信息和通话特性变得十分容易。

此SDK用Swift 4编写,并需提供iOS 10或更高版本来使用。

目录

安装

假设您已经有了一个iOS应用项目,例如MySparkApp,以下是将Spark iOS SDK集成到您Xcode项目中使用CocoaPods的步骤:

  1. 安装CocoaPods

    gem install cocoapods
  2. 设置CocoaPods

    pod setup
  3. MySparkApp项目目录中创建一个名为Podfile的新文件,并包含以下内容:

    source 'https://github.com/CocoaPods/Specs.git'
    
    use_frameworks!
    
    target 'MySparkApp' do
      platform :ios, '10.0'
      pod 'SparkSDK'
    end
    
    target 'MySparkAppBroadcastExtension' do
        platform :ios, '11.2'
        pod 'SparkBroadcastExtensionKit'
    end
  4. MySparkApp项目目录中安装Spark iOS SDK

    pod install

用法

要使用SDK,您需要Cisco Spark集成凭据。如果您还没有Cisco Spark账户,请访问开发者Spark创建账户并注册您自己的集成。您的应用需要通过OAuth授权流程来验证现有的Cisco Spark用户,或者对没有Cisco Spark账户的访客用户使用JSON Web Token

有关此SDK的更多信息,请参阅Spark for Developers网站上的iOS SDK区域

示例

以下是如何在您的应用中使用iOS SDK的一些示例。

  1. 使用Spark ID身份验证(基于OAuth)创建Spark实例

    let clientId = "$YOUR_CLIENT_ID"
    let clientSecret = "$YOUR_CLIENT_SECRET"
    let scope = "spark:all"
    let redirectUri = "Sparkdemoapp://response"
    
    let authenticator = OAuthAuthenticator(clientId: clientId, clientSecret: clientSecret, scope: scope, redirectUri: redirectUri)
    let spark = Spark(authenticator: authenticator)
    
    if !authenticator.authorized {
        authenticator.authorize(parentViewController: self) { success in
            if !success {
                print("User not authorized")
            }
        }
    }
  2. 使用访客ID身份验证(基于JWT)创建Spark实例

    let authenticator = JWTAuthenticator()
    let spark = Spark(authenticator: authenticator)
    
    if !authenticator.authorized {
        authenticator.authorizedWith(jwt: myJwt)
    }
  3. 注册设备以发送和接收通话

    spark.phone.register() { error in
        if let error = error {
            // Device not registered, and calls will not be sent or received
        } else {
            // Device registered
        }
    }
  4. 使用Spark服务

    spark.rooms.create(title: "Hello World") { response in
        switch response.result {
        case .success(let room):
            // ...
        case .failure(let error):
            // ...
        }
    }
    
    // ...
    
    spark.memberships.create(roomId: roomId, personEmail: email) { response in
        switch response.result {
        case .success(let membership):
            // ...
        case .failure(let error):
            // ...
        }
    }
    
  5. 发起通话

    spark.phone.dial("[email protected]", option: MediaOption.audioVideo(local: ..., remote: ...)) { ret in
        switch ret {
        case .success(let call):
            call.onConnected = {
                // ...
            }
            call.onDisconnected = { reason in
                // ...
            }
        case .failure(let error):
            // failure
        }
    }
  6. 接收通话

    spark.phone.onIncoming = { call in
        call.answer(option: MediaOption.audioVideo(local: ..., remote: ...)) { error in
        if let error = error {
            // success
        }
        else {
            // failure
        }
    }
  7. 发起房间通话

    spark.phone.dial(roomId, option: MediaOption.audioVideo(local: ..., remote: ...)) { ret in
        switch ret {
        case .success(let call):
            call.onConnected = {
                // ...
            }
            call.onDisconnected = { reason in
                // ...
            }
            call.onCallMembershipChanged = { changed in
                switch changed {
                case .joined(let membership):
                    //
                case .left(let membership):
                    //
                default:
                    //
                }                
            }            
        case .failure(let error):
            // failure
        }
    }
  8. 屏幕共享(仅查看)

    spark.phone.dial("[email protected]", option: MediaOption.audioVideoScreenShare(video: (local: ..., remote: ...))) { ret in
        switch ret {
        case .success(let call):
            call.onConnected = {
                // ...
            }
            call.onDisconnected = { reason in
                // ...
            }
            call.onMediaChanged = { changed in
                switch changed {
                    ...
                case .remoteSendingScreenShare(let sending):
                    call.screenShareRenderView = sending ? view : nil
                }
            }
        case .failure(let error):
            // failure
        }
    }
  9. 发布信息

    spark.messages.post(personEmail: email, text: "Hello there") { response in
        switch response.result {
        case .success(let message):
            // ...
        case .failure(let error):
            // ...
        }
    }
    
  10. 接收信息

    spark.messages.onEvent = { messageEvent in
        switch messageEvent{
        case .messageReceived(let message):
            // ...
            break
        case .messageDeleted(let messageId):
            // ...
            break
        }
    }
    
  11. 屏幕共享(发送)

    第11.1节:在您的容器应用中

    spark.phone.dial("[email protected]", option: MediaOption.audioVideoScreenShare(video: ..., screenShare: ..., applicationGroupIdentifier: "group.your.application.group.identifier"))) { ret in
        switch ret {
        case .success(let call):
            call.oniOSBroadcastingChanged = {
                event in
                if #available(iOS 11.2, *) {
                    switch event {
                    case .extensionConnected :
                        call.startSharing() {
                            error in
                            // ...
                        }
                        break
                    case .extensionDisconnected:
                        call.stopSharing() {
                            error in
                            // ...
                        }
                        break
                    }
                }
            }
            }
        case .failure(let error):
            // failure
        }
    }

    第11.2节:在您的广播上传扩展示例处理程序中

    override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
        // User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
        SparkBroadcastExtension.sharedInstance.start(applicationGroupIdentifier: "group.your.application.group.identifier") {
            error in
            if let sparkError = error {
               // ...
            } else {
                SparkBroadcastExtension.sharedInstance.onError = {
                    error in
                    // ...
                }
                SparkBroadcastExtension.sharedInstance.onStateChange = {
                    state in
                    // state change
                }
            }
        }
    }
    
    override func broadcastFinished() {
        // User has requested to finish the broadcast.
        SparkBroadcastExtension.sharedInstance.finish()
    }
    
    override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
        switch sampleBufferType {
            case RPSampleBufferType.video:
                // Handle video sample buffer
                SparkBroadcastExtension.sharedInstance.handleVideoSampleBuffer(sampleBuffer: sampleBuffer)
                break
            case RPSampleBufferType.audioApp:
                // Handle audio sample buffer for app audio
                break
            case RPSampleBufferType.audioMic:
                // Handle audio sample buffer for mic audio
                break
        }
    }

    第11.3节:获取有关容器应用与广播上传扩展设置应用组的更多技术细节。

升级SDK 1.3.1到1.4.0重大更改

  1. 最小部署目标:8.0 => 10.0
  2. 支持Swift语言版本:3.0 => 4.0
  3. 如果您曾使用过'MediaRenderView',需要添加"import SparkSDK"。
  4. 如果您在使用Storyboard中的'MediaRenderView'类,请将视图的模块设置为'SparkSDK'。

许可证

© 2016-2018 Cisco Systems, Inc.及/或其关联公司。保留所有权利。

有关详细信息,请参阅授权协议