IOS7 приостанавливает воспроизведение музыки в аудиоплейере на другом контроллере

#objective-c #ios7

#цель-c #ios7

Вопрос:

Как приостановить воспроизведение музыки AVAudioPlayer в другом контроллере, это мой код

AppDelegate.h

 #import <AVFoundation/AVFoundation.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,AVAudioPlayerDelegate>
{
    AVAudioPlayer *audioPlayer1;
}
 

AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSString *music=[[NSBundle mainBundle]pathForResource:@"music" ofType:@"mp3"];
    audioPlayer1=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:music] error:NULL];

    [audioPlayer1 play];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];




    return YES;
}
 

ViewController.h

 #import <AVFoundation/AVFoundation.h>

@interface ViewController : UIViewController
{
    AVAudioPlayer *audioPlayer1;
}
 

ViewController.m

 - (void)remoteControlReceivedWithEvent:(UIEvent *)event
{

    if(event.type == UIEventTypeRemoteControl)
    {
        switch(event.subtype)
        {
            case UIEventSubtypeRemoteControlPause:
                [audioPlayer1 pause];
                break;
            case UIEventSubtypeRemoteControlStop:
                [audioPlayer1 pause];
                break;
            case UIEventSubtypeRemoteControlPlay:
                [audioPlayer1 play];
                break;
            default:
                break;
        }
    }
}
 

но это не сработало. Как я могу исправить или обойти эту проблему?

Ответ №1:

Свойство audioPlayer1 в вашем AppDelegate не указывает на ваш audioPlayer1 в вашем ViewController. Вы можете сделать это следующим образом:

AppDelegate.H

appdelegate

ViewController.M

viewcontroller ( контроллер просмотра)

Редактировать ответ на второй вопрос:

Если CDVStream является другим UIViewController, используйте тот же подход, чтобы указать свойство AppDelegate на ваше свойство CDVStream. Важно понимать, что AppDelegate содержит AudioPlayer, и вы используете свойства в своих ViewControllers для регулирования его поведения с помощью свойства AudioPlayer, которое указывает на него.

Так что делайте это вот так:

  • в вашем CDVStream.M импортируйте AppDelegate #import "AppDelegate.h"
  • также импортируйте фреймворк AVFoundation #import <AVFoundation/AVFoundation.h>
  • добавьте AVAudioPlayerDelegate в интерфейс @interface CDVStream () <AVAudioPlayerDelegate>
  • создание свойства AVAudioPlayer @property (strong, nonatomic)AVAudioPlayer * audioPlayer;
  • в вашем viewDidLoad методе установите свойство AudioPlayer так, чтобы оно указывало на свойство AppDelegate.

Не большой поклонник отдельных фрагментов информации / кода, поэтому приведенный ниже экран содержит все вышеперечисленное:

Аудиопроигрыватель CDVStream

Комментарии:

1. Спасибо, Майкл, что ответил на мои вопросы, но я имею в виду, если AVAudioPlayer воспроизводит CDVStream и управляет AVAudioPlayer в фоновом режиме на ViewController

2. Если CDVStream является UIViewController, то вы не можете сохранить AVAudioPlayer в фоновом режиме. Вам либо нужно создать одноэлементный элемент (например, AppDelegate ), который остается в живых в течение всего срока службы приложений, либо передать свойство AudioPlayer новому ViewController, прежде чем другой будет отклонен, например, через prepareForSegue.

3. Спасибо за это @Michael 1