Pytanie Wykryto CallStateDisconnected tylko dla połączeń przychodzących, a nie dla połączeń wykonanych z mojej aplikacji


Nie mogę wykryć końca połączenia (stan CallStateDisconnected), jeśli wykonam połączenie z mojej aplikacji. Ale jeśli otrzymam połączenie, gdy moja aplikacja jest aktywna, mogę wykryć ten stan. Otrzymuję również stan CTCallStateDialing dwa lub trzy razy, gdy połączenie rozpoczyna się od mojej aplikacji. Wcześniej pracował pod iOS5, problem ten wystąpił w iOS6.

Moja aplikacja del code;

 self.callCenter = [[CTCallCenter alloc] init];
self.callCenter.callEventHandler = ^(CTCall* call) {

    // anounce that we've had a state change in our call center
    NSDictionary *dict = [NSDictionary dictionaryWithObject:call.callState forKey:@"callState"]; //BREAKPOINT HERE

    [[NSNotificationCenter defaultCenter] postNotificationName:@"CTCallStateDidChange" object:self userInfo:dict]; 

};

Dziwne jest to, że wszystko działa, jeśli wstawię punkt przerwania w bloku CallEventHandler i wznowię wykonywanie po zakończeniu połączenia, wtedy otrzymam poprawnie CallStateDisconnected.

Następnie subskrybuję powiadomienia w moim kontrolerze widoku i wykonuję ten kod po ich otrzymaniu:

- (void)ctCallStateDidChange1:(NSNotification *)notification
 {
  NSString *call = [[notification userInfo] objectForKey:@"callState"];


if ([call isEqualToString:CTCallStateDisconnected])
{
    NSLog(@"Call has been disconnected");

}
else if([call isEqualToString:CTCallStateDialing])
{

    NSLog(@"Call start");
}
else if ([call isEqualToString:CTCallStateConnected])
{
    NSLog(@"Call has just been connected");
}
else if([call isEqualToString:CTCallStateIncoming])
{
    NSLog(@"Call is incoming");
}
else
{
    NSLog(@"None");
}

}

Dzwonię z mojej aplikacji w ten sposób:

        UIWebView *callWebview = [[UIWebView alloc] init];
        [self.view addSubview:callWebview];
        NSURL *telURL = [NSURL URLWithString:number];
        [callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];

Zalogowałem również stan aplikacji i otrzymałem - (void)applicationDidBecomeActive:(UIApplication *)application 

po tym jak zacznę dzwonić, idę do - (void)applicationDidEnterBackground:(UIApplication *)application 

i po zakończeniu połączenia z powrotem do - (void)applicationDidBecomeActive:(UIApplication *)application.

To takie dziwne DidBecomeActive jest wywoływana po wywołaniu i przed przejściem do tła?


12
2017-11-25 17:42


pochodzenie


Nadal działa na iOS 5, właśnie go wypróbowałem i zobaczyłem, że zarówno "call start", jak i "połączenie zostało przerwane". Wszystkie zmiany stanu appDelegate również były sensowne. Nie można go wypróbować na iOS 6 do jutra. - emrys57
Byłbym bardzo pomocny, jeśli mógłbyś wypróbować to na iOS6 jutro. Dzięki - DixieFlatline
Kiedy uruchamiasz go bez punktu przerwania, co jest rejestrowane w porównaniu z punktem przerwania? Wiem, że jeśli czekasz, aż po zakończeniu połączenia, aby wznowić, że jesteś w aplikacji, otrzymuje tylko jedną aktualizację (w tym przypadku połączenie jest rozłączone), w przeciwnym razie otrzymasz je wszystkie. Czy po prostu wielokrotnie otrzymujesz "Call start", nic lub co bez punktu przerwania? Czy jesteś powiadamiany o wszystkim, z wyjątkiem stanu rozłączenia? - Metabble
Tylko "uruchomienie połączenia" jest rejestrowane bez punktu przerwania, a "wywołanie połączenia" i "Połączenie zostało przerwane" z zatrzymanym połączeniem podczas wstrzymanego wykonywania (punkt przerwania). - DixieFlatline


Odpowiedzi:


Oto dziennik z telefonu iOS 5:

2012-12-02 22:00:00.252 TestPhone[2297:707] didFinishLaunchingWithOptions:
2012-12-02 22:00:00.352 TestPhone[2297:707] applicationDidBecomeActive:
2012-12-02 22:00:06.708 TestPhone[2297:707] applicationWillResignActive:
2012-12-02 22:00:10.582 TestPhone[2297:1c03] Call start
2012-12-02 22:00:11.016 TestPhone[2297:707] applicationDidBecomeActive:
2012-12-02 22:00:12.536 TestPhone[2297:707] applicationWillResignActive:
2012-12-02 22:00:12.564 TestPhone[2297:707] applicationDidEnterBackground:
2012-12-02 22:00:36.543 TestPhone[2297:707] applicationWillEnterForeground:
2012-12-02 22:00:36.769 TestPhone[2297:707] applicationDidBecomeActive:
2012-12-02 22:00:36.840 TestPhone[2297:2e07] Call has been disconnected
2012-12-02 22:00:36.854 TestPhone[2297:707] applicationWillResignActive:
2012-12-02 22:00:49.885 TestPhone[2297:707] applicationDidBecomeActive:

a oto dziennik z telefonu iOS 6:

2012-12-03 06:27:55.401 TestPhone[7734:907] didFinishLaunchingWithOptions:
2012-12-03 06:27:55.462 TestPhone[7734:907] applicationDidBecomeActive:
2012-12-03 06:28:01.396 TestPhone[7734:907] applicationWillResignActive:
2012-12-03 06:28:04.345 TestPhone[7734:907] applicationDidBecomeActive:
2012-12-03 06:28:04.401 TestPhone[7734:1803] Call start
2012-12-03 06:28:05.824 TestPhone[7734:907] applicationWillResignActive:
2012-12-03 06:28:05.826 TestPhone[7734:907] applicationDidEnterBackground:
2012-12-03 06:28:17.318 TestPhone[7734:907] applicationWillEnterForeground:
2012-12-03 06:28:17.329 TestPhone[7734:907] applicationDidBecomeActive:

Komunikat "odłączony" właśnie zniknął. (To nie jest odpowiedź, to spostrzeżenie.)

Oto kod, którego użyłem. Stworzyłem aplikację z pojedynczym widokiem w xcode za pomocą jednego przycisku w Xib, i to jest cały mój UIViewController:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.callCenter = [[CTCallCenter alloc] init];
    self.callCenter.callEventHandler = ^(CTCall* myCall) {
        NSString *call = myCall.callState;
        if ([call isEqualToString:CTCallStateDisconnected])
            NSLog(@"Call has been disconnected");
        else if([call isEqualToString:CTCallStateDialing]) 
            NSLog(@"Call start");
        else if ([call isEqualToString:CTCallStateConnected])
            NSLog(@"Call has just been connected");
        else if([call isEqualToString:CTCallStateIncoming])
            NSLog(@"Call is incoming");
        else
            NSLog(@"None");
    };
}

- (IBAction)callButtonPressed:(id)sender {
    NSString *number = @"tel:01234567890";
    UIWebView *callWebview = [[UIWebView alloc] init];
    callWebview.frame = self.view.frame;    
    [self.view addSubview:callWebview];
    NSURL *telURL = [NSURL URLWithString:number];
    [callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
}
@end

6
2017-12-03 06:31



a wiadomość o 22: 00: 36.854 została wywołana, gdy telefon wyświetlił okno "Twój pozostały kredyt to ...". - emrys57
Dziękuję za obserwację. Mój telefon ios6 zachowuje się tak samo. Czy to jest błąd iOS6 i czy należy go zgłosić Apple? - DixieFlatline
Tak, to nie wydaje się być słuszne. Dodałem mój wariant kodu do mojej odpowiedzi. Jeśli to pomoże, prosimy o przesłanie go do firmy Apple. - emrys57
Raport wysłany do Apple. - DixieFlatline
@DixieFlatline, czy otrzymałeś jakąś odpowiedź? - Gal