2016-03-15 96 views
5

我想嘗試在我的應用程序中檢測來電。我從頭開始創建了一個新的Swift項目,以便嘗試一些代碼。我做的唯一的事情就是在與每一個新項目創建的視圖控制器進口CoreTelephony,我也改變了viewDidLoad中()到:用CTCallCenter檢測iOS上的電話(Swift)

super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let callCenter = CTCallCenter() 
    NSLog("start") 

    callCenter.callEventHandler = {[weak self] (call: CTCall) ->() in 

     self?.label.text = call.callState 
     NSLog("Call state") 
     NSLog(call.callState) 

    } 

我也試過沒有[弱自我]因爲我是新來迅速並不確定它會帶來什麼。

當我通過XCode在手機上運行我的新小應用程序時,如果收到呼叫,斷開連接或其他任何操作,則不會發生任何情況。沒有錯誤是如此之多。爲了使用CoreTelephony框架和CTCallCenter,我還需要做些什麼嗎?

問候 約翰

+1

試着讓'callCenter'成爲你的視圖控制器的一個屬性,而不是'viewDidLoad'中的一個變量。 –

+0

非常感謝,這工作! –

+0

你能解釋一下爲什麼它使用callCenter作爲屬性而不是變量? –

回答

1

這是我的上述評論的延伸。

試着製作callCenter你的視圖控制器的屬性而不僅僅是一個變量viewDidLoad

當您在方法中定義變量時,該變量及其值僅在該方法中存在。當方法完成運行時,有價值的和它們的值被清理,所以它們不會繼續使用內存(除非該值在其他地方使用)。

對於您的情況,您定義了callCenter併爲其指定了一個新的CTCallCenter實例。但在viewDidLoad的末尾,CTCallCenter實例不再使用,因此它從內存中清除。由於它不再存在,它不能處理通話事件。

通過添加callCenter作爲您的視圖控制器的屬性,它將CTCallCenter實例的生命週期與您的視圖控制器的生命週期相關聯。因此,當視圖控制器從內存中清除時,CTCallCenter只會從內存中清除。

有關更多詳細信息,請閱讀Automatic Reference Counting in Swift

11

callEventHandler已棄用開始的iOS 10.

iOS的10現在採用了新的框架來完成你正在嘗試做的,CallKit。這是Apple應該處理所有電話中斷的新框架。要檢測傳入和傳出呼叫,請使用CXCallObserver。該課程使用協議CXCallObserverDelegate通知註冊代表呼叫更改。我發現它可以很好地設置AppDelegate作爲代表。

// AppDelegate 
var callObserver: CXCallObserver! 

// in applicationDidFinishLaunching... 
callObserver = CXCallObserver() 
callObserver.setDelegate(self, queue: nil) // nil queue means main thread 

extension AppDelegate: CXCallObserverDelegate { 
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) { 
     if call.hasEnded == true { 
      print("Disconnected") 
     } 
     if call.isOutgoing == true && call.hasConnected == false { 
      print("Dialing") 
     } 
     if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false { 
      print("Incoming") 
     } 

     if call.hasConnected == true && call.hasEnded == false { 
      print("Connected") 
     } 
    } 
}