APNs的学习和使用

Android 报错 connection closed before response completed.解决方案 一、问题描述: 在安卓端调取WCF服务,结果报错连接提前关闭。 说明:我有一个基类,继承基类后有一个派生类,在调取wcf服务接口的时候,我返回结果其中一个参数,是基类类型,给基类赋值的对象是派生类类型。如果把返回结果的类型改成派生类类型,不报错,但是如果返回结果的类型是基类,则ANdroid端抛异常。 二、解决方案: 简单来说,就是在父类及衍生类那里做特性说明,这样作为结果返回的实体类才能被序列化,并且在父类处标记衍生类名称,这样系统才能知道这是衍生类。 --特性说明 [DataContract] [Se 阅读详情
    
APNs(英文全称:Apple Push Notification service),中文翻译为:苹果推送通知服务。 该技术由 苹果公司提供的APNs服务。
苹果推送通知服务的传输和路由的通知从一个给定的供应商给定的设备。通知是由两个主要部分组成的数据:设备令牌和有效载荷的短消息。设备令牌是类似于一个电话号码,它包含的信息,使的APN定位的设备上安装客户端应用程序。APN还用它来验证通知的 路由。 有效载荷是一个JSON定义的属性列表中指定的设备上的应用程序的用户将被提醒。

    APNs在java的使用,这篇文章非常有效

APNs入门学习和使用

https://www.jianshu.com/p/bcdf0c609f7d

作者:Coselding

基本对着这个就能写出基本的APNs实例,本文主要讨论代码编写过程中出现的问题

    1.java.lang.NoClassDefFoundError: sun/security/ssl/EllipticCurvesExtension

假如你已经加了java虚拟机参数


里面的alpn-boot-8.1.12.v20180117.jar是用来替换虚拟机中的jar包的,这时候出了异常,异常信息可能如下:

[nioEventLoopGroup-2-1] WARN io.netty.handler.ssl.ApplicationProtocolNegotiationHandler - [id: 0x548cffb1, L://*你的ip*/:11364 - R:api.development.push.apple.com/17.188.166.29:443] Failed to select the application-level protocol:
java.lang.NoClassDefFoundError: sun/security/ssl/EllipticCurvesExtension
	at sun.security.ssl.ClientHandshaker.getKickstartMessage(ClientHandshaker.java:1526)
	at sun.security.ssl.Handshaker.kickstart(Handshaker.java:1061)
	at sun.security.ssl.SSLEngineImpl.kickstartHandshake(SSLEngineImpl.java:734)
	at sun.security.ssl.SSLEngineImpl.beginHandshake(SSLEngineImpl.java:756)
	at io.netty.handler.ssl.JdkSslEngine.beginHandshake(JdkSslEngine.java:147)
	at io.netty.handler.ssl.SslHandler.handshake(SslHandler.java:1360)
	at io.netty.handler.ssl.SslHandler.channelActive(SslHandler.java:1399)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:223)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:202)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelActive(DefaultChannelPipeline.java:1322)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:223)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.DefaultChannelPipeline.fireChannelActive(DefaultChannelPipeline.java:902)
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:311)
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:341)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:627)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:551)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:465)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:437)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
	at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
	at java.lang.Thread.run(Thread.java:748)
[nioEventLoopGroup-2-1] INFO com.relayrides.pushy.apns.ApnsClient - Failed to connect.
java.lang.IllegalStateException: Channel closed before HTTP/2 preface completed.
	at com.relayrides.pushy.apns.ApnsClient$2.operationComplete(ApnsClient.java:412)
	at com.relayrides.pushy.apns.ApnsClient$2.operationComplete(ApnsClient.java:404)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:514)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:488)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:427)
	at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:111)
	at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:82)
	at io.netty.channel.AbstractChannel$CloseFuture.setClosed(AbstractChannel.java:1058)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.doClose0(AbstractChannel.java:686)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:664)
	at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:607)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.close(DefaultChannelPipeline.java:1276)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:634)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:618)
	at io.netty.channel.ChannelOutboundHandlerAdapter.close(ChannelOutboundHandlerAdapter.java:71)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:634)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:618)
	at io.netty.handler.ssl.SslHandler$8.operationComplete(SslHandler.java:1437)
	at io.netty.handler.ssl.SslHandler$8.operationComplete(SslHandler.java:1428)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:514)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:488)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:427)
	at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:170)
	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:93)
	at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:28)
	at io.netty.handler.ssl.SslHandler.safeClose(SslHandler.java:1428)
	at io.netty.handler.ssl.SslHandler.closeOutboundAndChannel(SslHandler.java:1259)
	at io.netty.handler.ssl.SslHandler.close(SslHandler.java:449)
	at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:634)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:618)
	at io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:475)
	at io.netty.handler.ssl.ApplicationProtocolNegotiationHandler.exceptionCaught(ApplicationProtocolNegotiationHandler.java:122)
	at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:295)
	at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:274)
	at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:266)
	at io.netty.handler.ssl.SslHandler.exceptionCaught(SslHandler.java:743)
	at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:295)
	at io.netty.channel.AbstractChannelHandlerContext.notifyHandlerException(AbstractChannelHandlerContext.java:862)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:225)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:202)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelActive(DefaultChannelPipeline.java:1322)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:223)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:209)
	at io.netty.channel.DefaultChannelPipeline.fireChannelActive(DefaultChannelPipeline.java:902)
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:311)
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:341)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:627)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:551)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:465)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:437)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
	at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
	at java.lang.Thread.run(Thread.java:748)
[nioEventLoopGroup-2-1] WARN io.netty.handler.ssl.ApplicationProtocolNegotiationHandler - [id: 0x548cffb1, L:/192.168.2.71:11364 ! R:api.development.push.apple.com/17.188.166.29:443] TLS handshake failed:
java.nio.channels.ClosedChannelException
	at io.netty.handler.ssl.SslHandler.channelInactive(...)(Unknown Source)

每个alpn-boot包都对应一个单独的jdk版本,并且严格对照版本,因此需要找到对应jdk版本的包,下面是包与jdk的对照表:


具体参照https://www.eclipse.org/jetty/documentation/current/alpn-chapter.html

看网上说用

jetty-alpn-agent-2.0.6.jar  
可以自动选择与jdk版本对应的包

2.slf4报错

pushy依赖于slf4j-api的包,但是并没有slf4j的具体实现,因此会出现如下错误:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

这时只需要添加slf4j-simple的依赖就可以了

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-simple</artifactId>
	<version>1.7.25</version>
</dependency>

3.消息发送阻塞

	final Future<PushNotificationResponse<SimpleApnsPushNotification>> sendNotificationFuture = apnsClient.sendNotification(pushNotification);
final PushNotificationResponse<SimpleApnsPushNotification> pushNotificationResponse = future.get();

如果有多条消息发送,在下一条消息发送之前,只能等上一条消息发送之后得到响应才能发送下一条消息,这无疑是相当耗费时间的,如果想并行的发送消息,就是其他文章说的异步回调方式,可以用:

final PushNotificationResponse<SimpleApnsPushNotification> pushNotificationResponse = future.getNow();
这样的话不用等消息发送后得到响应才发送下一条消息了


贴一下项目代码

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.SSLException;

import com.relayrides.pushy.apns.ApnsClient;
import com.relayrides.pushy.apns.ApnsClientBuilder;
import com.relayrides.pushy.apns.PushNotificationResponse;
import com.relayrides.pushy.apns.util.ApnsPayloadBuilder;
import com.relayrides.pushy.apns.util.SimpleApnsPushNotification;
import com.relayrides.pushy.apns.util.TokenUtil;

import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;

public class MyApnsClient {
	static ApnsClient apnsClient;

	/*
	 * static URL url = MyApnsClient.class.getClassLoader().getResource("dev.p12");
	 * static File file = new File(url.getFile());
	 */
	public static void main(String[] args) {
		try {
			//并行线程数
			EventLoopGroup loopGroup = new NioEventLoopGroup(4);
			//建立apns的客户端,可添加自己写的监听类,实现ApnsClientMetricsListener接口
			apnsClient = new ApnsClientBuilder().setEventLoopGroup(loopGroup)
					.setMetricsListener(new MyApnsClientListener())
					.setClientCredentials(new File("G:\\path\\test.p12"), "123456").build();
			//设置apns服务器host
			final Future<Void> connectFuture = apnsClient.connect(ApnsClient.DEVELOPMENT_APNS_HOST);
			// 设置等待时间,可抛出中断异常
			connectFuture.await();
			//connectFuture.await(10, TimeUnit.MINUTES);
			List<SimpleApnsPushNotification> pushNotifications=new ArrayList<SimpleApnsPushNotification>();
			for(int i=0;i<10;i++) {
				final SimpleApnsPushNotification pushNotification;
				{
					//消息的载体
					final ApnsPayloadBuilder payloadBuilder = new ApnsPayloadBuilder();
					payloadBuilder.setAlertBody("hello world");
					payloadBuilder.setSoundFileName("system_sing.mp3");
					payloadBuilder.setBadgeNumber(1);
					payloadBuilder.setContentAvailable(true);
					final String payload = payloadBuilder.buildWithDefaultMaximumLength();
					//设备的唯一标识号devicetoken
					final String token = TokenUtil
							.sanitizeTokenString("your device token");
					pushNotification = new SimpleApnsPushNotification(token, null, payload);
				}
				pushNotifications.add(pushNotification);
			}
			for(SimpleApnsPushNotification pushNotification:pushNotifications) {
				//发送信息得到回应的实例,是异步的,会立马创建一个实例,但可能是发送未成功的状态
				final Future<PushNotificationResponse<SimpleApnsPushNotification>> sendNotificationFuture = apnsClient
						.sendNotification(pushNotification);
				sendNotificationFuture.addListener(
						new GenericFutureListener<Future<PushNotificationResponse<SimpleApnsPushNotification>>>() {

							@Override
							public void operationComplete(
									Future<PushNotificationResponse<SimpleApnsPushNotification>> future) throws Exception {
								final PushNotificationResponse<SimpleApnsPushNotification> pushNotificationResponse = future
										.getNow();
								if (pushNotificationResponse.isAccepted()) {
									System.out.println("Push notification accepted by APNs gateway.");
								} else {
									System.out.println("Notification rejected by the APNs gateway: "
											+ pushNotificationResponse.getRejectionReason());

									if (pushNotificationResponse.getTokenInvalidationTimestamp() != null) {
										System.out.println("\t…and the token is invalid as of "
												+ pushNotificationResponse.getTokenInvalidationTimestamp());
									}
								}
							}
						});
			}
			final Future<Void> disconnectFuture = apnsClient.disconnect();
			try {
				disconnectFuture.await();
				if (disconnectFuture.isSuccess()) {
					System.out.println("连接关闭");
				}
			} catch (InterruptedException e) {
				System.out.println("Failed to disconnect APNs , timeout");
				e.printStackTrace();
			}
		} catch (SSLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			System.out.println("Failed to connect APNs , timeout");
			e.printStackTrace();
		} /*
			 * catch (ExecutionException e) {
			 * System.err.println("Failed to send push notification."); if (e.getCause()
			 * instanceof ClientNotConnectedException) {
			 * System.out.println("Waiting for client to reconnect…"); try {
			 * apnsClient.getReconnectionFuture().await(); } catch (InterruptedException e1)
			 * { System.out.println("Failed to connect APNs , timeout");
			 * e1.printStackTrace(); } System.out.println("Reconnected."); }
			 * e.printStackTrace(); }
			 */
	}

}

APNs入门学习和使用 本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/12/01/APNs入门学习和使用/APNs入门学习和使用这篇文章费了我好多心血啊,这都是在我测试了一堆失败的代码,看了大量的博客之后,把其中最有用,最精华的部分提取出来的集成,也是我艰辛的踩坑历程,满满的干货啊!可能是我太渣了,这些东西以前都没接触过,所以下面会有很多很基础的东西, 阅读详情

相关推荐

APNs工具App推荐,适合APNs开发使用

APNs工具App推荐,适合APNs开发使用 最近在调试APNs功能时,通过服务器下发消息太慢了,也很麻烦,之前都是自己从网上找APNs服务器代码,用过Java版、C#、Node.js、Python等等,过一段时间会出现项目运行不起来,可能是环境被破坏了,或者就是项目被我清理删除了,每次想项目时都可能要从网上找代码。例如Java版,作为一个iOS开发,每次都要配置很长时间,还经常报错不知道...

zhaowei_yingzi的博客 3285

Java整合APNS推送消息-IOS-APP(基于.p12推送证书)

/ "title":"标题",// i0S7、8 资置无,i0S9 一严资为appName。// "subtitle":"子标题", // 一般用title就能满足篇求。// "sound":"default",// 声音。// "userinfo":{// 通知消息内容。// "badge":"1",// 角标数。

IT_0417的博客 3099

APNS导致消息丢失和发送效率原因

首先说明一下,本文只是介绍一些容易被开发者忽视,而导致性能低下问题。并不是介绍如何向苹果设备成功发送一条消息,这里假设所有阅读者已经能够向苹果服务器发送消息,并且成功接收,只是发送效率比较低,并且丢失率很高。如果你不是此类情况,那么绕道吧。PS:伸手党可以直接看标红部分(结论) 最近参与并且完成了公司1000W级的消息推送服务平台重建。此次重构级别解决了消息丢失,并且大幅度提升了推送效率。

D的专栏 1万+

HTTP/2 协议用于 iOS 推送提醒服务 (APNS)

苹果最近更新了他们的推送提醒服务协议,APNS。这个新版本的协议基于HTTP/2和JSON,相比于旧的二进制协议,新的协议有了巨大改进。新的APNS协议基于HTTP/2: 新的特性和功能: 基于JSON的请求和响应 对于每个通知,如果成功响应,将会返回200标识 不用再去猜测通知是否被接收到 响应错误将会以JSON字符的形式返回 消息的长度从2048个字节增加到4096个字节 连接状态可以通过

Rodgexue的专栏 7476

iOS边城之推送APNS详解

待编辑

mokai 8516

苹果推送机制(APNS)

苹果推送机制(APNS)苹果推送通知服务 (简称APNs) 是实现远程通知功能的主要内容. 它是一项将信息发送至 iOS 设备 (间接至 watchOS ), tvOS, OS X 设备强大且高效的服务. 每个设备都与 APNs 建立了一个可信任的加密的 IP 链接, 并使用这个持续链接来接受通知. 如果一个 app 有新的通知到达而这个 app 没有运行时, 设备会弹出提示框来告诉用户这个 ap

_understand的博客 1393

channel 进阶

从『Channel 是什么?』中,我们已经清楚 channel 的基本使用以及其参数说明,下面,我们来继续学习它的更深入一点的知识。

不近视的猫的博客 1万+

使用PHP实现APNS推送通知的方法

通过APNS,开发人员可以向用户的设备推送通知消息,以提醒用户或向其发送重要信息。使用PHP实现APNS推送通知相对简单,通过建立与APNS服务器的安全连接,并构建合适的推送通知内容,我们可以向iOS设备发送远程通知。记得在实际应用中替换相应的证书文件路径和密码,以及设备的标识符。首先,我们需要创建一个SSL证书,这将用于与APNS服务器进行安全通信。确保你将证书文件保存在安全的位置,并记住证书的密码。一旦与APNS服务器建立连接,我们就可以构建推送通知并将其发送到设备。替换为你的证书密码。

WkpzScratch的博客 581

苹果推送机制APNs(一)

推送是解决轮询所造成的流量消耗和电量消耗的一个比较好的解决方案,在Android上,虽然Google提供了GCM(之前为C2DM),但在国内基本等于没用,各大Android应用基本都自己架设推送Server或是使用第三方推送平台,例如新浪微博使用第三方推送平台“个推”(非广告)。今天要学习的是苹果提供的推送服务APNs(Apple Push Notification services)基本原理...

dcj3sjt126com的专栏 139

【自由谈】城域网IPv6过渡技术——MAP技术(1)

在IPv4向IPv6网络演进的浪潮中,存在着两对主要矛盾的较量,一对是IPv4地址短缺和IPv4业务蓬勃发展之间的矛盾,另一对是IPv6海量的地址空间和IPv6应用的匮乏之间的矛盾。同时两对矛盾又互相制约,IPv4地址共享机制似乎又减缓了IPv6产业链的发展,IPv6产业链的不断发展似乎又在考验着IPv4地址共享机制的部署规模。MAP成为目前兼顾IPv4和IPv6的4voer6场景中最为关注的技术。

韩立金自由谈 3021

保姆级教程:用海思PQTool搞定ISP图像调试,从参数读取到固件烧录全流程

本文提供海思PQTool的ISP图像调试全流程指南,从参数读取、实时调试到固件烧录,涵盖环境配置、核心功能解析、参数固化及生产部署。通过实战案例和避坑指南,帮助开发者高效提升图像质量,适用于海思开发板的ISP调试与优化。

weixin_30872337的博客 279

IOS开发之实现App消息推送

好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适) 第一部分

SCC1123的博客 568

RP Fiber Power 版本

RP Fiber Power的版本历史 该软件一直受到多年来广泛的发展计划,这大大扩展了其功能,以及用户界面的质量。 V1 这是第1个版本。 它仅限于光纤激光器和放大器的连续波计算,并且只能通过脚本进行控制。 V2 版本2引入了交互式表单。 至少对于更简单的模拟,现在可以简单地通过填写表单来工作,而V1必须通过脚本来控制。 例如,屏幕截图显示了输入某些信号参数的表单: 当您基于这些表单执行计算时,程序将根据您的表单输入自动编写脚本文件,然后执行该脚本。如果您需要编写脚本以获得更大的灵活性,可以稍后查看该脚

Asdmath的博客 2431

ios之远程推送

好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适) 第一部分 首先第一

陈大牛的博客 494

RTOS与Linux功能差异与应用场景全面对比

在嵌入式系统的开发中,操作系统的选择至关重要。和是两种广泛应用的操作系统,它们在功能、设计目标以及应用领域中各具优势。随着嵌入式系统的不断发展,已成为嵌入式行业的大趋势。那么,这两者到底有什么不同呢?

硬核科技 400

Python爬虫教程:微博热点话题抓取与社交媒体分析

微博是中国最大的社交媒体平台之一,拥有海量的用户和丰富的讨论话题。通过爬取微博的热门话题和讨论内容,我们可以深入分析用户的兴趣、舆论走势、社会情绪等。通过爬取微博的热点话题和讨论内容,我们可以获得关于当前热门话题的宝贵数据,并基于这些数据进行多种社交媒体分析。本文将通过Python爬虫技术,详细介绍如何抓取微博上的热门话题、话题讨论内容,并进行社交媒体分析。希望本文为你提供了一个全面的微博数据抓取与分析的指南,帮助你在社交媒体数据分析的道路上迈出坚实的第一步。微博上的一些页面内容是静态的,可以直接通过。

2201_76125261的博客 589

APNs详细使用步骤

1. 什么是推送通知 消息通知分本地通知和远程推送通知,是没有运行在前台的应用程序可以让它们的用户获得相关消息通知的方式。消息通知可能是一条消息,即将发生的日历事件,或远程服务器的新数据。当被操作系统显示时,本地通知和推送通知看起来一样。它们可以显示一个警告信息或在应用程序的图标上面显示一个徽标。它们也可以在警告窗或徽标显示时播放一段声音。推送通知是在 iOS 3.0 和 Mac...

dongfuxiu4634的博客 2193

使用Python爬虫获取Facebook帖子和评论数据

Web爬虫是用于自动抓取网页数据的程序。它通过发送HTTP请求,获取网页的HTML源代码,再对源代码进行解析,提取所需的内容。爬虫常用于数据收集、信息提取、数据分析等应用。

2201_76125261的博客 1998

Java整合APNS

序言 这里主要从代码层面展示下,如何整合APNS。并用该demo进行远程消息的发送 参考资料: https://blog.youkuaiyun.com/m0_37954663/article/details/106797376 3 https://blog.youkuaiyun.com/qq_28483283/article/details/80514161 2 https://www.jianshu.com/p/d...

难得糊涂 3665

《HiVT: Hierarchical Vector Transformer for Multi-Agent Motion Prediction》论文阅读之HiVT

目录摘要1.介绍2.相关工作3.方法3.1. 总体框架3.2 场景表示 3.3 分层向量Transformer3.3.1 局部编码器3.3.2 全局交互模块3.3.3 多模态未来解码器3.4 训练4.实验4.1 实验设置4.2 消融研究 4.3. 结果5.结论 准确预测周围交通参与者的未来运动对于自动驾驶车辆的安全至关重要。最近,矢量化方法由于能够捕捉交通场景中的复杂交互而在运动预测领域占据主导地位。然而,现有的方法忽略了问题的对称性并且受到昂贵的计算成本的影响,面临着在不牺牲预测性能的情况

Gavinmiaoc的博客 3339

Simulink实例--电动汽车充电站与微电网协同运行仿真

​电网负荷剧增:单站1000台车同时充电需150MW功率(超配电网容量30%)​能源孤岛问题:传统充电站仅作为单向负荷,无法参与电网调频​可再生能源消纳:光伏/风电波动导致充电站功率波动±40%​多目标矛盾:充电效率、电网稳定性、设备寿命的协同优化​节能效果:每百万辆车年节电1.8GWh​成本回收:投资回报周期<4年(IRR>25%)​减排效益:每年减少CO₂排放12万吨。

xiaoheshang_123的博客 330

【亲测免费】 使用 Flutter 实现 APNS 推送的指南:基于 flutter-apns

使用 Flutter 实现 APNS 推送的指南:基于 flutter-apns 项目介绍 本项目 flutter-apns 是一个用于 Flutter 应用在 iOS 平台实现 Apple Push Notification Service (APNS) 的插件。它允许开发者轻松集成并管理推送通知服务,解决了旧版 flutter_apns 插件迁移及已知问题。通过使用此插件,你可以为你的 Flu...

gitblog_00154的博客 1086

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

iOS APNS

iOS APNS一、开启APNS二、代码实现三、Extension四、数据共享四、文件共享 一、开启APNS 1.创建证书 见证书创建 2.Xcode 设置 开启后台状态模式 二、代码实现 1.注册APNS 在需要实现的类中注册apns,非必需AppDelegate。 -(void)requestAPNS:(void(^)(BOOL grant))finish{ UNUserNotificationCenter *center = [UNUserNotificationCenter cu

mky200709011012的博客 1302

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

APNS苹果远程推送

什么是APNS? 苹果推送通知服务(APNs)是推送通知的网关,iPhone ipad 对于应用程序在后台运行有诸多限制,考虑到手机电池电量,应用不允许在后台进行过多的操作。因此,当用户切换到其他程序后,原先的程序无法保持运行状态。对于那些需要保持持续连接状态的应用程序(比如社区网络应用),将不能收到实时的信息。推送是解决轮询所造成的流量消耗和电量消耗的一个比较好的解决方案 为解决这一限制,苹果推...

CoderZS的博客 1916

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IOS学习笔记40——苹果推送机制APNs(一)

推送是解决轮询所造成的流量消耗和电量消耗的一个比较好的解决方案,在Android上,虽然Google提供了GCM(之前为C2DM),但在国内基本等于没用,各大Android应用基本都自己架设推送Server或是使用第三方推送平台,例如新浪微博使用第三方推送平台“个推”(非广告)。今天要学习的是苹果提供的推送服务APNs(Apple Push Notification services)基本原理

Ryan's zone 3万+
下一篇: APNS推送的另一种更简易的方式--javaPNS
java_1797431119
博客等级 码龄9年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值