2011-01-22 6 views
23

Ho fatto i miei compiti ... sto leggendo qui, i documenti, su Google, sullo stackoverflowing ... ma ancora non ho fortuna a fare il mio sound stick quando l'utente fa andare l'app in secondo piano.Come si avvia AVPlayer mentre l'app è in background?

Cosa ho fatto finora: Aggiunto UIBackgroundModes, audio al file plist.

Prima di questo codice:

radioAudio = [[AVAudioSession alloc] init]; 
[radioAudio setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[radioAudio setActive:YES error:nil]; 

Allora questo:

NSString *radioURL = @"http://xxx.xxx.xxx/radio.m3u"; 
radioPlayer = [[AVPlayer playerWithURL:[NSURL URLWithString:radioURL]] retain]; 

Ma non appena l'utente preme il pulsante di casa, il mio suono muore.

Ho anche trovato questo, ma non ancora aggiunto, perché alcune cose che ho letto dicono che non è necessario;

newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 
    if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid) 
     [[UIApplication sharedApplication] endBackgroundTask: bgTaskId]; 
bgTaskId = newTaskId; 

In questo momento ho idea di dove dovrei andare a fare il mio AVPlayer lasciare la radio cantare mentre l'utente fa altre cose al telefono. Lo sto testando su un iPhone 4 con 4.2. Costruirlo per 4.0.

Qualcuno ha qualche suggerimento su cosa dovrei fare?

+0

vedere la mia risposta in questo Que, troverete la vostra soluzione [Clicca qui per vedere la risposta] [1 ] [1]: http: // stackoverflow.it/questions/15470452/is-it-possible-to-play-video-using-avplayer-in-background –

risposta

40

aveva lo stesso problema, ma ha trovato una soluzione per questo ..

Guardate qui: https://devforums.apple.com/message/395049#395049

Il contenuto del collegamento sopra:


Sostituisci APPNAME con il tuo nome app!

Im su iOS 4.2.1

EDIT: Lavorare con iOS5 + 6 + 7 beta finora

Aggiungi UIBackgroundModes nel APPNAME-Info.plist, con la selezione App riproduce audio

Quindi aggiungere il framework AudioToolBox per i framework di cartelle.

Nella APPNAMEAppDelegate.h aggiuntivo:

#import <AVFoundation/AVFoundation.h> 
#import <AudioToolbox/AudioToolbox.h> 

quindi è simile a questa:

... 
#import <UIKit/UIKit.h> 
#import <AVFoundation/AVFoundation.h> 
#import <AudioToolbox/AudioToolbox.h> 
... 

Nel APPNAMEAppDelegate.m aggiungere la seguente:

// Set AudioSession 
NSError *sessionError = nil; 
[[AVAudioSession sharedInstance] setDelegate:self]; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; 

/* Pick any one of them */ 
// 1. Overriding the output audio route 
//UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
//AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 

// 2. Changing the default output audio route 
UInt32 doChangeDefaultRoute = 1; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); 

nella

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

ma prima che le due linee:

[self.window addSubview:viewController.view]; 
[self.window makeKeyAndVisible]; 

genera il progetto e vedere se ci sono errori, In caso contrario, provare a eseguire il debug sul dispositivo invece di simulatore, può bug su simulatore.

Spero che questo aiuta gli altri con lo stesso problema ..

+2

Grazie Patrick R! ! :) –

+0

Benvenuto :) –

+0

Grazie Patrik R! Lavori! –

10

ho fatto con successo corsa audio in background aggiungendo quanto segue alla mia applicationDidFinishLaunching

// Registers this class as the delegate of the audio session. 
[[AVAudioSession sharedInstance] setDelegate: self];  
// Allow the app sound to continue to play when the screen is locked. 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
+0

Questo non funziona per me, devo aver incasinato le cose in background da qualche altra parte nel codice. L'unica cosa che posso pensare è che ho NSNotificationCenter in esecuzione per controllare diversi stati dell'app. Non faccio nulla con loro, semplicemente leggendo i diversi stati. –

+0

Quello che devo fare, che non ho trovato nulla sulla rete che lo dichiari, è registrare il mio audio su AVAudioSession come attivo, come questo: [[AVAudioSession sharedInstance] setActive: YES error: NULL]; –

+0

Quindi funziona con '[[AVAudioSession sharedInstance] setActive: YES error: NULL];'? Interessante sapere, lo ricorderò per il futuro :) – atomoil

1

di avere un buon esempio di uno sfondo app GPS che riproduce i suoni anche quando in background:

http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5

In questo esempio, è AudioToolbox Usato.

Ho fatto una prova me stesso e funziona: creare un progetto semplice che controlla il palo GPS (location), e ogni x posizione ricevuti, riprodurre un suono utilizzando

AudioServicesPlaySystemSound(soundId);

Quindi se si mette audio come parte del tuo e i suoni verranno riprodotti, anche se l'applicazione non è più in primo piano.

Ho fatto un test del genere e funziona bene!

(non sono riuscito a farlo funzionare con AVPlayer così ho fallbacked a AudioToolbox)

23

AGGIORNAMENTO IOS 11.2 con Swift 4:

Ora, se si utilizza AVPlayer per riprodurre la musica i file dovresti anche configurare MPNowPlayingInfoCenter.default() per mostrare ora le informazioni di gioco sulla schermata di blocco.

Il codice di seguito mostrerà ora i controlli di riproduzione sullo schermo ma non sarà in grado di rispondere a nessun comando.

Se anche voi volete controlli a lavorare si dovrebbe verificare progetto di esempio di Apple qui: https://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322

codice di esempio di Apple copre tutto ma trovo confuso.

Se si desidera riprodurre il suono e mostrare i controlli sulla schermata di blocco, questi passaggi andranno bene.

NOTA IMPORTANTE: Se siete NON utilizzando AVPlayer per riprodurre l'audio. Se si utilizzano librerie di terze parti per generare suoni o riprodurre un file audio, è necessario leggere i commenti all'interno del codice. Inoltre, se si utilizza il simulatore di ios 11.2, non sarà possibile visualizzare alcun controllo sulla schermata di blocco. Dovresti usare un dispositivo per vederlo funzionare.


1- Seleziona progetto -> -> capabilites impostare le modalità background su -> tick Audio, AirPlay e Picture in Picture

ios 11 background audio setting

2- AppDelegate.swift del file dovrebbe essere simile questo:

import UIKit 

import AVFoundation 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate 
{ 

    var window: UIWindow? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    { 
     // Override point for customization after application launch. 

     do 
     { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      try AVAudioSession.sharedInstance().setActive(true) 

     //!! IMPORTANT !! 
     /* 
     If you're using 3rd party libraries to play sound or generate sound you should 
     set sample rate manually here. 
     Otherwise you wont be able to hear any sound when you lock screen 
     */ 
      //try AVAudioSession.sharedInstance().setPreferredSampleRate(4096) 
     } 
     catch 
     { 
      print(error) 
     } 
     // This will enable to show nowplaying controls on lock screen 
     application.beginReceivingRemoteControlEvents() 

     return true 
    } 
} 

3- ViewController.swift dovrebbe assomigliare a questo:

import UIKit 

import AVFoundation 
import MediaPlayer 

class ViewController: UIViewController 
{ 

    var player : AVPlayer = AVPlayer() 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 


     let path = Bundle.main.path(forResource: "music", ofType: "mp3") 
     let url = URL(fileURLWithPath: path!) 

     // !! IMPORTANT !! 
     /* 
      If you are using 3rd party libraries to play sound 
      or generate sound you should always setNowPlayingInfo 
      before you create your player object. 

      right: 
      self.setNowPlayingInfo() 
      let notAVPlayer = SomePlayer() 

      wrong(You won't be able to see any controls on lock screen.): 
      let notAVPlayer = SomePlayer() 
      self.setNowPlayingInfo() 
     */ 

     self.setNowPlayingInfo() 
     self.player = AVPlayer(url: url) 

    } 


    func setNowPlayingInfo() 
    { 
     let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default() 
     var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]() 

     let title = "title" 
     let album = "album" 
     let artworkData = Data() 
     let image = UIImage(data: artworkData) ?? UIImage() 
     let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { (_) -> UIImage in 
      return image 
     }) 

     nowPlayingInfo[MPMediaItemPropertyTitle] = title 
     nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = album 
     nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork 

     nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo 
    } 

    @IBAction func startPlayingButtonPressed(_ sender: Any) 
    { 
     self.player.play() 
    } 

RISPOSTA VECCHIO IOS 8.2:

risposta di Patrick è totalmente ragione.

Ma sarò scrivere quello che faccio per ios 8.2:

aggiungo Info.plist modalità di sfondo richieste di mia app come qui di seguito:

enter image description here

e nel mio AppDelegate.h aggiungere queste importazioni:

#import <AVFoundation/AVFoundation.h> 
#import <AudioToolbox/AudioToolbox.h> 

Poi nel mio AppDelegate.m ho scritto didFinishLaunchingWithOptionsthis applicazione esattamente come di seguito:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

    return YES; 
} 

Ora App mantiene la riproduzione di musica, anche se lo schermo è bloccato :)

+1

soluzione funzionava ma jyfi in Swift e iOS 8.4 Non avevo bisogno di importare AudioToolbox – longbow

+0

più semplice. Grazie! –

3

iOS 9 Swift

Tutto ciò di cui hai bisogno è aggiungere quanto segue al tuo fileFinishLaunchingWithOptions

do { 
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
} catch { 
    //TODO 
}