繁体   English   中英

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

[英]Swift 3 - Turn off badge, alert, sound

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

在这个功能:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

我把completionHandler([])放在没有[.badge,.alert,.sound]的情况下,当我运行应用程序时,我仍然会在后台收到通知。

此外,我的代码中还有一个函数,当有人给你打字时你会发出通知,当你在应用程序中时,你看到他正在给你打字,但是当你没有运行应用程序时,你会收到带有徽章警报声的通知吗? 怎么预防?

PHP代码:

$body['aps'] = array(
    'content-available' => 0,
    'typingNewMessage' => 'true',
    'senderId' => $your_id
    );

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

背景模式。

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

配置应用以在后台处理静默通知

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

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

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

在iOS中,系统通过调用应用程序提供静默通知:didReceiveRemoteNotificationfetchCompletionHandler :应用程序委托的方法。 使用该方法启动获取新数据所需的任何下载操作。

我通常如何使用它:

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非常高效且速度更快。 处理两者都会使事情变得复杂。 坚持使用套接字方法,并使用方法服务器端检查用户是否仍在应用程序中。 这里的乒乓球方法。 当套接字客户端ping方法显示用户已离开应用程序或已关闭应用程序时,请将该方法切换到APNS传递。 这意味着,如果用户仍然在应用程序中但不在对话中,则保持ping方法,但以不同的方式编写UI响应(例如,使用FB Messenger或Snapchat的通知选项卡)。

如果你没有使用websockets / socket.io:

...切换到websockets技术或包(取决于您的服务器平台类型)或socket.io或使用firebase实时聊天服务

让我知道你的设置就像我之前提到的那样,但是如果你已经完成所有这些并且仍然遇到问题,那么就发布你的代码。

Personnaly,我已经使用RawWenderlicht为APNS指南超过一年,如果你问我好东西。

对于silent push notificationpayload应包含content-available密钥,如下所示:

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

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

在此输入图像描述

现在,当您的app will wake up in the background收到其中一个push notifications时,它将app will wake up in the background

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

您可以在发送推送时添加静默推送通知(适当地设置内容可用密钥),如下所示。

//when you want the badge and sound
 aps {
   content-available: 1
 }

//When you want silent notifications
 aps {
   content-available: 0
 }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM