菜鸟教程小白 发表于 2022-12-13 01:38:45

ios - 当应用程序在后台时替代 UserNotificationCenterDelegate 的 willPresent


                                            <p><p>我想弄清楚我是否可以通过本地通知来实现我的目标,或者我是否需要切换到远程通知。 </p>

<p>我正在通过构建一个闹钟程序来练习 iOS 10/Swift 3,该程序在一天中的设定时间播放 RSS 更新的广播节目的最新一集。当应用在前台时,这很容易通过UNUserNotificationCenterDelegate的willPresent函数来执行。我只是使用 willPresent 来获取最新剧集,并通过 AVAudio Player 播放。 </p>

<p>当然,如果应用只在前台运行,这个功能是非常有限的。我希望应用程序在后台或关闭时以相同的方式工作。 </p>

<p>我可以从文档中看到,当应用程序不在前台时,willPresent 不会运行。当应用程序在后台时,是否有另一种方法可以让本地通知在推送通知之前执行代码?还是我必须切换到远程通知?我看到了<a href="https://stackoverflow.com/questions/39584721/ios-10-usernotifications-background-jobs" rel="noreferrer noopener nofollow">this answer to a related question</a>但我想知道是否有更优雅的方法。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>对于 <strong>iOS 10</strong> <em>本地通知</em>,你倒霉了。 </p>

<p>对于 <strong>iOS 10</strong> <em>远程通知</em> —<strong>无论用户交互如何</strong>,您都可以使用 <a href="https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623013-application" rel="noreferrer noopener nofollow"><code>application(_:didReceiveRemoteNotification:fetchCompletionHandler:)</code></a> 接收回调. (令人困惑的是,他们弃用了大多数与通知相关的方法,但不是这个)</p>

<hr/>

<p>当应用处于前台并且<strong>您将要显示通知时的回调:</strong></p>

<pre><code>func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -&gt; Void) {
    let content = notification.request.content
    // Process notification content

    completionHandler([.alert, .sound]) // Display notification as regular alert and play sound
}
</code></pre>

<hr/>

<p>当应用程序处于后台或前台并且<strong>用户点击操作时的回调:</strong></p>

<p> <a href="/image/Xdfk8m.png" rel="noreferrer noopener nofollow"><img src="/image/Xdfk8m.png" alt="enter image description here"/></a> </p>

<p>例如为您提供用户点击<strong>保存</strong>的回调。 </p>

<pre><code>func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -&gt; Void) {
    let actionIdentifier = response.actionIdentifier

    switch actionIdentifier {
    case UNNotificationDismissActionIdentifier: // Notification was dismissed by user
      // Do something
      completionHandler()
    case UNNotificationDefaultActionIdentifier: // App was opened from notification
      // Do something
      completionHandler()
    default:
      completionHandler()
    }
}
</code></pre>

<hr/>

<p>当应用程序处于后台、前台或(可能)暂停状态并且<strong>推送通知(远程或静默通知)到达时回调:</strong></p>

<p>在 iOS10 之前,当您点击通知时,会调用 <code>application(_:didReceiveRemoteNotification:fetchCompletionHandler:)</code>。</p>

<p>但由于 iOS 10 <code>application(_:didReceiveRemoteNotification:fetchCompletionHandler:)</code> 不会在 <em>tapping</em> 时被调用。它仅在远程通知<em>到达</em>时调用。 (它在前台和后台都被调用)</p>

<hr/>

<p>对于 <strong>pre iOS 10</strong>,您可以只使用旧的 <code>didReceiveLocalNotification</code> 函数并捕获任何通知的到达。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 当应用程序在后台时替代 UserNotificationCenterDelegate 的 willPresent,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/44425744/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/44425744/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 当应用程序在后台时替代 UserNotificationCenterDelegate 的 willPresent