#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, как только запустилось мое приложение. Пока этот звуковой файл включен, я получаю все события.