Проигрывание звука при получении уведомления работало в dev, но не в производстве - PullRequest
0 голосов
/ 26 апреля 2018

Я хотел воспроизвести звук, когда получаю конкретное уведомление, независимо от того, включен тихий режим или нет.

Я работаю в режиме разработки с платформой AVFoundation. Итак, в методе AppDelegate didFinishLaunchingWithOptions я инициализирую AVAudioSession

NSError *audioSessionError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&audioSessionError];
[[AVAudioSession sharedInstance] setActive:YES error:&audioSessionError];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

if(audioSessionError) {
    NSLog(@"[AppDelegate] audioSessionError: %@", audioSessionError);
}

Я использую метод didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler, чтобы проверить, находится ли приложение в фоновом режиме, а уведомление является уведомлением для воспроизведения звука.

if(application.applicationState == UIApplicationStateBackground) {        
    NSDictionary *aps = [userInfo objectForKey:@"aps"];

    if([[aps valueForKey:@"category"] isEqualToString:@"alarm"]) {
        NSString *path = [NSString stringWithFormat:@"%@/alarm.wav", [[NSBundle mainBundle] resourcePath]];
        NSURL *soundUrl = [NSURL fileURLWithPath:path];

        NSError *audioPlayerError = nil;
        self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:&audioPlayerError];

        if(audioPlayerError) {
            NSLog(@"[AppDelegate] audioPlayerError: %@", audioPlayerError);
        } else {
            NSLog(@"[AppDelegate] audioPlayer play call");
            [self.audioPlayer play];
        }
    }

    completionHandler(UIBackgroundFetchResultNewData);
} else {
    completionHandler(UIBackgroundFetchResultNoData);
}

Ключи в info.plist для фонового режима audio и remote-notification установлены.

Все работало нормально, поэтому я запустил приложение без каких-либо изменений в TestFlight. Когда приложение теперь получает уведомление, отображается предупреждение, но звук не воспроизводится, когда включен бесшумный режим. Поэтому я снова протестировал его в dev и получил те же результаты. Уведомление получено и отображается, но звук не воспроизводится.

Понятия не имею, почему он работал в dev, прежде чем отправлять его в TestFlight, а после него, работает ли он в рабочей среде или в dev. Уведомление принимается каждый раз, только звук больше не воспроизводится.

Кто-нибудь знает, как это произошло?

1 Ответ

0 голосов
/ 03 мая 2018

Итак, я нашел решение для моей проблемы.

В файле AppDelegate.m при инициализации AVAudioSession я изменил строку с

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&audioSessionError]; 

до

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&audioSessionError];

С новой опцией AVAudioSessionCategoryOptionMixWithOthers он работает в разработке и производстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...