ios13 Urban Airship后台推送失败
ios 13 Urban Airship background push fails
为了尝试从右脚开始,我整个上午都在搜索 SO 和其他资源来解决这个问题。
我有一个应用程序可以与无声前台推送通知以及标准推送通知完美配合。能力设置如下
触发通知的JSON如下
{"device_types":["android","ios"],"notification":{"ios":{"extra":{"requests":{"directives":{"forceUpdate":1}}},"content-available":1}},"audience":{"tag":"userDevice=60218"}}
我已将 PushHandler 委托减少到最低限度以进行测试,来自 UA 示例:
-(void)receivedBackgroundNotification:(UANotificationContent *)notificationContent completionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// Application received a background notification
UA_LDEBUG(@"The application received a background notification");
// Call the completion handler
completionHandler(UIBackgroundFetchResultNoData);
}
-(void)receivedForegroundNotification:(UANotificationContent *)notificationContent completionHandler:(void (^)(void))completionHandler {
UA_LDEBUG(@"The application received a foreground notification %@",notificationContent);
completionHandler();
}
-(void)receivedNotificationResponse:(UANotificationResponse *)notificationResponse completionHandler:(void (^)(void))completionHandler {
UANotificationContent *notificationContent = notificationResponse.notificationContent;
NSLog(@"Received a notification response");
NSLog(@"Alert Title: %@",notificationContent.alertTitle);
NSLog(@"Alert Body: %@",notificationContent.alertBody);
NSLog(@"Action Identifier: %@",notificationResponse.actionIdentifier);
NSLog(@"Category Identifier: %@",notificationContent.categoryIdentifier);
NSLog(@"Response Text: %@",notificationResponse.responseText);
completionHandler();
}
- (UNNotificationPresentationOptions)extendPresentationOptions:(UNNotificationPresentationOptions)options notification:(UNNotification *)notification {
return options | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert;
}
我还查看了设备控制台(查找 x.y.z 作为标识符),我看到了这个:
default 09:48:34.413032 +0200 apsd <private> _notifyForIncomingMessage <private> with guid <private>
default 09:48:34.414156 +0200 apsd Dispatching low priority message on server: <private>
default 09:48:34.414656 +0200 SpringBoard <private> Delivering message from apsd: <private> 3373312264 <private>
default 09:48:34.414772 +0200 SpringBoard <private> responding with an ack for message with guid <private>
default 09:48:34.414816 +0200 SpringBoard <private> making delegate (<private>) calls to deliver message 3373312264 <private> for topic <private>
default 09:48:34.414842 +0200 SpringBoard <private> calling <private> connection:didReceiveIncomingMessage:
default 09:48:34.415254 +0200 SpringBoard <private> returned from <private> connection:didReceiveIncomingMessage:
default 09:48:34.415401 +0200 SpringBoard Received incoming message on topic x.y.z at priority 1
default 09:48:34.416402 +0200 apsd Looking up connection on peer: 3be332c0 found <private>
default 09:48:34.416460 +0200 apsd <private> informed that <private> acknowledges incoming message with guid <private> tracingUUID (null)
default 09:48:34.417113 +0200 apsd APSMessageStore - APSIncomingMessageRecordDeleteMessageForGUID <private>
default 09:48:34.418199 +0200 SpringBoard [x.y.z] Received remote notification request BBC2-437A [ hasAlertContent: 0, hasSound: 0 hasBadge: 0 hasContentAvailable: 1 hasMutableContent: 0 pushType: Background]
default 09:48:34.418312 +0200 SpringBoard [x.y.z] Deliver push notification BBC2-437A
default 09:48:34.418372 +0200 SpringBoard [x.y.z] Request DUET delivers content-available push notification to application
default 09:48:34.418476 +0200 SpringBoard SUBMITTING: <private>
default 09:48:34.419185 +0200 dasd Submitted Activity: com.apple.pushLaunch.x.y.z:FF3864 at priority 5 <private>
default 09:48:34.419315 +0200 dasd <private> was in pre-running. Removing due to submission of <private>
default 09:48:34.425019 +0200 dasd Adding a launch request (<private>) for application <private> by activity <private>
default 09:48:34.425069 +0200 dasd Launch requests for <private>: <private>
default 09:48:34.425219 +0200 dasd Daemon Canceling Activities: {(
com.apple.pushLaunch.x.y.z:3B7016
)}
default 09:48:34.425282 +0200 dasd CANCELED: com.apple.pushLaunch.x.y.z:3B7016 at priority 5 <private>!
default 09:48:34.425471 +0200 dasd Removing a launch request for application <private> by activity <private>
error 09:48:34.425534 +0200 dasd Activity <private> not tracked as being started, ignoring it
default 09:48:34.427417 +0200 dasd With <private> ...Tasks pre-running in group [com.apple.dasd.defaultNetwork] are 1!
default 09:48:34.427594 +0200 dasd Activity launch reason is not a BGTask reason. Returning YES
default 09:48:34.427720 +0200 SpringBoard cancelActivities: 1 activities were not found: <private>
default 09:48:34.427859 +0200 dasd Unconstrained Available=1
default 09:48:34.427892 +0200 dasd com.apple.pushLaunch.x.y.z:FF3864:[
{name: DataBudgetPolicy, policyWeight: 1.000, response: {Decision: Must Not Proceed, Score: 0.00, Rationale: [{[/system/budgets/networking]: Required:1.00, Observed:0.00},]}}
], FinalDecision: Must Not Proceed}
default 09:48:34.427937 +0200 dasd NO LONGER RUNNING [Not in application -> activity mapping] com.apple.pushLaunch.x.y.z:FF3864 ...Tasks running in group [com.apple.dasd.defaultNetwork] are 0!
receivedBackgroundNotification 从未被触发。
我到处都检查过了,我似乎设置了所有选项(但显然没有)。非常感谢收到任何建议。
更新
当我在 XCode 中将应用程序置于后台时,我收到此消息:
Can't end BackgroundTask: no background task exists with identifier 106 (0x6a), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug
在调试器中,中断发生在 [UAAsyncOperation setIsFinished]
通过设置 "content-available":1
,您将使用静默推送通知。我不确定它在以前的 iOS 中是否更好,但在 iOS 13 中,此类通知的 apns 优先级为 5(满分 10)。
这意味着它们可能会被延迟、分组和突发传送,甚至完全被忽略。
例如,如果用户强制关闭应用程序(向上滑动),静默通知将被完全忽略。此外,用户每天可以在每个应用程序中接收的数量也有限制。
话虽这么说,静默推送通知不适合您需要保证通知将被送达的情况。
尝试使用常规推送通知(或者如果您想在向用户显示通知之前更改通知内容,则可以使用 Notification Service App Extension)。他们可能会稍有延迟,但会送达。
为了尝试从右脚开始,我整个上午都在搜索 SO 和其他资源来解决这个问题。
我有一个应用程序可以与无声前台推送通知以及标准推送通知完美配合。能力设置如下
触发通知的JSON如下
{"device_types":["android","ios"],"notification":{"ios":{"extra":{"requests":{"directives":{"forceUpdate":1}}},"content-available":1}},"audience":{"tag":"userDevice=60218"}}
我已将 PushHandler 委托减少到最低限度以进行测试,来自 UA 示例:
-(void)receivedBackgroundNotification:(UANotificationContent *)notificationContent completionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// Application received a background notification
UA_LDEBUG(@"The application received a background notification");
// Call the completion handler
completionHandler(UIBackgroundFetchResultNoData);
}
-(void)receivedForegroundNotification:(UANotificationContent *)notificationContent completionHandler:(void (^)(void))completionHandler {
UA_LDEBUG(@"The application received a foreground notification %@",notificationContent);
completionHandler();
}
-(void)receivedNotificationResponse:(UANotificationResponse *)notificationResponse completionHandler:(void (^)(void))completionHandler {
UANotificationContent *notificationContent = notificationResponse.notificationContent;
NSLog(@"Received a notification response");
NSLog(@"Alert Title: %@",notificationContent.alertTitle);
NSLog(@"Alert Body: %@",notificationContent.alertBody);
NSLog(@"Action Identifier: %@",notificationResponse.actionIdentifier);
NSLog(@"Category Identifier: %@",notificationContent.categoryIdentifier);
NSLog(@"Response Text: %@",notificationResponse.responseText);
completionHandler();
}
- (UNNotificationPresentationOptions)extendPresentationOptions:(UNNotificationPresentationOptions)options notification:(UNNotification *)notification {
return options | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert;
}
我还查看了设备控制台(查找 x.y.z 作为标识符),我看到了这个:
default 09:48:34.413032 +0200 apsd <private> _notifyForIncomingMessage <private> with guid <private>
default 09:48:34.414156 +0200 apsd Dispatching low priority message on server: <private>
default 09:48:34.414656 +0200 SpringBoard <private> Delivering message from apsd: <private> 3373312264 <private>
default 09:48:34.414772 +0200 SpringBoard <private> responding with an ack for message with guid <private>
default 09:48:34.414816 +0200 SpringBoard <private> making delegate (<private>) calls to deliver message 3373312264 <private> for topic <private>
default 09:48:34.414842 +0200 SpringBoard <private> calling <private> connection:didReceiveIncomingMessage:
default 09:48:34.415254 +0200 SpringBoard <private> returned from <private> connection:didReceiveIncomingMessage:
default 09:48:34.415401 +0200 SpringBoard Received incoming message on topic x.y.z at priority 1
default 09:48:34.416402 +0200 apsd Looking up connection on peer: 3be332c0 found <private>
default 09:48:34.416460 +0200 apsd <private> informed that <private> acknowledges incoming message with guid <private> tracingUUID (null)
default 09:48:34.417113 +0200 apsd APSMessageStore - APSIncomingMessageRecordDeleteMessageForGUID <private>
default 09:48:34.418199 +0200 SpringBoard [x.y.z] Received remote notification request BBC2-437A [ hasAlertContent: 0, hasSound: 0 hasBadge: 0 hasContentAvailable: 1 hasMutableContent: 0 pushType: Background]
default 09:48:34.418312 +0200 SpringBoard [x.y.z] Deliver push notification BBC2-437A
default 09:48:34.418372 +0200 SpringBoard [x.y.z] Request DUET delivers content-available push notification to application
default 09:48:34.418476 +0200 SpringBoard SUBMITTING: <private>
default 09:48:34.419185 +0200 dasd Submitted Activity: com.apple.pushLaunch.x.y.z:FF3864 at priority 5 <private>
default 09:48:34.419315 +0200 dasd <private> was in pre-running. Removing due to submission of <private>
default 09:48:34.425019 +0200 dasd Adding a launch request (<private>) for application <private> by activity <private>
default 09:48:34.425069 +0200 dasd Launch requests for <private>: <private>
default 09:48:34.425219 +0200 dasd Daemon Canceling Activities: {(
com.apple.pushLaunch.x.y.z:3B7016
)}
default 09:48:34.425282 +0200 dasd CANCELED: com.apple.pushLaunch.x.y.z:3B7016 at priority 5 <private>!
default 09:48:34.425471 +0200 dasd Removing a launch request for application <private> by activity <private>
error 09:48:34.425534 +0200 dasd Activity <private> not tracked as being started, ignoring it
default 09:48:34.427417 +0200 dasd With <private> ...Tasks pre-running in group [com.apple.dasd.defaultNetwork] are 1!
default 09:48:34.427594 +0200 dasd Activity launch reason is not a BGTask reason. Returning YES
default 09:48:34.427720 +0200 SpringBoard cancelActivities: 1 activities were not found: <private>
default 09:48:34.427859 +0200 dasd Unconstrained Available=1
default 09:48:34.427892 +0200 dasd com.apple.pushLaunch.x.y.z:FF3864:[
{name: DataBudgetPolicy, policyWeight: 1.000, response: {Decision: Must Not Proceed, Score: 0.00, Rationale: [{[/system/budgets/networking]: Required:1.00, Observed:0.00},]}}
], FinalDecision: Must Not Proceed}
default 09:48:34.427937 +0200 dasd NO LONGER RUNNING [Not in application -> activity mapping] com.apple.pushLaunch.x.y.z:FF3864 ...Tasks running in group [com.apple.dasd.defaultNetwork] are 0!
receivedBackgroundNotification 从未被触发。
我到处都检查过了,我似乎设置了所有选项(但显然没有)。非常感谢收到任何建议。
更新
当我在 XCode 中将应用程序置于后台时,我收到此消息:
Can't end BackgroundTask: no background task exists with identifier 106 (0x6a), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug
在调试器中,中断发生在 [UAAsyncOperation setIsFinished]
通过设置 "content-available":1
,您将使用静默推送通知。我不确定它在以前的 iOS 中是否更好,但在 iOS 13 中,此类通知的 apns 优先级为 5(满分 10)。
这意味着它们可能会被延迟、分组和突发传送,甚至完全被忽略。
例如,如果用户强制关闭应用程序(向上滑动),静默通知将被完全忽略。此外,用户每天可以在每个应用程序中接收的数量也有限制。
话虽这么说,静默推送通知不适合您需要保证通知将被送达的情况。
尝试使用常规推送通知(或者如果您想在向用户显示通知之前更改通知内容,则可以使用 Notification Service App Extension)。他们可能会稍有延迟,但会送达。