当应用程序处于后台时,在 iOS appDelegate didReceiveRemoteNotification 中调用 lambda 函数

Posted

技术标签:

【中文标题】当应用程序处于后台时,在 iOS appDelegate didReceiveRemoteNotification 中调用 lambda 函数【英文标题】:invoke lambda function in iOS appDelegate didReceiveRemoteNotification when app is in background 【发布时间】:2018-04-19 01:49:57 【问题描述】:

当我的应用程序在后台时,我试图通过调用 lambda 函数来响应远程推送通知来获取数据。我的通知配置正确,并且在应用处于后台时调用了 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
    )

但是,该块并未在 lambda 函数中执行。我之前没有使用过后台提取,也不知道如何使用 lambda 函数来实现。

【问题讨论】:

【参考方案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
    )

【讨论】:

以上是关于当应用程序处于后台时,在 iOS appDelegate didReceiveRemoteNotification 中调用 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于后台模式时,HealthKit Observer 不工作

如何在应用程序处于后台时执行 Core Data 操作

当应用程序在 iOS 中处于后台时,openURL 不起作用

当应用程序在 iOS 11.4.1 中处于后台时,静默通知不起作用

iOS 8 Beta 6 - 当应用程序处于后台时处理 UILocalNotification

如何在 iOS 中从 AppDelegate 调用视图控制器