2016-03-15 18 views
5

Tôi muốn thử phát hiện các cuộc gọi điện thoại đến trong ứng dụng của mình. Tôi đã tạo một dự án Swift mới từ đầu chỉ để thử một số mã. Điều duy nhất tôi đã được nhập khẩu CoreTelephony trong ViewController mà được tạo ra với tất cả các dự án mới và tôi cũng đã thay đổi viewDidLoad() để:Phát hiện cuộc gọi điện thoại trên iOS với CTCallCenter (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) 

    } 

Tôi cũng đã cố gắng mà không [yếu tự] kể từ khi tôi mới để nhanh chóng và không chắc chắn về những gì nó đòi hỏi.

Khi tôi chạy ứng dụng nhỏ mới của mình qua XCode trên điện thoại, không có gì xảy ra khi nhận cuộc gọi, ngắt kết nối hoặc bất kỳ thứ gì khác. Không có lỗi gì. Tôi có phải làm điều gì đó khác để sử dụng khung công tác CoreTelephony và CTCallCenter không?

Trân Johan

+1

Hãy thử đặt 'callCenter' thành thuộc tính của trình điều khiển chế độ xem của bạn thay vì chỉ một biến trong' viewDidLoad'. –

+0

Cảm ơn bạn rất nhiều, đã làm việc !! –

+0

Bạn có thể giải thích lý do tại sao nó hoạt động với callCenter làm tài sản thay vì một biến? –

Trả lời

1

Đây là một phần mở rộng về nhận xét của tôi ở trên.

Hãy thử tạo callCenter thuộc tính của trình điều khiển chế độ xem thay vì chỉ một biến trong viewDidLoad.

Khi bạn xác định biến trong phương thức, biến và giá trị của biến đó chỉ xuất hiện trong phương thức đó. Khi phương thức chạy xong, giá trị và giá trị của chúng được dọn sạch để chúng không tiếp tục sử dụng bộ nhớ (trừ khi giá trị được sử dụng ở nơi khác).

Trong trường hợp của bạn, bạn xác định callCenter và gán cho trường hợp CTCallCenter mới. Nhưng ở cuối viewDidLoad, phiên bản CTCallCenter không được sử dụng nữa để nó được dọn sạch khỏi bộ nhớ. Vì nó không còn tồn tại, nó không thể xử lý các sự kiện gọi.

Bằng cách thêm callCenter làm thuộc tính cho bộ điều khiển chế độ xem của bạn, nó gắn kết tuổi thọ của phiên bản CTCallCenter với tuổi thọ của bộ điều khiển chế độ xem của bạn. Vì vậy, các CTCallCenter sẽ chỉ được làm sạch từ bộ nhớ khi bộ điều khiển xem được làm sạch từ bộ nhớ.

Để cụ thể hơn, đọc Automatic Reference Counting in Swift

11

callEventHandler đã bị phản đối bắt đầu iOS 10

iOS 10 hiện đang sử dụng một khuôn khổ mới để thực hiện những gì bạn đang cố gắng để làm, CallKit. Đây là khung công tác mới của Apple nên xử lý tất cả các gián đoạn cuộc gọi điện thoại. Để phát hiện các cuộc gọi đến và đi, bạn sử dụng CXCallObserver. Lớp này sử dụng giao thức CXCallObserverDelegate để thông báo cho đại biểu đã đăng ký về thay đổi cuộc gọi. Tôi đã thấy rằng nó hoạt động tốt thiết lập AppDelegate làm đại biểu.

// 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") 
     } 
    } 
} 
Các vấn đề liên quan