Вызывать лямбда-функцию в iOS appDelegate didReceiveRemoteNotification, когда приложение находится в фоновом режиме

Я пытаюсь получить данные, вызывая лямбда-функцию в ответ на удаленное push-уведомление, когда мое приложение находится в фоновом режиме. Мои уведомления настроены правильно и вызывается didReceiveRemoteNotification, когда приложение находится в фоновом режиме.

У меня есть следующий код в этом методе:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    let lambdaInvoker = AWSLambdaInvoker.default()


    lambdaInvoker.invokeFunction("lambdaFunctionName", jsonObject: jsonObject).continueWith(block: {(task:AWSTask<AnyObject>) -> Any? in
        if let error = task.error as NSError? {
            print(task.error!.localizedDescription)
            print(task.error!)
            DispatchQueue.main.async(execute: {
                if (error.domain == AWSLambdaInvokerErrorDomain) && (AWSLambdaInvokerErrorType.functionError == AWSLambdaInvokerErrorType(rawValue: error.code)) {
                    print("Function error: \(String(describing: error.userInfo[AWSLambdaInvokerFunctionErrorKey]))")
                } else {
                    print("Error: \(error)")
                }
            })
            return nil
        }
        // Handle response in task.result
        DispatchQueue.main.async(execute: {
            if let jsonArray = task.result as? NSArray {
                // do stuff
            }
        })
        return nil
    })
}

Однако блок не выполняется в лямбда-функции. Я не использовал фоновую выборку раньше и не уверен, как заставить это работать с лямбда-функцией.

1 ответ

Чего мне не хватало, так это обработчика завершения. После добавления этого код и блок выполняются как ожидалось:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    let lambdaInvoker = AWSLambdaInvoker.default()


    lambdaInvoker.invokeFunction("lambdaFunctionName", jsonObject: jsonObject).continueWith(block: {(task:AWSTask<AnyObject>) -> Any? in
        if let error = task.error as NSError? {
            print(task.error!.localizedDescription)
            print(task.error!)
            DispatchQueue.main.async(execute: {
                if (error.domain == AWSLambdaInvokerErrorDomain) && (AWSLambdaInvokerErrorType.functionError == AWSLambdaInvokerErrorType(rawValue: error.code)) {
                    print("Function error: \(String(describing: error.userInfo[AWSLambdaInvokerFunctionErrorKey]))")
                    completionHandler(UIBackgroundFetchResult.newData)
                } else {
                    print("Error: \(error)")
                    completionHandler(UIBackgroundFetchResult.newData)
                }
            })
            return nil
        }
        // Handle response in task.result
        DispatchQueue.main.async(execute: {
            if let jsonArray = task.result as? NSArray {
                // do stuff
                completionHandler(UIBackgroundFetchResult.newData)
            }
        })

        return nil
    })
}
Другие вопросы по тегам