Vraag Audio wordt afgespeeld terwijl app op achtergrond iOS


Ik heb een app die voornamelijk is gebaseerd op Core Bluetooth. Wanneer er iets specifieks gebeurt, wordt de app gewekt met behulp van Core Bluetooth-achtergrondmodi en wordt een alarm afgevuurd, maar ik kan het alarm niet laten werken wanneer de app niet op de voorgrond staat.

Ik heb een klasse Alarm Singleton die wordt geïnitialiseerd AVAudioPlayer soortgelijk:

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                    pathForResource:soundName
                             ofType:@"caf"]];

self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[self.player prepareToPlay];
self.player.numberOfLoops = -1;
[self.player setVolume:1.0];

NSLog(@"%@", self.player);

Dit is de methode die wordt aangeroepen wanneer mijn alarmcode wordt gebeld:

-(void)startAlert
{
    NSLog(@"%s", __FUNCTION__);

    playing = YES;
    [self.player play];
    NSLog(@"%i", self.player.playing);

    if (vibrate) {
        [self vibratePattern];
    }
}

Wanneer de app op de voorgrond staat, self.player.playing komt terug 1 maar als de app op de achtergrond staat self.player.playing komt terug 0. Waarom zou dit zijn? Alle code wordt gebeld, dus de app is wakker en functioneert. De vibrate werkt perfect en gebruikt AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

Enig idee waarom dit geluid niet zal spelen?

Bedankt


11
2018-04-25 14:03


oorsprong


antwoorden:


Ik heb een app dan ook achtergrondaudio nodig heeft, maar mijn app werkt met de app-achtergrondmodus "Voice over IP" omdat het soms moet opnemen. Ik speel achtergrondaudio en vertel de app singleton. Ik moet audio op achtergrond afspelen:

UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
if([thePlayer play]){
    newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];   
}

EDIT: Je moet bellen [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; voordat je app naar de achtergrond gaat. In mijn app moet je op hetzelfde moment beginnen te spelen, in de jouwe, als de speler op de achtergrond zou zijn gestart, zou je het volgende moeten doen:

- (void)applicationDidEnterBackground:(UIApplication *)application{
  // You should retain newTaskId to check for background tasks and finish them 
  newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];   
}

9
2018-05-01 19:07



Apple heeft een leuke Technisch vraag en antwoord artikel hierover in zijn documentatie (zie ook Achtergrondmuziek afspelen en opnemen).

Ik denk dat het missen van een groot ding is dat je de Audio achtergrondmodus in de Xcode-instellingen: enter image description here

Misschien ook toevoegen [self.player prepareToPlay] in uw waarschuwingsmethode is nuttig.


13
2018-04-28 18:29



Apple docs

Schakel de audio-ondersteuning in vanuit het gedeelte Achtergrondmodi van de Mogelijkheden tabblad

Of schakel deze ondersteuning in door de UIBackgroundModes toets met de audio waarde in uw app's Info.plist het dossier


3
2018-01-15 07:45



Ik neem aan dat je de audio-achtergrondmodus hebt opgegeven voor de app. Toch weet ik niet zeker of je een audiosessie kunt instellen om actief te zijn terwijl je op de achtergrond bent. Je moet het geactiveerd hebben voordat je naar de achtergrond gaat. Mogelijk moet u ook een stille audio afspelen om dit actief te houden, maar dit lijkt een slechte oefening (hierdoor kan de batterij leegraken). Kijkend naar de documentatie voor meldingen lijkt er een manier te zijn om een ​​lokale melding een audiomonster te laten afspelen dat is opgenomen in je bundel, wat lijkt te zijn wat je wilt doen, dus misschien is dat de manier om te gaan.


2
2018-04-27 15:47



Probeer dit :

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

link

Probeer dit http://www.sagorin.org/ios-playing-audio-in-background-audio/


1
2018-05-04 14:59



U moet uw app inschakelen om onderbrekingen in de audiosessie (en beëindigde onderbrekingen) op de achtergrond af te handelen. Apps verwerken audio-onderbrekingen via meldingscentrum:

  1. Registreer uw app eerst bij het meldingscentrum:

    - (void) registerForMediaPlayerNotifications {
    
        [notificationCenter addObserver : self
                                selector: @selector (handle_iPodLibraryChanged:)
                                    name: MPMediaLibraryDidChangeNotification
                                  object: musicPlayer];
    
        [[MPMediaLibrary defaultMediaLibrary] beginGeneratingLibraryChangeNotifications];
    
    }
    
  2. Sla nu de status van de speler op wanneer de onderbreking begint:

    - (void) audioPlayerBeginInterruption: player {
    
        NSLog (@"Interrupted. The system has paused audio playback.");
    
        if (playing) {
            playing = NO;
            interruptedOnPlayback = YES;
        }
    }
    
  3. En heractiveer de audiosessie en hervat het afspelen wanneer de onderbreking eindigt:

    -(void) audioPlayerEndInterruption: player {
    
        NSLog (@"Interruption ended. Resuming audio playback.");
    
        [[AVAudioSession sharedInstance] setActive: YES error: nil];
    
        if (interruptedOnPlayback) {
            [appSoundPlayer prepareToPlay];
            [appSoundPlayer play];
            playing = YES;
            interruptedOnPlayback = NO;
        }
    }
    

Hier is Apple's voorbeeldcode met volledige implementatie van wat u probeert te bereiken:

https://developer.apple.com/library/ios/samplecode/AddMusic/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008845


1
2018-04-30 22:25



Ik kreeg ook hetzelfde probleem, maar ik keek er alleen naar tijdens de eerste keer dat ik een geluid probeerde te spelen terwijl de app op de achtergrond stond, zodra de app op de voorgrond komt en ik speel het geluid eenmaal af dan werkt het ook in de achtergrond .

Dus zodra de app is gestart / inloggen is geslaagd in mijn geval, draaide ik deze code:

[self startRingcall];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self stopRingcall];
    });
- (void)startRingcall
{
    if( self.audioPlayer )
        [self.audioPlayer stop];
    NSURL* musicFile = [NSURL fileURLWithPath:[[[UILayer sharedInstance] getResourceBundle] pathForResource:@"meetcalling" ofType:@"caf"]];
    NSError *error;
    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:&error];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
    if (error != nil) {
        NSLog(@"meetringer sound error -> %@",error.localizedDescription);
    }
    self.audioPlayer.volume = 0;
    [self.audioPlayer play];
    self.audioPlayer.numberOfLoops = 1;
}

- (void)stopRingcall
{
    if( self.audioPlayer )
        [self.audioPlayer stop];
    self.audioPlayer = nil;
}

0
2017-08-02 05:12