回答

47

有需要适合它的工作将被设置过多的设置。我会试着剖析它们并使其更易于理解。

我强烈建议大家观看前7分钟:WWDC 2015: What's new in Notifications。从那里,主持人提到,有2种主要类型的通知:

静音通知

它们发生在后台,所以你永远不会看到任何警示/标志/声音。事情得到下载没有你知道他们。

iOS11错误

here。 iOS 11的初始版本对于静默通知来说是buggy。确保 你有你的测试的最新版本,否则可能无法 工作


用户通知

正如名字所示,它有事情做与用户。这是用户会看到一个警告/徽章或听到一个声音。它有两种类型。

本地通知

一个本地通知可以触发 3种不同的方式:

  • UNLocationNotificationTrigger: 你看,当你接近沃尔玛商店的警报。

  • UNTimeIntervalNotificationTrigger例如:您每10分钟看到一次警报。

  • UNCalendarNotificationTrigger像12月1日下午1:00 2017年

远程通知

它们类似于localNotifications,但他们是从服务器触发例如一个有From字段(妈妈)和一个身体字段(我爱你!)的Whatsapp消息。

的几点思考:

要接收你需要使用令牌注册沉默或远程通知:

application.registerForRemoteNotifications() 

登记,并不能要求用户权限。这使得无声通知变得毫无意义。见this moment of the WWDC video

无声的通知默认情况下启用。用户不需要 来批准你的 - 不允许你的应用程序使用它们, ,你可以开始使用它们而不要求用户获得 权限。

From WWDC

为了能够显示徽章/警报/声音,你需要从用户请求许可

UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, error) in 

    guard error == nil else { 
     //Display Error.. Handle Error.. etc.. 
     return 
    } 

    if granted { 
     //Do stuff here.. 

     //Register for RemoteNotifications. Your Remote Notifications can display alerts now :) 
     application.registerForRemoteNotifications() 
    } 
    else { 
     //Handle user denying permissions.. 
    } 
} 

问题:我需要请求访问一次本地通知和一次远程通知?

没有只写上面的代码中,它会请求访问都远程和本地

现在让我们来棘手的问题:d


我需要让东西收到无声通知?

  1. 您必须启用推送通知从您的Xcode功能: enter image description here

如果你不启用这个那么你的应用程序将不会收到一个令牌。而如果没有令牌服务器不能识别你

  • 为了能够从背景您需要启用下载的东西:从背景模式远程通知
  • 要启用backgroundModes,您可以使用的plistXcode的能力要么

    你可以这么做的原因是因为:plist更接近你的代码并且是旧的方式,或许它是为了传统的支持。 Xcode的能力是较新的简单的方法

    的plist:

    enter image description here

    项0只是一个指数,这不是一本字典的键(你在plist中通常看到) ,UIBackgroundModes是Strings的array。的字符串必须只从UIBackgroundModes Array

    Xcode的能力来自一个接受值

    enter image description here

    检查Remote Notification下背景模式如下在的Xcode如果您未执行上述任何操作,请切换通知:

    enter image description here

    会杀远程&本地通知


    但是如果你实现从plist中或Xcode的功能后台应用刷新那么即使有通知关闭的应用程序,你仍然会收到无声的通知!

    如果用户想禁用静默通知,他将不得不禁用这两个通知,并禁用系统上的应用/后台应用刷新 要禁用整个系统中的“后台应用刷新”,您必须执行此操作:

    enter image description here

    为什么我说这一切?向您解释设置无声&推送通知对于用户是不同的,并且发送它们的限制是不同的。有关更多信息,请参阅WWDC视频中的this moment。另请参阅here

    警告:即使禁用应用程序后台刷新&禁用允许通知,您仍然可以接收无声通知,如果您的应用程序是在前台。如果你的应用程序在后台,它们将不会被发送。


    我需要启用某些功能才能接收远程通知吗?

    你只需要启用推送通知从您的Xcode功能:

    enter image description here

    如果你不启用这个那么你的应用程序将不会收到一个令牌。而如果没有令牌服务器不能识别你


    好奇......你能告诉我什么我应该有效载荷是什么样子?

    我强烈建议你看看苹果§documentation。这很清楚。

    谢谢,但你能告诉我重要的部分吗?

    uhhmm ... OK,只是让你知道这是来自链接我只是说:

    对于静音通知有两个准则:

    • 有效载荷的aps字典必须包括content-available密钥 ,其值为1
    • 有效载荷的aps字典不得包含 alertsound,或badge键。

    样本有效载荷是这样的:

    { 
        "aps" : { 
         "content-available" : 1 
        }, 
        "acme1" : "bar", 
        "acme2" : 42 
    } 
    

    ACME1,acme2或只是一些自定义的数据!但是对于aps键,您必须遵循Apple的结构,否则地图正确,您将无法正确读取数据。

    对于远程通知

    您需要aps

    内的alert键为例:

    { 
        "aps" : { 
         "alert" : "You got your emails.", 
         "badge" : 9, 
         "sound" : "bingbong.aiff" 
        }, 
        "acme1" : "bar", 
        "acme2" : 42 
    } 
    

    还有一个第三个选项我将进一步讨论放下答案。

    至于知道什么是固定aps & alert字典键看到这些Apple docs

    OK知道了。 content-available是什么?

    很简单。这只是一个标志,告诉你的应用程序,你需要唤醒并下载一些东西,因为我有可供下载的内容!欲了解更多信息请参阅本确切moment

    §:如果你使用火力地堡那么你的有效载荷结构和按键可能会略有不同。例如,密钥content-available被替换为content_available。欲了解更多见火力地堡documentationhere


    我知道你告诉我,当我用沉默的通知,我只能下载的东西进入我的应用程序,但有没有办法,我也可以唤醒我在后台应用并下载远程通知?

    是的,但是然后类似于无声通知您还必须将content-available标志设置为1,所以它会知道醒来并下载一些东西。否则,它会弹出并提醒/徽章/声音,但不会下载任何东西。

    重要提示:

    • 如果您的应用程序只有无声的通知,然后就能够从功能“推送通知” +“远程通知”,并设置content-available1每个有效载荷。
    • 如果您的应用只有远程通知,那么只需启用“推送通知”窗体功能即可...... content-available没有什么可做的。
    • 但是,如果您希望触发通知显示警报/徽章/声音并在后台下载某些内容,则必须启用“远程通知”和“推送通知”+设置content-available1

    (第三个选项)

    { 
        "aps" : { 
         "content-available" : 1 
         "alert" : "You got your emails.", 
         "badge" : 9, 
         "sound" : "bingbong.aiff" 
        }, 
         "acme1" : "bar", 
         "acme2" : 42 
    } 
    

    这个moment从WWDC视频提到了


    我感到困惑远程通知...我想每当我得到一个通知...我的应用程序在后台变得活跃并下载了一些东西......你能解释一下吗?

    例如在这一刻:

    enter image description here

    你的iPhone刚刚收到“无发件人”的体远程通知。要接收此... WhatsApp 必须在后台运行,即您不需要从BackgroundModes启用“远程通知”。即使您的应用已被强制退出或暂停,您仍然会收到通知。因为进程由OS而不是Whatsapp应用程序管理。但是,如果您希望能够将实际消息或其图像/视频下载到WhatsApp(这样,一旦用户打开WhatsApp,视频就会坐在那里等待用户),那么您需要您的应用程序变为活动状态。为此,您需要content-available : 1并执行application(_:didReceiveRemoteNotification:fetchCompletionHandler:)

    CAVEAT:如果应用程序被用户强制退出,那么您仍然会收到通知(通过您的操作系统),但无法执行任何操作以使应用程序退出其终止状态。你的委托方法都不会被击中。)


    详情见Apple documentationRayWenderlichiOS 10 tutorialWWDC 2016 video

    +6

    有史以来最详细的答案,谢谢! –

    +0

    “即使您禁用了应用后台刷新和禁用允许通知,但如果您的应用处于FOREGROUND状态,仍然可以收到无声通知。”我尝试过没有成功。你有没有尝试过,看到它的工作? –

    +0

    @JohnL。 iLl必须对其进行测试并在以后回复。不知道什么时候,因为我需要设置的东西来测试它 – Honey

    5

    推送通知将让用户知道他们收到通知(例如显示通知弹出窗口)。无声通知将更新,但用户不会收到通知。 在任何情况下,您都可以在通过静音进行操作时执行操作,就像它是推送通知一样。唯一的区别是用户不会收到弹出通知的通知。

    随着推送通知: enter image description here

    随着无声通知: enter image description here

    所不同的是在有效载荷:

    推送通知:

     aps { 
         content-available: 1 
         alert: {...} 
        } 
    

    无声通知:

    aps { 
         content-available: 0 
         alert: {...} 
        } 
    

    而你必须在中设置功能你选择的背景模式。

    +0

    推送通知?你的意思是push = remote。或者push = remote + silent? – transang

    +2

    push = remote + silent。唯一的区别是静音不通知用户弹出。无论如何,这只发生在应用程序在后台。如果应用程序处于前台,用户永远不会收到弹出窗口的通知。 –

    +0

    是在发送之前在我的服务器上设置的通知类型(远程,无声)?或者,这只是iOS用来根据手机状态对推送通知进行分类的一种方式? – transang

    0

    无声推送通知到达设备,用户不知道有关通知的任何东西,但他的应用程序得到通知和应用程序将给予一定的时间来下载新内容,并将其呈现给用户,无论在应用程序的状态(即运行或不运行)

    仅当您的应用程序运行时才会调用远程推送通知方法。如果应用程序被暂停或未运行,则在调用方法之前,系统会唤醒或启动您的应用程序并将其置于后台运行状态。 此方法用于显示更新的内容到user.When调用此方法,您的应用程序有高达挂钟时间来进行下载操作和调用指定的完成处理程序块30秒。如果处理程序未及时调用,您的应用程序将被暂停。

    更多的技术细节,你可以通过这个链接:

    Apple Notifications

    Silent Notifications

    +0

    嗨,当我得到推送通知时,应用程序应该在后台处于活动状态并执行任务(如用户的位置更新代码或其他代码), - (void)application:(UIApplication *)application didReceiveRemoteNotification :(NSDictionary *)userInfo fetchCompletionHandler :(无效(^)(UIBackgroundFetchResult))completionHandler,但我的应用程序不会活动,直到用户点击通知。我应该如何在应用程序处于后台时完成此操作?有谁知道这个解决方案?我正在使用FCM进行通知。 – Moxarth