【问题标题】:ios 13 Urban Airship background push failsios 13 Urban Airship后台推送失败
【发布时间】:2019-09-30 08:13:52
【问题描述】:

为了尝试从正确的角度开始,我整个上午都在搜索 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]

【问题讨论】:

    标签: ios objective-c urbanairship.com


    【解决方案1】:

    通过设置"content-available":1,您正在使用静默推送通知。我不确定它在以前的 iOS 中是否更好,但在 iOS 13 中,这种类型的通知的 apns 优先级为 10 分中的 5 分。

    这意味着它们可能会被延迟、分组和突发交付,甚至完全忽略。

    例如,如果用户强制关闭应用程序(向上滑动),则完全忽略静默通知。此外,用户每天每个应用可以接收的数量是有限制的。


    话虽如此,静默推送通知不适用于需要保证通知会送达的情况。

    尝试定期推送通知(或者如果您想在向用户显示之前更改通知的内容,也可以使用Notification Service App Extension)。它们可能会稍晚到达,但会送达。

    【讨论】:

    • 经过更多测试后,我可以添加一个带有后台推送的警报,如果我点击消息,则会触发响应委托调用,但应用程序不会被推送唤醒。我想知道这是否是驾驶舱故障——也许我误解了 iOS 在收到后台推送时会做什么。
    • 经过进一步审查,这听起来是一个合理的答案。它“有时”起作用。我不得不重新调整代码以使用标准推送,以确保我的更新能够及时交付。
    • @jmf1205 哎呀,很抱歉没有给您提供尝试的替代方法...我只是专注于解释为什么通知“失败”而忘记尝试找到解决方法...我'会将其添加到答案中,以便对以后阅读它的其他人更有帮助。
    • 您的回答完全正确——我只是认为无声通知还有很多不足之处。只要我让他们“非沉默”一切都很好!
    • @pepsy 你能告诉我们你在哪里找到了关于 apns-priority 和每日限制的信息吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    相关资源
    最近更新 更多