IOS сбой приложения при получении push-уведомления о VoIP после принудительного закрытия - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь заставить работать push-сообщения voip, когда приложение закрыто. Звонки работают и отображаются, когда приложение находится на переднем плане или в фоновом режиме. Но после того, как пользователь принудительно убил приложение, когда уведомление было получено, приложение завершает работу с сигналом 9 (уничтожено пользователем / ios).

Как я могу исправить эту проблему?

В моем приложении включены уведомления о фоновой выборке, voip, audio и pu sh. Также попытался удалить все методы Unity, поместить вызов Callkit в метод PushRegistry, создать нового поставщика при получении уведомления, даже подписаться на событие UIApplicationDidFinishLaunchingNotification, но ничего не получалось. Я сделал это так, чтобы приложение соответствовало показу звонка при получении уведомления voip. Вот мой код:

@objcMembers class CallPlugin: UIResponder, UIApplicationDelegate, PKPushRegistryDelegate, CXProviderDelegate {

static var Instance: CallPlugin!
var provider: CXProvider!
var registry:PKPushRegistry!
var uuid:UUID!
var callController: CXCallController!

//class entry point
public static func registerVoIPPush(_ message: String) {
    Instance = CallPlugin()

    //Pushkit
    Instance.registry = PKPushRegistry(queue: DispatchQueue.main)
    Instance.registry.delegate = Instance
    Instance.registry.desiredPushTypes = [PKPushType.voIP]

    //Callkit
    let providerConfiguration = CXProviderConfiguration(localizedName: "testing")
    providerConfiguration.supportsVideo = true
    providerConfiguration.supportedHandleTypes = [.generic]
    Instance.provider = CXProvider(configuration: providerConfiguration)
    Instance.provider.setDelegate(Instance, queue: nil)        

    UnitySendMessage("ResponseHandler", "LogNative", "registration success")
}

//Get token
func pushRegistry( _ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
    if type == PKPushType.voIP {
        let deviceTokenString = credentials.token.map { String(format: "%02.2hhx", $0) }.joined()
        UnitySendMessage("ResponseHandler", "CredentialsRecieved",deviceTokenString)
    }
}       

//Get notification
func pushRegistry( _ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type:PKPushType, completion: @escaping () -> Void) {

    //UnitySendMessage("ResponseHandler", "LogNative", "Got something push")
    reportInComingCallWith(uuidString: "111", handle: "Paul", isVideo: false)
    completion()
}

//show the call
func reportInComingCallWith(uuidString:String,handle:String,isVideo:Bool) {
    //UnitySendMessage("ResponseHandler", "LogNative", "attempting call")
    let callUpdate = CXCallUpdate()        
    callUpdate.remoteHandle = CXHandle(type: .generic, value: handle)        
    callUpdate.hasVideo = false

    uuid = NSUUID() as UUID

    provider.reportNewIncomingCall(with: uuid as UUID, update: callUpdate){ (error) in
        if let error = error {
            UnitySendMessage("ResponseHandler", "LogNative", "error in starting call"+error.localizedDescription)
        }
    }
}

1 Ответ

0 голосов
/ 13 апреля 2020

Проблема заключалась в том, что мое приложение не создавало объекты делегата и pushregistry во время полной обработки уведомления.

Я решил это, переопределив делегат приложения и поместив инициализации уведомлений в WillFinishLaunching, как итак:

-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions{
   [CallPlugin registerVoIPPush:@"hmm"];
   [super application:application willFinishLaunchingWithOptions:launchOptions];
   return true;
}

Таким образом, все готово для обработки уведомления. Сначала я попытался поместить это в DidFinishLaunching, но было уже слишком поздно для уведомления, и к этому времени IOS убивало мое приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...