您的位置:时时app平台注册网站 > 编程知识 > 推送多种艺术

推送多种艺术

2019-09-12 22:30

就这样搞定了。当然这个前提是已经拥有App ID,并且已经配置好了相关的开发者证书和生产证书,然后在这个基础上添加Push Notifications功能。像我们公司,之前项目是没有这个功能的,最近才加上去的。

六、如何关闭 APN 推送?

可通过调用代码

// iOS 8 以上可用此方法
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]] ;

进入您的应用的设置页面,点击“通知设置”,用户手可以动变更“允许通知”的状态。


推送保证不会丢失的消息。

大部分有推送功能的App都是这样一个设计,点击推送过来的通知跳转到其App对应的消息页面,比如社交类的简书,

四、为什么启动的时候出现 Did Fail To Register For Remote Notifications With Error的错误

程序运行的时候出现下面的错误信息:

did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x1c55e000 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}

这个是由于你的Provisioning Profile文件,不具备APNS功能导致的。请登陆Apple Developer 网站设置好证书,更新Provisioning Profile,重新导入Xcode。或参考博客


特别说明

好了,上面先说这么多,接着说说集成成功之后要做的事。注意:以下操作都是在集成JPUSHService成功的前提下进行的。

十二、iOS 平台上传证书一直为未通过状态

证书上传未通过的原因一般有:

  • 密码错误;
  • 上传的apns证书环境不一致;
  • 上传到控制台必须是apns证书,非apns证书会带来错误,还有其他的原因可能是开发者证书也可能是apns证书那里导出来的私钥。

具体请看上传后显示的错误输出内容


自己写的通知栏只能在 App 内部进行展示,只有 APNs 通知才可以展示在通知列表中。

图片 1设置badge参数

一、iOS 9集成

1.iOS 9变动影响SDK部分:

  • 增加了bitCode编码格式,当SDK不支持bitCode时,用户集成时无法开启bitCode选项.
    • 现象:用户集成SDK后无法编译通过,错误日志里包含了bitCode的相关错误信息
  • 默认使用https连接,如果请求为http,需要手动配置plist来支持http服务,当前我们的服务器请求都走http服务。
    • 现象:用户集成SDK后,所有JPush相关的http服务都提示连接错误或者连接超时,可能是此问题。

2.bitCode解决方式

  • JPush iOS SDK v1.8.7 及以上版本的SDK,已经增加对 iOS 9 新特性 bitCode 的支持.JMessage iOS SDK v2.0.0 及以上版本支持bitCode。

3.Https解决方式

SDK未提供https地址版本时

  • 需要用户主动在当前项目的Info.plist中添加NSAppTransportSecurity类型Dictionary。
  • 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES。

什么时候使用它?

JPush文档里有的代码就不说了,说它没有的。

三、为什么iOS收不到推送消息?

如果你确认 appKey 在 SDK 客户端与 Portal 上设置是一致,其他环节也按照文档正确地操作。但还是收不到推送消息。那么,有一定的可能性,是你在 Portal 上上传的证书,不是 APNs (Push) 证书。推送时指定的iOS推送环境和应用证书是同一个环境。请参考iOS 证书设置指南再次检查证书选择是否正确。

请注意:iOS能接受消息的必要条件是:应用程序的证书要和你上传到jpush portal上的证书对应,如果你的程序是直接在xcode上运行的,你的应用部署环境必须是开发状态才能收到APNS消息。

温馨提示:目前api推送的时候可以通过参数apns_production可以指定推送环境,false为开发环境,true为生产环境。V3 api不带此参数则默认为生产环境,V3 api封装的sdk 默认为开发环境。如果api有传apns_production则以此值为准,否则以应用详情的部署环境为准。


点击了图标 这个操作并不会 再次调用 Background 方法。

  • 自定义推送消息声音。找一个aiff,wav,caf音频文件拖入到Xcode工程中,然后在后台推送通知时设置sound参数为对应的音频文件名称即可。

八、Icon Badge number 的清空方法:

  • APN 推送内容指定 badge number 为 0;
  • 在代码中使用如下代码清空 badge number: [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

注意:
badge累加只能通过v3 api推送,且只有1.7.4版本以上才能支持。


获取通知内容

/** 远程通知回调函数,只要点击了远程推送的消息就会走这个方法 */- application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(UIBackgroundFetchResult))completionHandler { [JPUSHService handleRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNewData); int badge =[userInfo[@"aps"][@"badge"] intValue]; badge--; [JPUSHService setBadge:badge]; [UIApplication sharedApplication].applicationIconBadgeNumber = badge; // 上面几行是文档自带的 /** * iOS的应用程序分为3种状态 * 1、前台运行的状态UIApplicationStateActive; * 2、后台运行的状态UIApplicationStateInactive; * 3、app关闭状态UIApplicationStateBackground。 */ // 1、应用正处在前台状态下,不会收到推送消息,这里创建一个UIAlertController来接受消息 if (application.applicationState == UIApplicationStateActive) { NSLog(@"userInfo---:%@", userInfo); UIAlertController *alertvc = [UIAlertController alertControllerWithTitle:@"新消息" message:userInfo[@"aps"][@"alert"] preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* updateAction = [UIAlertAction actionWithTitle:@"查看" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { ActiveViewController *aVC = [[ActiveViewController alloc]initWithRemoteNotification:userInfo]; UINavigationController *nav = (UINavigationController*) (self.window.rootViewController); [nav pushViewController:aVC animated:YES]; }]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]; [alertvc addAction:cancelAction]; [alertvc addAction:updateAction]; [self.window.rootViewController presentViewController:alertvc animated:YES completion:nil]; } else if (application.applicationState == UIApplicationStateInactive) { // 处于后台运行状态时 NSLog(@"---UIApplicationStateInactive---"); InactiveViewController *ivc=[[InactiveViewController alloc]initWithRemoteNotification:userInfo]; UINavigationController *nav = (UINavigationController*) (self.window.rootViewController); [nav pushViewController:ivc animated:NO]; } // badge清零 [application setApplicationIconBadgeNumber:0]; [JPUSHService resetBadge];}

七、App badge number(角标)如何更改与清空?

JPush 网站上推送 iOS 通知时,可在[可选设置]里面指定 badge 参数的值,如:1或" 1"。

api上指定badge的参数请看:Push API
客户端上报badge到JPush服务器的接口请看:设置badge
关于badge +1的介绍,请看APNs Notification badge


两个办法:

如果还有不会集成的朋友可以看看JPush这个集成文档

iOS SDK 常见问题

极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知。

图片 2简书消息页面

十一、上传到appStore的版本为什么收不到推送?

  • 请确认xcode选择的生产证书和上传的证书的bundleid一致;
  • 如果是在jpush网站上推送,请确认新建通知时推送对象是否选择了生产环境;
  • 如果是v3 api推送,请确认是否使用了apns_production参数,值是否为:true;如果没有使用apns_production参数请确认jpush网站上该应用的部署环境是否已经切换到生产环境。

1.iOS 端,我们可以自己随便的拼接一个合乎规范的 token 并给 JPush ,以注册成功,获得registrationID。要推送消息,则采取调用 API 推送的方式进行。

想要集成极光推送,简单来说就是那么几步:1. 打开应用的Push Notifications功能2. 创建Development证书3. 导出p12文件上传到极光推送后台如果需要在生产环境下推送通知的话,还需要4,5步骤4. 创建Production证书5. 导出p12文件上传到极光推送后台

后记

  极光推送理论和常见问题就这些了,以后我会加一下我写的工程上的代码。有什么不对的地方,欢迎发邮件或者私信我,谢谢大家。

图片 3

她很美!

本地通知里面的 body 不写也是没有横幅展示的,官方示例里面的这一句 content.body = @"This is a test code";

  1. 这里当应用程序处于关闭状态时,我上面在didFinishLaunchingWithOptions方法里做了处理,但是最后它又执行了后台运行时的方法,两个方法同时执行了,这个真不知道怎么回事?如果有朋友知道的话请留下评论,真心感激~~不过当我做本地通知的时候没有出现这样的情况,关闭状态它就跳到关闭时的页面,后台状态就是后台页面,不会同时执行。其实也不影响,一般的应用需求是点击通知跳到一个单独的消息页面,这里我做了三个不同状态下的三个页面(看到网上还有人说应用程序处于关闭状态是接受不了远程消息的,呵呵)。

  2. 细心的朋友可能还发现应用名称不对应,桌面icon下面是NotificationDemo,而推过来的消息显示的是国付,这里我当时没注意,推送过来的消息显示的国付是在JPush后台设置的,设置之后生成的AppKey就和应用名称绑定了,不能更改。而我直接拿着AppKey做的这个demo,所以出现了这样的情况。

九、为何推送一条 APN 后,点击通知中心的 APN 通知打开 App,可是 APN 通知在通知中心依然存在而未被删除?

如果推送 APN 时,Badge number 被指定为0 ,则可能出现 APN 消息在通知中心被点击后,尽管调用了 [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; 但 APN 消息在通知中心不会被删除的情况。 这种情况可以按如下代码调用以清除通知中心的 APN 通知。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

如果仍有其他消息,则考虑清除 local notification 通知。
( [[UIApplication sharedApplication] cancelAllLocalNotifications] )


一般是给一个文字说明:请在手机[设置]-[通知]-[XX App]选择打开或关闭通知;

首先我得承认,看着极光推送iOS SDK文档,然后集成到项目中这个过程并不难,难的是集成之后的事。

版本记录

版本号 时间
V1.0 2017.05.15

APNs 通知是 只能在 App 处于后台或杀死时才能展示的。

财务类的中国建设银行,

十、出现Not get deviceToken yet. Maybe: your certificate not configured APNs?...错误日志时如何排除问题?

如果出现上述日志,则说明一段时间内都无法获取device token,那么:

  • 确认你的app配置了apns权限,如果未配置apns权限,则应该会出现此错误提示。
  • 确认你的app运行在ios真机而非模拟器上,且通知中心中对应app的通知权限没有完全关闭(alert/sound/badge至少有一个权限是打开的)。
  • 确认你的网络状况,与apple的服务器的连接是通过tcp的 5223端口连接,确认你网络的对应端口是否可用,可通过下列命令来确认这点:
telnet 1-courier.push.apple.com 5223

在代码中可在以下两个函数中断点以确认device token的获取状态。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;

如果app运行进入 didFailToRegisterForRemoteNotificationsWithError 则说明app的APNS权限问题或者app运行在模拟器,参考 证书设置文档。
如果app运行进入didRegisterForRemoteNotificationsWithDeviceToken 则说明运行正常,请确认你在此函数中的代码中有将token传递给jpush的调用:

[JPUSHService registerDeviceToken:deviceToken];
  • 如果以上两个registerRemoteNotification的函数都未进入, 请确认你的代码中有注册申请apns的函数调用:
[JPUSHService registerForRemoteNotificationTypes:];
  • 如果上述情况都已确认且未进入第4步的任意回调函数,则可以判断无法获取token的原因在于设备与apple的网络连通性问题(注:一个设备只有在未申请过token的情况下才会需要与apple的网络交互来获取token,已经获取过某一环境token的设备在无网络的情况下也能获取到对应环境的token(环境分为 开发/生产)),这种情况下切换网络能够在大部分情况下解决此问题。
  • 如果仍然有问题,请将上述步骤的结果以邮件附件的形式发送到JPush支持邮箱,我们将协助你解决此问题。

需要依靠 App 与极光服务器建立的长连接,所以 iOS 必须当 App 处于前台时才能接收到。

下面这个是当有消息推送过来,不去点击消息的情况,此时应用的右上角的徽章是不会去掉的。

前言

前一篇已经对ios的SDK进行了研究,这一篇则对iOS SDK 常见问题进行说明。
1. 极光推送集成(一)
2. 极光推送集成(二)
3. 极光推送集成(三)
4. 极光推送集成(四)
5. 极光推送集成(五)
6. 极光推送集成(六)
下面说一下iOS SDK 的常见问题。

客户端需要处于Background 或 Suspended 状态,被杀死后无法调起该方法。

我们这里暂时只讨论iOS 10之前的版本,如有朋友想做iOS 10的推送,可以看看下面这个链接极光博客:

十三、为什么日志里面会打印:You've implemented -[ <UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.

这个主要是提示开发者如果要支持UIBackgroundModes,需要开启Remote notifications,具体操作可以看:iOS 7 Background Remote Notification

文章引用自博客 :

  • 应用徽章数字叠加。设置badge为 1,这样每推送一条消息,在用户没有点击的情况下就会自动加1.

五、如何在接收到 APN 的时候获取 APN 消息内容并进行跳转或做出响应处理?

获取 APNs 推送内容


这里要注意的是 iOS 10 前台展示的代码方法 里面也有三种展示(alert、badge、sound)的选择,如果没有写 alert ,那么也是不会有横幅提醒的。

图片 4中国建设银行消息页面

二、iOS 如何推送自定义声音

客户端需要将声音文件导入工程里,选中工程Target -> Build Phrases -> Copy Bundle Resources。

图片 5

自定义声音

服务端推送时,需要指定iOS 平台下的sound参数,具体传入的值是声音文件名+后缀。


这里需要说明的是:

图片 6处于前台状态时.gif图片 7处于后台状态时.gif图片 8处于关闭状态时.gif

只接收,不展示,需要我们自己做接收处理,并且自己代码实现 消息的展示,或者转为本地通知来展示。

最后想说一句,这个是第一次集成三方的sdk到公司项目中,算是总结吧!如果有不对的地方,还请各位朋友多指教,谢谢!在这里,希望和大家一起交流,共同进步。

可以推送 Web页面、图片、声音等除普通文本之外更丰富的内容。

/** 当应用一开始启动时会从这个方法开始运行程序 */- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // ...此处省略部分代码 // 添加下面几行代码,判断是不是点击消息进来的 NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; if (remoteNotification) { // 点击消息进来的 BackgoundViewController *bVC = [[BackgoundViewController alloc]initWithRemoteNotification:remoteNotification]; UINavigationController *nav = (UINavigationController*) (self.window.rootViewController); [nav pushViewController:bVC animated:NO]; // 重置服务器端徽章 [JPUSHService resetBadge]; } return YES;}

仅支持 Android ,需要JPush Android SDK 1.8.0 及以上。

下面说说根据程序不同运行状态,点击推送过来的通知,跳转到指定的页面。

iOS :JPush 代理 Apple 官方的 APNs 通知。

图片 9不点通知正常状态.gif

1.极光要集成成功,要获得 registrationID ,需要 device token 。

当应用程序处于关闭状态时,也就是双击home键向上滑动退出应用。

"subtitle" : "JPush Subtitle" ,

图片 10将音频文件拖入工程图片 11设置sound参数

Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通知信息。

顺便说一下开发环境、生产环境及其对应关系:1. 开发环境:开发者证书-测试证书-Development证书2. 生产环境:发布证书-生产证书-Production证书开发环境证书和生产环境证书又有对应的Provisioning Profile描述文件。如果应用不上传到AppStore或者Ad Hoc的话,只要1的相关证书就ok了。

推送时,如果通知内容( alert )为空,那么收到推送时是默认不展示横幅的。

JPush 的应用内消息,会免费保留 5 条离线消息

请求在参数要求上基本正确——请求成功,返回 msgid (这条消息的 ID 标识),返回 200(成功)或由极光判断的推送失败(一般是 1011 找不到目标的错误);参数错误,有返回错误码。

通知栏的展示完全由 iOS 系统控制,左侧图片是自动获取的 App 图标,是不可动态改变的。

适用于在特定时间发出的通知,如一些 Todo 和闹钟类的应用,在每周、每月固定时间提醒用户回到应用查看任务。

极光处理该条请求,将这条请求发给苹果 APNs 服务器,一般都是秒内处理(非 VIP 通道偶尔可能会发生堵塞)。

1.通知

定时时间是自发送时算起,不受中间关机等操作的影响。

3.富媒体

推送的环境 必须与 App 的打包环境 一致

手机断网后,根据 Apple 的逻辑,是 只保存 1 条离线消息

iOS 10 新增了 delegate 协议方法,极光新版 SDK 封装了这两个方法来适配,有开发者想同时使用 JPush 的通知和苹果的通知来实现他们不同的需求,然后会发现,在 iOS 10 客户端只会走其中的一个方法,互相有冲突。

使用 JPush 中的通知,相当于使用苹果官方的通知推送。

间接实现的方法:

可以实现在前台展示 APNs 通知,实现willPresentNotification方法,前台收到 APNs 通知后就会走这个方法。

可能情况有:网络断开、网络环境有限制(内网)、某网络运营商连接不通畅。

APNs 服务器将这条消息推送到 iOS 设备上,这期间,可能会产生延迟;可能会因为证书问题、已卸载、token 失效、推送环境与设备环境不一致等情况由 Apple 判断为错误;没有问题时则会被设备收到,由 iOS 系统控制进行展示。

"title" : "JPush Title",

APNs 通知的几个特点

iOS 中也和 远程 APNs 通知一样,在不同的状态,不同的系统下,对应有几种获取消息的方法,App 被杀死也是可触发的。

有条件的消息提醒(譬如只让处在某一页面的用户看到该条消息)。

也可以调用反注册代码[[UIApplication sharedApplication] unregisterForRemoteNotifications];进行关闭。

测试时可尝试切换网络。

推送一般的 APNs 通知,客户端在 点击了通知栏消息之后才会调用对应的方法去获取到消息的内容, 点击图标进入 App 是无法获取到消息的

也可以用极光的置空别名/标签的方法去达到关闭通知的效果,相应的,置空期间的消息将不会收到。具体参见 Android 篇

自定义消息是应用内消息,跟apns无关

iOS 10 以下系统:

2.自定义消息

"alert" : {

iOS 需要在 delegate 类中注册通知并实现回调方法 networkDidReceiveMessage,详细看官方文档说明。

4.本地通知

首先了解极光这边的 2 个要求:

有必要勾选 background modes >remote Notification的选项,通知设置会增加 后台应用刷新按钮,这是 iOS 不点击通知栏依旧可以获取消息的必要选项,也是建立长连接的基础。

iOS 需要在前台展示消息时(iOS 10 新增接口之前)。

几个特点

2.极光控制台,必须要上传证书,推送时 iOS 才可以被点击。

"body" : "JPush Body"

自定义消息中携带定义好的 extras ,客户端收到后根据事先设定的规则去设置一个本地通知,用本地通知来展示这条消息

由 JPush iOS SDK 提供的应用内消息功能,此消息不经过 APNs 服务器,完全由 JPush 提供功能支持。

怎么让 App 收到自定义消息后,也显示横幅弹框,并显示在苹果手机的通知列表里呢?

iOS 10 的 alert 里面包括了 body 、title 、subtitle,后两者是可选的, body 为空则不展示。两种方式:

2.找朋友用付费账号生成一个生产环境证书,按照配置要求集成成功,在控制台上传好证书。那么在极光控制台或自行调用 API 都可以推送。

iOS 在手机端关闭通知和调用反注册代码对自定义消息的接收有影响吗?

如果需要在不点击通知栏的情况下,可以获取到消息内容,可以推送 Background Remote Notification,这类消息的规则是:

对 iOS 推送自定义消息无需考虑环境和证书问题。

APNs 通知的流程是这样的

与证书和环境有关:

如果我只需要用极光的自定义消息,还需要配置证书吗?毕竟制作证书需要付费参加 Apple 的开发者计划。

只要 Jpush 这边注册 ok了,获取到了registrationID,长链接建立起来,就可以收到。

同时发内容一样的自定义消息和 APNs 通知消息(APNs 用来展示,自定义消息用来取数据)

没有影响。

如果你想同时使用 Apple 官方的推送和极光的推送,在客户端只需要用极光代理的方法即可,来自 Apple 官方的推送,极光的代理方法也是可以正常处理的。

我们可以调用极光的 API 发起推送请求,也可以通过极光官网控制台推送。

completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);

"alert" : "hello, JPush!",或者

在前台点击通知消息后也走didReceiveNotificationResponse方法(即后台收到通知后,点击通知的回调方法)。

APNs 一般只做为通知提醒,譬如 IM,退到后台,收到消息提醒,点击进去后还是走应用内消息收取,确保不丢。(在极光这边也有提供 JMessage 即时通讯)

在 App 项目内的消息提醒。

极光就是封装的苹果的 APNs ,如果我们自己再封装 APNs ,两个地方封装的是相同东西的时候,肯定只有一个地方有效了。

此处判断手机断网,是指手机无法与 Apple 服务器进行连接。

笔者将基于官方说明与个人理解来谈一下这四种消息。本篇为 iOS 篇,Android 篇入口。

注:我们测试时若收不到消息,极光社区有总结一个完整的排查步骤,基本可以解决问题;如果自己排查不出,可以直接找官方帮忙查询,这里设备的 registrationID 和消息的 msgid 就是必须提供的信息。

苹果官网的证书、极光官网上传的证书、 App 打包的证书 必须完全一致

点击了展示该消息的通知栏,会再次调用 Background 方法。

该类消息被收到后,Background 方法就会被调用,获得信息内容。

但有一个影响是:iOS9 设备使用代码反注册 APNs ,再调用代码注册 APNs ,需要杀死应用后,再重新开启应用才会有 APNs 提示(这里可能与系统本身 bug 有关)。

不依赖于网络,无网也可以触发。

iOS 10 系统:

JPush 无法控制 APNs 通知的展示与否,不过如果你想实现关闭 APNs 通知,有如下方法:

},

本文由时时app平台注册网站发布于编程知识,转载请注明出处:推送多种艺术

关键词: