当应用程序处于后台时,在 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 不工作
当应用程序在 iOS 中处于后台时,openURL 不起作用
当应用程序在 iOS 11.4.1 中处于后台时,静默通知不起作用