CallKit – jak go skonfigurować?

CallKit – jak go skonfigurować?
iOS 10 dostarcza wiele nowych funkcji. Jedną z nich jest CallKit, framework, który pozwala naszej aplikacji na ścisłą integrację z interfejsem użytkownika w telefonie. Aplikacje mogą wykorzystywać CallKit, aby umożliwić użytkownikom odbieranie połączeń przychodzących oraz realizację połączeń wychodzących za pomocą interfejsu użytkownika dostarczanego przez telefon. Połączenie VoIP może zostać wyciszone lub zawieszone. Możliwe jest również prowadzenie wideo połączenia.

Przygotowanie projektu

Pierwszym krokiem jest przygotowanie do odbierania powiadomień VoIP.

Background modes - Voice over IP

Konfiguracja powiadomień VoIP

Aby skonfigurować aplikację do odbierania powiadomień, należy zaimportować framework PushKit do naszego pliku AppDelegate oraz utworzyć obiekt PKPushRegistry. Należy również pamiętać o ustawieniu delegata nowo utworzonego obiektu jako self i ustawieniu jego typu jako VoIP:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
        let pushRegistry = PKPushRegistry(queue: DispatchQueue.main)
        pushRegistry.delegate = self
        pushRegistry.desiredPushTypes = [.voIP]

        return true
    }

Do przechowywania danych uwierzytelniających na serwerze dla aktywnego użytkownika oraz do przetwarzania pushy wykorzystywane są funkcje

func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, forType type: PKPushType) {
            //Store push credentials on server for the active user.
    }

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) {
    }

Obsługa otrzymanych powiadomień

Ostatnim krokiem jest parsowanie danych otrzymanych z funkcji didReceiveIncomingPushWith, która potrafi między innymi wybudzić telefon ze stanu blokady urządzenia.

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) {
        guard type == .voIP else { return }

        if let uuidString = payload.dictionaryPayload["UUID"] as? String,
           let handle = payload.dictionaryPayload["handle"] as? String,
           let hasVideo = payload.dictionaryPayload["hasVideo"] as? Bool,
           let uuid = UUID(uuidString: uuidString)
        {
             // Handle incoming call
        }
}

Konfiguracja CallKit

Pierwszym krokiem jest utworzenie klasy do obsługi połączeń przychodzących poprzez rozszerzenie klasy CXProviderDelegate.

final class ProviderDelegate: NSObject, CXProviderDelegate {
    private let provider: CXProvider
}

Następnym etapem jest konfiguracja dostawcy.

static var providerConfiguration: CXProviderConfiguration {
        let localizedName = NSLocalizedString("APPLICATION_NAME", comment: "name")
        let providerConfiguration = CXProviderConfiguration(localizedName: localizedName)

        providerConfiguration.supportsVideo = true

        providerConfiguration.maximumCallsPerCallGroup = 1

        providerConfiguration.supportedHandleTypes = [.phoneNumber]

        if let iconMaskImage = UIImage(named: "wideo") {
            providerConfiguration.iconTemplateImageData = UIImagePNGRepresentation(iconMaskImage)
        }

        providerConfiguration.ringtoneSound = "Ringtone.caf"

        return providerConfiguration
}

Ostatnim etapem jest dostarczenie inicjalizatora, dodanie funkcji reportIncomingCall odpowiadającej za przekazanie połączenia przychodzącego do systemu oraz dodanie funkcji providerDidReset wywoływanej gdy dostawca zostanie zrestartowany.

init() {
        provider = CXProvider(configuration: type(of: self).providerConfiguration)
        super.init()
        provider.setDelegate(self, queue: nil)
}

func reportIncomingCall(uuid: UUID, handle: String, hasVideo: Bool = false, completion: ((NSError?) -> Void)? = nil) {
        // Construct a CXCallUpdate describing the incoming call, including the caller.
        let update = CXCallUpdate()
        update.remoteHandle = CXHandle(type: .phoneNumber, value: handle)
        update.hasVideo = hasVideo

        // Report the incoming call to the system
        provider.reportNewIncomingCall(with: uuid, update: update) { error in
            completion?(error as? NSError)
        }
}

func providerDidReset(_ provider: CXProvider) {
        print("Provider did reset")
        /*
            End any ongoing calls if the provider resets, and remove them from the app's list of calls,
            since they are no longer valid.
         */
    }

Jest to tylko wstęp i jeśli chcielibyście dowiedzieć się więcej na ten temat, polecam tę stronę. Znajduje się tutaj dużo informacji oraz przykładowa aplikacja.

Dowiedz się więcej

Dynamiczna lokalizacja powiadomień na iOS-a, czyli jak wysyłać wiadomości w różnych językach

Jak ustanowić łącznik pomiędzy użytkownikiem, dostawcą a aplikacją? Wykorzystaj powiadomienia systemowe. Dzięki nim użytkownik szybko otrzymuje najnowsze informacje. To rozwiązanie łatwo zastosujesz w aplikacjach zorientowanych na jeden rynek. Problemy zaczynają się, gdy treści muszą być tworzone w różnych językach. Wtedy pomocą służy dynamiczna lokalizacja zdalnych powiadomień bez wykorzystania własnego serwera.
Przeczytaj

WebSockets na iOS-a – komunikacja w czasie rzeczywistym, która nie spowalnia aplikacji

Kiedy chcesz pobrać dane do aplikacji, zwykle pewnie wykorzystujesz interfejs API RESTful. Wystarczy zapytać serwer o paczkę danych i gotowe. To dobra metoda, jeśli aplikacja nie potrzebuje stałego dostępu do nowych informacji. A co jeśli treści muszą się odświeżać w czasie rzeczywistym? Wtedy opóźnienie może np. uniemożliwiać dokonanie zakupu albo postawienie zakładu sportowego. Na szczęście z pomocą przychodzą WebSockets na iOS-a. Sprawdź, jak je zaimplementować i dlaczego warto to zrobić.
Przeczytaj

Krótko o wyszukiwaniu zawartości aplikacji z Core Spotlight w iOS

Dzisiaj omówię jeden z frameworków dodanych w iOS 9: Core Spotlight. API pozwala na dodanie zawartości do wyszukiwarki spotlight, czyli np. aplikacja służąca do przeglądania filmów może dodać filmy, aktorów, reżyserów oraz pozwala zareagować, jeśli użytkownik wybrał naszą pozycję. Możemy go wtedy przenieść do odpowiedniego miejsca w aplikacji.
Przeczytaj

Wycena projektu

Sprawdź, jak wykorzystujemy naszą wiedzę w praktyce i stwórz z nami swój projekt.

Dlaczego warto rozwijać z nami projekty?

Logo Mobile Trends Awards

Mobile Trends Awards 2017

Nominacja w kategorii
M-COMMERCE

17

opinii klientów

Clutch logo
Logo Legalni bukmacherzy

Nagroda Legalnych Bukmacherów 2019

Najlepsza aplikacja mobilna

60+

zrealizowanych projektów