我在这里读了很多答案,但我找不到这些问题的答案 如何在应用程序未运行时停止通知中的徽章,警报和声音? 当应用程序处于后台时,如何停止通知中的徽章,警报和声音?
在这个函数中:
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
我在没有[.badge,.alert,.sound]的情况下放置了completionHandler([]),并且在运行应用程序时仍然会在后台收到通知。
此外,我的代码中还有一个函数,当有人给你打字时你会发出通知,当你在应用程序中时,你看到他正在给你打字,但是当你没有运行应用程序时,你会收到带有徽章警告声音的通知?如何防止?
PHP代码:
$body['aps'] = array(
'content-available' => 0,
'typingNewMessage' => 'true',
'senderId' => $your_id
);
答案 0 :(得分:1)
首先要做的两件事:您是否在应用中使用websocket / socket.io进行聊天?至于通知,您是否在后台模式中设置了远程通知?
背景模式。
阅读docs for push notifications,听起来你在这里添加了一些步骤,或者遗漏了一些。基本上提到kathayatnk,他的方法应该给你你想要的。因此,如果您尚未激活远程后台通知:
配置您的应用以处理中的静默通知 背景
- 在Project Navigator中,选择您的项目。
- 在编辑器中,选择您的iOS应用目标。
- 选择功能选项卡。
- 启用后台模式功能。
- 启用远程通知后台模式。
醇>
如果这样做,你应该在后台收到它们。
此外,您使用错误的方法在后台收到背景通知..如上面相同的链接中所述:
在iOS中,系统通过调用来发送静默通知 application:didReceiveRemoteNotification:fetchCompletionHandler: 您的应用委托的方法。使用该方法启动任何下载 获取新数据所需的操作。
我通常如何使用它:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
guard let aps = userInfo["aps"] as? [String:Any] else {
//handle something here..
return
}
//handle the content here...
}
您还可以通过播放completionHandler的返回值,在此处执行非活动状态的后台任务。我建议你也读一读。
对于您的聊天问题......
澄清你是如何表现的......
如果您使用的是websocket / socket.io架构:
我强烈建议在使用websocket时不使用通知来通知用户任何有APNS的内容。 Websockets非常高效且速度更快。处理两者都会使事情变得复杂。坚持使用套接字方法,并使用方法服务器端检查用户是否仍在应用程序中。像here这样的乒乓球方法。当套接字客户端ping方法显示用户已离开应用程序或已关闭应用程序时,请将该方法切换到APNS传递。这意味着,如果用户仍然在应用程序中但不在对话中,则保持ping方法,但以不同的方式编写UI响应(例如,使用FB Messenger或Snapchat的通知选项卡)。
如果你没有使用websockets / socket.io:
...切换到websockets技术或包(取决于您的服务器平台类型)或socket.io或使用firebase realtime chat services。
让我知道您之前提到过的设置,但如果您已经完成所有这些并仍然遇到问题,请发布您的代码。
Personnaly,我已经将RawWenderlicht用于APNS指南超过一年,如果你问我,那就好了。
答案 1 :(得分:1)
要silent
push notification
,payload
应包含content-available
密钥:
{
"aps": {
"content-available": 1
}
}
此外,您需要在Remote Notifications
项目的Background Modes
设置下的Capabilities
中启用Xcode
。
现在是app will wake up in the background
收到其中一个push notifications
。
didReceiveRemoteNotification
时,AppDelegate
都会调用 push notification
。
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
{
let aps = userInfo["aps"] as! [String: AnyObject]
if aps["content-available"] as? Int == 1
{
//Your code
}
}
有关如何处理前景/背景中的推送通知的更多信息,请参阅:https://www.raywenderlich.com/156966/push-notifications-tutorial-getting-started
答案 2 :(得分:-1)
您可以在发送推送时添加静默推送通知(相应地设置内容可用密钥),如下所示。
//when you want the badge and sound
aps {
content-available: 1
}
//When you want silent notifications
aps {
content-available: 0
}
这将调用适当的委托方法,但不会显示徽章和声音