Swift 3 - 关闭徽章,警报,声音

时间:2017-06-12 01:54:24

标签: ios swift audio notifications alert

我在这里读了很多答案,但我找不到这些问题的答案 如何在应用程序未运行时停止通知中的徽章,警报和声音? 当应用程序处于后台时,如何停止通知中的徽章,警报和声音?

在这个函数中:

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
    );

3 个答案:

答案 0 :(得分:1)

首先要做的两件事:您是否在应用中使用websocket / socket.io进行聊天?至于通知,您是否在后台模式中设置了远程通知?

背景模式。

阅读docs for push notifications,听起来你在这里添加了一些步骤,或者遗漏了一些。基本上提到kathayatnk,他的方法应该给你你想要的。因此,如果您尚未激活远程后台通知:

  

配置您的应用以处理中的静默通知   背景

     
      
  1. 在Project Navigator中,选择您的项目。
  2.   
  3. 在编辑器中,选择您的iOS应用目标。
  4.   
  5. 选择功能选项卡。
  6.   
  7. 启用后台模式功能。
  8.   
  9. 启用远程通知后台模式。
  10.   

如果这样做,你应该在后台收到它们。

此外,您使用错误的方法在后台收到背景通知..如上面相同的链接中所述:

  

在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 notificationpayload应包含content-available密钥:

{
  "aps": {
    "content-available": 1
  }
}

此外,您需要在Remote Notifications项目的Background Modes设置下的Capabilities中启用Xcode

enter image description here

现在是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
 }

这将调用适当的委托方法,但不会显示徽章和声音