как воспроизвести фильм в AVPlayerViewController, используя Watch Connectivity в Swift 2.2?

Как я могу заставить это видео воспроизводиться в AVPlayerViewController и изменять громкость, вызванную командами Watch Connectivity, отправленными с моих часов (с быстрым 2.2). Когда я нажимаю «Пуск/Стоп» на своих часах, я не получаю ответа. В моей консоли нет ошибок или сбоев.

 import UIKit
 import AVKit
import AVFoundation
import WatchConnectivity

@UIApplicationMain
 class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {

  var window: UIWindow?

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    var replyValues = Dictionary<String, AnyObject>()

    let viewController = self.window!.rootViewController
        as! AVPlayerViewController
    var player = AVPlayer()
    let url = "https://example.site/sites/default/files/videos/original/video1bunny_0.mp4"
    let playerItem = AVPlayerItem( URL:NSURL( string:url )! )
    player = AVPlayer(playerItem:playerItem)
    player.rate = 1.0;

    switch message["command"] as! String {
    case "start" :
        player.play()
        replyValues["status"] = "Playing"
    case "stop" :
        player.pause()
        replyValues["status"] = "Stopped"
    case "volume" :
        let level = message["level"] as! Float
        //player.adjustVolume(level)
        replyValues["status"] = "Vol = \(level)"
    default:
        break
    }
    replyHandler(replyValues)
}

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {

    if (WCSession.isSupported()) {
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()

        if session.paired != true {
            print("Apple Watch is not paired")
        }

        if session.watchAppInstalled != true {
            print("WatchKit app is not installed")
        }
    } else {
        print("WatchConnectivity is not supported on this device")
    }

    return true

} }

Я пытался адаптировать этот код (в моем ViewController.swift), который успешно воспроизводил mp3 в аудиоплеере. (Я правильно настроил все IBActions и т. д. на часах).

    class ViewController: UIViewController {

var audioSession: AVAudioSession = AVAudioSession.sharedInstance()
var audioPlayer: AVAudioPlayer?

@IBOutlet weak var volumeControl: UISlider!

override func viewDidLoad() {
    super.viewDidLoad()

    var url: NSURL?

    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayback)
        url = NSURL.fileURLWithPath(
            NSBundle.mainBundle().pathForResource("vivaldi",
                ofType: "mp3")!)
    } catch {
        print("AudioSession error")
    }

    do {
        try audioPlayer = AVAudioPlayer(contentsOfURL: url!,
                            fileTypeHint: nil)
        audioPlayer?.prepareToPlay()
        audioPlayer?.volume = 0.1
    } catch let error as NSError {
        print("Error: \(error.description)")
    }
}

person Dimitri T    schedule 14.08.2016    source источник


Ответы (1)


Рабочий пример

Во втором примере, который успешно воспроизводит MP3, вы настроили свойство контроллера представления для AVPlayer и назначили этому свойству новый аудиоплеер. Контроллер представления сохраняет аудиоплеер, и он воспроизводится даже после выхода из кода viewDidLoad:

class ViewController: UIViewController {
    var audioPlayer: AVAudioPlayer?

Неудачный пример

Однако в первом примере, который вы пытаетесь заставить работать, вы используете локальную переменную, которая выходит из области видимости, как только этот блок кода выходит:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    var player = AVPlayer()

Аудиоплеер выпущен и больше не существует.

Вы должны сохранить этот экземпляр аудиоплеера, как в рабочем примере.

person Community    schedule 14.08.2016