iOS ARC中CTCallCenter沒用,無法監聽電話的解決方案

jopen 10年前發布 | 40K 次閱讀 IOS iOS開發 移動開發

嘗試使用CTCallCenter進行電話監聽時,發現一直無法捕獲電話狀態改變的事件,研究了一番之后找到了解決方案,在這里分享給大家。

首先使用CTCallCenter監聽電話的代碼如下:

    CTCallCenter *callCenter = [[CTCallCenter alloc] init];  
    callCenter.callEventHandler = ^(CTCall* call) {  
        if ([call.callState isEqualToString:CTCallStateDisconnected])  
        {  
            NSLog(@"Call has been disconnected");  
        }  
        else if ([call.callState isEqualToString:CTCallStateConnected])  
        {  
            NSLog(@"Call has just been connected");  
        }      
        else if([call.callState isEqualToString:CTCallStateIncoming])  
        {  
            NSLog(@"Call is incoming");  
        }      
        else if ([call.callState isEqualToString:CTCallStateDialing])  
        {  
            NSLog(@"call is dialing");  
        }  
        else  
        {  
            NSLog(@"Nothing is done");  
        }  
    };  

這是網上一段很通用的代碼,而本人這么調用卻無法獲取電話狀態改變的事件,一開始感覺到很奇怪,因為callCenter變量聲明了之后,沒有設置 delegate也沒有設置target,那么是如何監聽的呢?而且更奇怪的是大家都是用這段代碼成功接收到了電話狀態的改變。

于是我猜測,一旦發生電話狀態改變時,系統會自動監測應用程序中是否聲明了CTCallCenter的實例,如果聲明了,就調用其中的回調。那么這就很合理了,由于本人在工程中開啟了ARC,callCenter在聲明之后,一旦離開函數的作用域就被釋放掉了(具體原因可參見ARC的原理)。而在未開啟ARC之前,是不會被釋放掉的。

知道了原因,那么解決方案也很明顯了,將callCenter聲明為成員變量即可。嘗試之后,果不其然,問題解決了。



 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!