Получение уведомления об окончании телефонного звонка, когда приложение работает в фоновом режиме

#ios #objective-c #background #phone-call #core-telephony

#iOS #objective-c #фон #телефонный звонок #ядро -телефония

Вопрос:

Я знаю, что подобные вопросы задают, но ни один из них не помог.

Мое наблюдение

Есть два случая: 1) Когда приложение запущено и находится на переднем плане, видимое пользователю 2) Пользователь нажимает кнопку «Домой», и приложение перемещается в фоновый режим, не видимый пользователю. В случае 1) когда телефонный звонок приходит и заканчивается, я получаю все события без проблем. В случае 2) Я не получаю никаких событий, но когда пользователь открывает приложение, я получаю все события, которые произошли, когда приложение работало в фоновом режиме.

Мой вопрос

Как я могу заставить свой код работать, даже если приложение работает в фоновом режиме? Или как я могу переместить свое приложение из фонового режима на передний план, когда происходят эти события?

Что я пробовал

Я попытался включить фоновую выборку в фоновых режимах в Info.plist с реализацией -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler . Это не имело никакого эффекта.

Ниже приведен мой код:

AppDelegate.m:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    // some other code above

    self.callCenter = [[CTCallCenter alloc] init];
    [self.callCenter setCallEventHandler:^(CTCall *call)
    {
        UINavigationController *nc = (UINavigationController *) [[(AppDelegate *) [[UIApplication sharedApplication] delegate] window] rootViewController];
        MainViewController *vc = nc.viewControllers[0];
        [vc setCallState:call.callState];
    }
}
  

MainViewController.m

 -(void)setCallState:(NSString *)callStateString
{
    if ([callStateString isEqualToString:CTCallStateConnected])
    {
        NSLog(@"call connected!");
    } else if ([callStateString isEqualToString:CTCallStateDialing])
    {
        NSLog(@"call dialing!");
    } else if ([callStateString isEqualToString:CTCallStateDisconnected])
    {
        NSLog(@"call disconnected!");
    } else if ([callStateString isEqualToString:CTCallStateIncoming])
    {
        NSLog(@"call incoming!");
    } else
    {
        NSLog(@"unknown call state %@", callStateString);
    }
}
  

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

1. вы нашли решение? Если да, можете ли вы опубликовать это?

2. Решения нет, но найден обходной путь. Я воспроизвел файл .mp3, как только запустилось мое приложение. Пока этот звуковой файл включен, я получаю все события.