音乐搜索器-多站合一_通知快捷方式-多合一

音乐搜索器-多站合一

漂亮的小警报..🥁
通知是一种在新数据可用于该应用时通知用户的方法,即使该应用未在前台运行也是如此。
例如,消息收发应用程序可能会在新消息到达时通知用户,而日历应用程序可能会通知用户即将到来的约会。

随着iOS-10的发布 Apple引入了全新的框架来支持本地或远程通知。 自定义通知是此版本重点关注的内容。

不要浪费任何时间,让我们快速跳到细节上。

通知类型

我们可以将通知大致分为两类,

  • 本地通知 -应用程序在本地配置通知详细信息,并将这些详细信息传递给系统,然后在系统不在前台时处理通知的传递。
  • 远程通知 -使用公司的一台服务器通过Apple推送通知服务(APN)将数据推送到用户设备。

在本文的进一步部分,我们将看到如何掌握两种通知类型。 首先让我们开始介绍可以用于事业的全新通知框架。

iOS-10的通知中有哪些新功能?

随着iOS-10的发布,Apple引入了2个新框架来处理通知,

我们将使用这2个框架和一些特定于平台的API来配置我们的通知。

除框架外, Notification service应用程序扩展 还引入了允许在传递远程通知之前对其进行修改的内容。

Apple还允许通过Notification内容扩展名自定义通知UI

记住太多了吗? 是的。肯定是。 但是,不用担心。 我们将逐步查看所有内容以及相关代码。 放轻松..😉

第一步-配置它.. !!

请求授权

为了让我们的应用程序收到任何通知,我们首先需要知道使用它的人是否真的想要它。 也许是他不喜欢手机一直响并且显示警报😖..或者也许他实际上是想要更新但不想要那种令人讨厌的声音..naahhh .. !!!☠️

因此,首先,我们需要从我们要通知的人那里获得许可。 这很简单,只需两行代码,我们就完成了。

您需要先从AppDelegate的方法中编写该代码-application:didFinishLaunchingWithOptions :,然后再从其中返回。

注意事项:由于系统保存用户的响应,因此在后续启动期间对requestAuthorization(options:completionHandler :)方法的调用不会再次提示用户。

添加类别和操作-可行的通知

用户通知框架支持向通知添加类别和操作。

类别 -定义应用程序支持的通知类型,并向系统传达我们希望如何显示通知的方式。

动作 -每个类别最多可以有四个关联的动作。 动作基本上是自定义按钮,轻按一下即可关闭通知界面,并将选定的动作转发给应用程序以立即进行处理。

好吧.. !!! 那是什么意思.. ?????🤔一些代码可以帮助您更好地理解。

在上面的代码中,我们简单地创建了一个名为INVITATION的类别,该类别具有4种不同的动作-alertLater,accept,拒绝,comment

类别和动作由其标识符唯一标识。 每当传递带有类别的通知时,一旦用户展开该类别,系统就会显示该通知以及与该类别相关的所有动作。 这就是👇的样子,

在您在application:didFinishLaunchingWithOptions:方法中配置通知的位置下面,定义所有类别和操作。

在安排本地或远程通知时,请包括类别标识符(例如INVITATION )。 我们将在下一节中看到如何执行此操作。

安排本地通知

现在我们已经完成了配置通知的操作,让我们看看如何在app中实际安排一个通知。

安排本地通知只是3个简单的步骤,

  1. 准备内容
  2. 添加触发器-应在何时触发通知
  3. 安排交货

让我们快速开始编写代码,这样我们就不会对这里发生的一切感到困惑。 哈哈😝

在上面的代码以及其他内容中,我们还提供了categoryIdentifier以支持可操作的通知。 如果我们不这样做,系统将采用其默认行为。

而已。 这就是全部。 是的,它绝对有效。.呵呵呵.😝试一试,然后再继续。 您可以从此处下载示例。

每当传递通知时,应用程序在后台和前台状态下的行为都会有所不同。

  1. 应用程序未运行/应用程序在后台 -系统直接向用户显示本地通知。 我们没有为此在应用程序中获得任何回调。
  2. App in Foreground-系统为App提供了内部处理通知的机会。 默认情况下,系统使前台应用程序的通知静音

当通知发送时应用程序处于前台时,我们将在UNUserNotificationCenterDelegate的方法中获取回调— userNotificationCenter(_:willPresent:withCompletionHandler :) ,您可以在其中决定是静默处理通知还是向用户发出警报。

不要忘记使AppDelegate符合UNUserNotificationCenterDelegate协议,并将其设置为application:didFinishLaunchingWithOptions:中的UNUserNotificationCenter共享对象的委托。

let center = UNUserNotificationCenter.current() center.delegate = self

目前,我们已经完成了本地通知。 让我们继续介绍如何从应用程序外部安排通知。 在此之前,让我们看一下如何响应自定义操作。

响应用户操作

配置通知?? ✔安排通知? ✔

点击通知或通知中的任何自定义操作怎么办? 它会导致什么? —在这两种情况下,系统都会将用户的选择通知应用程序。

每当用户在通知中执行任何操作时,响应就会发送到UNUserNotificationCenterDelegate的方法— userNotificationCenter(_:didReceive:withCompletionHandler :) ,在该方法中,我们可以为每个操作提供特定的处理。

需要注意的一点 -如果收到响应后应用未运行,则系统会在后台启动该应用以处理响应。

远程通知

推送通知或远程通知,无论我们称之为什么,它都是使用频率最高的应用程序之一,具有很多用例。

无论是社交媒体,日历还是任何实用程序应用程序,我们几乎都可以看到它们。 新闻应用会通知我们最新内容,媒体本身会提醒我们最新发表的文章。

有没有想过他们怎么做到这一点? 本地通知???🤔可能是..它做同样的事情..对吗? 也许我们可以在本地本身中进行更多配置并使其正常工作? 但是例如,由于中等程度,无法在我们的个人设备上访问该应用程序,那么它如何安排任何通知? 究竟!!! 不行 这是不同的东西,不仅仅是本地的东西。

从某个点发送通知并在其他点显示它-这是否可以回答我们的问题? 是的。肯定会。 但是该怎么做呢? 它是远程通知 。 这正是它的作用。 这是解决了“保持最新”的大问题的功能。

术语
  • APNs 它是远程通知功能的核心。 这是一项云服务,它允许安装在Apple设备上的经过批准的第三方应用程序通过安全连接从远程服务器向用户发送推送通知。
  • 设备令牌-一种特定于应用程序的令牌,在全球范围内是唯一的,可标识一个应用程序-设备组合。 它使提供商,APN和设备之间能够进行通信。
  • 提供程序(Provider)-实际上将包括设备令牌和其他信息的远程通知发送到APN的服务器。
切勿在您的应用程序中缓存设备令牌; 而是在需要时从系统中获取它们。
当某些事件发生时,APN会向您的应用发布新的设备令牌。 保证设备令牌是不同的,例如,当用户从备份中还原设备时,当用户在新设备上安装您的应用程序以及当用户重新安装操作系统时。
当您尝试获取设备令牌但尚未更改时,fetch方法将快速返回。

需要指出的一点-APNs可以向未运行的应用程序传递远程通知的功能要求该应用程序至少已启动一次。

实际如何运作?

以下是有关上述所有技术如何协同工作以完成远程通知工作流的简短概述。

  1. 应用程式 A PN注册
  2. APN将设备令牌发送到设备 ,然后将其发送到App
  3. 应用将此设备令牌发送给提供商
  4. 提供者将带有该设备令牌的通知发送给APN ,然后将其发送给Device ,再将其发送给App
如果在设备开机但未运行应用程序的情况下收到有关您应用程序的通知,则系统仍可以显示该通知。 如果在APN发送通知时关闭设备电源,则APN会保留该通知并稍后重试。
在应用程序中处理

既然我们已经知道了什么是远程通知,以及使它工作所需的一切,现在让我们继续介绍如何使我们的应用程序支持它。 显然,nothing没有任何React。 我们需要对它们进行一些配置。 为了能够处理远程通知,我们的应用程序必须:

  1. 启用功能中的远程通知 -单击一下即可完成此步骤。 在我们的Xcode项目的“ 功能”选项卡中,启用“ 推送通知”选项。 确保将推送通知添加到我们用于项目的应用程序ID中。

2. 向Apple Push Notification Service(APN)注册并接收特定于应用程序的设备令牌

要求向APN注册很容易。 只需在UIApplicationDelegate的方法中添加以下代码(application:didFinishLaunchingWithOptions :),然后再从中返回即可。

UIApplication.shared.registerForRemoteNotifications()

现在有两种可能,要么我们成功注册,要么过程失败。

成功注册后,APN将使用UIApplicationDelegate的方法application:didRegisterForRemoteNotificationsWithDeviceToken:将特定于应用程序的设备令牌发送到设备。

如果出现故障,我们会在UIApplicationDelegate的方法中收到一个回调:application:didFailToRegisterForRemoteNotificationsWithError:。

3.将设备令牌发送到通知提供者服务器

到目前为止,我们已经从APN收到了设备令牌 现在,我们需要将此令牌发送给我们的提供商,该提供商将在将任何通知推送到我们的设备时使用它。

由于我们没有提供者,因此现在我们可以使用Easy APNs Provider来测试我们的推送通知。 在本节的后续部分,我们将看到如何精确地使用此工具。

现在,只需下载并将其安装在Mac上即可。

4.实施对处理传入的远程通知的支持

我们已经获得了设备令牌,我们的提供商也对此有所了解。 接下来,提供商将发送包含此令牌和其他信息的通知,我们将在设备上获取该通知。

怎么办? 当它到达时会发生什么? 它将如何出现在设备上? 当我们点击它会发生什么? 那么我们之前配置的所有操作呢? 我们可以把它们送到这里吗?

question ..好吧,不用担心。 我们将一一解答所有问题。

  1. 到达时会发生什么 —我们将在UIApplicationDelegate的方法中得到一个回调— application(_:didReceiveRemoteNotification:fetchCompletionHandler :) 。 它告诉应用程序远程通知已到达,该通知指示存在要提取的数据。
  2. 它在设备上的显示方式 -它将与默认的通知界面一起显示。 如果通知的有效负载配置有类别,它将显示为可操作的通知,所有操作都附加到该类别。 我们将在下一节中讨论有效负载。
  3. 当我们点击它时会发生什么 —与本地通知相同。 UNUserNotificationCenterDelegate的方法— userNotificationCenter(_:didReceive:withCompletionHandler :)与响应对象一起调用。
在提供者上处理

我们已经介绍了将推送通知集成到我们的应用程序中所需的大部分内容。 尽管我们知道如何在应用程序中处理它,但仍然缺少在提供程序上处理它的方法。

我们有提供者。 它知道要使用的设备令牌,但这完全不会在我们的设备上弹出带有一些标题和其他详细信息的通知。 也不会使任何动作出现。 因此,推送来自提供商的通知需要以下各项,

  1. 设备令牌
  2. APNs证书-我们可以从开发者帐户中获取
  3. 有效负载 -您要发送到应用程序的任何自定义数据,包括有关系统应如何通知用户的信息。 它只是带有一些键值对的JSON字典 。 下图可能帮助您更好地理解它。

让我们看看JSON字典的全部内容

  1. APS 词典 -最重要的一本。 包含Apple定义的键 ,用于确定接收通知的系统应如何警告用户。
  2. 警报 字典 -它更多是一个不言自明的项目。 提供通知的内容。
  3. 类别 -用于可操作的通知。 通知中将提供该类别所附的所有操作。
  4. 内容可用 要支持后台更新通知,请将此键设置为1。
  5. 可变内容 —要通过Notification Service App Extension启用通知的修改,请将其设置为1。

在这里,您可以阅读有关根据需要自定义有效负载的更多信息。 是对我们可以在aps字典中添加的键的引用

通知服务应用程序扩展

到现在为止,我们知道什么是远程通知 。它们是如何工作的。我们需要什么来使其正常工作。一切都可以使它们完美地工作。

现在的问题是,如果我们要在从提供商那里收到的通知中修改某些内容,然后再将其显示在设备上怎么办? 如果通知中包含一些我们需要下载的图像链接,然后发送给用户该怎么办? 我们能用我们已经知道的做吗? 我们无权访问提供商。.那我们将如何?

我们实际上不能。 我们不能改变我们得到的..但是我们绝对可以改变我们所呈现的。

这就是Notification Service App Extension的全部目的- 在交付前修改远程通知的内容 。 它看起来很简单。 没有花哨的代码..没什么..很简单。

向项目添加Notification Service Extension

xcode项目中的扩展被添加为目标。 选择文件 - 新建 - 目标 - 通知服务扩展。

先决条件

在我们开始修改内容之前,对何时允许修改内容有一些限制。 仅在以下情况下才能修改内容:

  • 远程通知配置为显示警报。
  • 远程通知的aps词典包含可变内容键,其值设置为1。

我们无法修改静默通知或仅播放声音或标记应用程序图标的通知。

因此,为了支持对通知内容的任何修改,必须满足这些条件。

修改内容

Xcode提供的默认通知服务扩展目标包含UNNotificationServiceExtension类的子类,供我们修改。

它包含2种方法:

  1. didReceive(_:withContentHandler :) —对通知进行任何必要的更改,并在完成后通知系统。 该方法在执行其任务和执行提供的完成块方面有有限的时间(约30秒)。
  2. serviceExtensionTimeWillExpire() —告诉我们您的扩展名即将终止。 给我们最后一次提交更改的机会。 如果我们在时间到期之前不更新通知内容,则系统将显示原始内容。

让我们来看一个例子。 我们将代码片段中的有效载荷中的主体 — 7更改为“ 地址:孟买Sea Shells Apartments ”。

扩展本身提供了这两种方法的所有默认实现。 我们只需要进行所需的更改即可,例如上述代码段的第8行。 现在只需一行代码。 同样,您可以根据需要修改其他字段。

通知内容扩展

拥有醒目的UI总是比默认的简单UI更好。 添加一些颜色..一些漂亮的字体从来都不是一个坏主意。 我们将对通知进行同样的操作,使它们看起来像哇。

而且还有…… 苹果再次在这里为我们解救。 通知内容扩展名 —提供用于传递的本地或远程通知的自定义界面。

向项目添加通知内容扩展

我认为我们已经知道该怎么做。 是不是 我们将进行与添加Notification Service Extension相同的操作 。 选择文件 - 新建 - 目标 - 通知内容扩展。

向扩展的Info.plist添加一些键

为了支持本地和远程通知的自定义UI,我们需要在内容扩展的Info.plist文件中进行一些更改。

  1. UNNotificationExtensionCategory(必需)—一个字符串或字符串数​​组。 每个字符串都包含应用程序声明的类别的标识符。 我必须说类别对于通知确实非常重要。 自定义用户界面仅会显示在指定类别中的通知。
  2. UNNotificationExtensionInitialContentSizeRatio(reqd。)—一个浮点数,它表示视图控制器视图的初始大小,以其高度与宽度之比表示。 这是我们用于制作自定义UI的视图控制器。 我们将在接下来的部分中进行讨论。
  3. UNNotificationExtensionDefaultContentHiddentrue :仅显示自定义内容, false :显示自定义+默认内容。
  4. UNNotificationExtensionOverridesDefaultTitle — true :将通知的标题设置为视图控制器的标题, false :将通知的标题设置为应用程序的名称。

这是一个可以帮助我们更好地理解上述键的插图。

在上图中, Info.plist中的键配置为:

  1. UNNotificationExtensionCategory —邀请
  2. UNNotificationExtensionInitialContentSizeRatio — 1
  3. UNNotificationExtensionDefaultContentHidden —
  4. UNNotificationExtensionOverridesDefaultTitle — false
创建自定义UI

通知内容扩展,向我们提供一个符合UNNotificationContentExtension协议的UIViewController。 该控制器显示通知的界面。 扩展中的Storyboard文件包含一个ViewController,我们可以使用它创建希望通知呈现的任何UI。

创建UI后,我们需要在NotificationViewController中连接元素以填写详细信息。 每当有预期类别的通知到达时,我们都会在UNNotificationContentExtension的方法didReceive (_ :)中收到回调。 在这里,我们可以向自定义UI添加详细信息。

通知的自定义UI几乎完成了。 再多1件。 由于自定义UI附加在通知类别中 ,因此可能附加了一些操作。 和..你说的没错.. !!! 🤘我们将自动执行操作,而无需任何自定义处理。 很棒.. !!!👏

内容+漂亮的用户界面+自定义操作 -完成所有操作。 我们还能要求什么。 苹果 ..你很棒.. !!!🤩

最后一点,我们也可以为扩展中的自定义操作添加处理。 系统调用didReceive(_:completionHandler :)方法来响应任何选定的动作。 如果我们的视图控制器未实现该方法,则系统会将选定的操作传递给您的应用以进行处理。

如果实施,我们需要处理此方法中所有可能的操作。 这里重要的一件事是完成关闭。

完成
完成执行动作后要执行的块。 在实现过程中,必须在某个时候调用此块。 该块没有返回值

该闭包接受类型为UNNotificationContentExtensionResponseOption的单个参数解除。 我们提供以下选项:

  1. doNotDismiss —不关闭通知界面。
  2. dismiss —关闭通知界面。
  3. dismissAndForwardAction-关闭通知界面并将通知转发到应用程序。

总结了我们的通知。 记不清了吗? 实践取得进展🙂 。 尝试制作自己的通知。

样例项目

您可以从此处下载示例项目。

可以在此处找到Notification Content Extension的示例项目。

促销活动

不要忘记阅读我的其他文章:

  1. Swift 4中有关Codable的一切
  2. 使用GRADIENTS为它着色— iOS
  3. iOS 11编码:如何拖放到集合和表格中
  4. 您需要了解有关iOS 10中的Today Extensions(Widget)的所有信息
  5. UICollectionViewCell选择变得简单.. !!

如有任何疑问,请随时发表评论。

翻译自: https://hackernoon.com/ios-10-notifications-inshorts-all-in-one-ad727e03983a

音乐搜索器-多站合一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值