iOS消息推送APNS(Java实现HTTP/2协议发送)

 首先来了解一下苹果的消息推送APNS(英文全称:Apple Push Notification service)

先来看两张苹果对于推送的两张解释图:

大概的意思就是,提供商把消息推送至苹果的推送服务器,再由苹果推送服务器将消息推送给手机客户端,或者反过来手机客户端把消息推送至苹果推送服务器,再由苹果推送服务将消息推送至提供商。这里提到的提供商可以是像极光推送或其他供应商,亦或是自己的服务器。

这里提到了苹果推送服务器向手机端推送消息,那么它是怎么知道是推送到哪个手机上的呢,这个就汲及到一个Token的问题。

Token是每台iOS手机唯一的标识,在启动手机应用时,会向苹果推送服务器去请求得到唯一的Token。当然,虽然每次应用启动时都会去请求得到Token,但是针对于同一部手机,返回回来的Token值都是一致的。

所以当苹果推送服务器只要知道要推送给哪个Token即可知道是推送至哪个手机。

接下来看一下APNS如何去实现消息的推送

1.首先是要准备好证书

从你的苹果电脑上导出CSR文件,打开钥匙串-->钥匙串访问-->证书助理-->从证书颁发机构请求证书,然后一路输入邮件地址和保存的文件,保存到电脑,CSR文件就生成了。

到苹果开发者官网http://developer.apple.com,登陆进入到证书管理模块,Identifiers --> App IDs, 如果你的应用ID还没有添加进来,那么点右上角加号添加进来,如果已经加进来了,单击进入,进行设置,将Push Notifications 设成Enable.

在Certificates创建推送证书,生成后下载双击安装到电脑。这篇文章写的是HTTP/2无证书发送,所以不需要导出p12给服务器去发消息,只需要安装到mac就可以了。

由于推送需要用到真机,所以还需要Provisioning Profiles 证书,生成后也要在xcode中设置好。

2.给应用注册推送服务

  • 首先在项目的AppDelegate.m中加入以下两个代理方法
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    //获取终端设备标识,这个标识需要通过接口发送到服务器端,服务器端推送消息到APNS时需要知道终端的标识,APNS通过注册的终端标识找到终端设备。
    NSLog(@"My token is:%@", token);   
}  

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {   
    NSString *error_str = [NSString stringWithFormat: @"%@", error];   
    NSLog(@"Failed to get token, error:%@", error_str);   
}

  • 在AppDelegate.m的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入注册消息通知推送能力;加入当应用程序处于未启动状态时,判断是否由远程消息通知触发;加入清除消息推送通知标记。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  //判断是否由远程消息通知触发应用程序启动
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {
        //获取应用程序消息通知标记数(即小红圈中的数字)
        int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
        if (badge>0) {
           //如果应用程序消息通知标记数(即小红圈中的数字)大于0,清除标记。
            badge--;
          //清除标记。清除小红圈中数字,小红圈中数字为0,小红圈才会消除。
            [UIApplication sharedApplication].applicationIconBadgeNumber = badge;
        }
    }
    //消息推送注册
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
}

  • 在项目AppDelegate.m中加入消息接收处理代理方法。

//处理收到的消息推送
- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    //在此处理接收到的消息。
    NSLog(@"Receive remote notification : %@",userInfo);
}

3.Java后台苹果推送服务器推送消息(HTTP/2协议)

苹果官方自2021年开始就建议使用HTTP/2协议来发消息到苹果的推送服务器,我是2022年接到有客户的请求收不到信息了才去研究原来之前的发消息方法已经不能再用了,重新研究并写下JAVA发HTTP/2的方法。特别注意,需要 JDK 11 及以上版本才支持HTTP/2的协议,如果低于这个版本的朋友们请赶紧升级JDK吧。

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;

public class ApnsSendUtil {
	
	private static String APPID = "com.renhxyy.erp";
	
	private static String SANDBOX_SERVER = "api.sandbox.push.apple.com:443";
	private static String PRODUCT_SERVER = "api.push.apple.com:443";
	
	
	public static void main(String[] args) throws IOException, InterruptedException, InvalidKeyException, InvalidKeySpecException, NoSuchAlgorithmException, SignatureException {
		// 消息,参考:https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/generating_a_remote_notification
		String payload = "{ \"aps\" : { \"alert\" : \"邹宝珠的测试消息!\" } }";
		Integer statuCode = ApnsSendUtil.send("f215ffebd0b4cac54a6d944a498c209deb5b58b789fb26da08bbb30af8dc8440", false, payload);
		System.out.println(statuCode);
	}
	
	public static Integer send(String deviceToken, Boolean isProduct, String payload) 
			throws IOException, InterruptedException, InvalidKeyException, InvalidKeySpecException, NoSuchAlgorithmException, SignatureException {
		
		HttpClient client = HttpClient.newBuilder().build();

		HttpRequest request = HttpRequest.newBuilder()
				.uri(URI.create("https://" + (isProduct ? PRODUCT_SERVER : SANDBOX_SERVER) +"/3/device/" + deviceToken)) // deviceToken 从手机上获取到的设备 token
				.POST(BodyPublishers.ofString(payload)) // 发送的消息内容
				.setHeader("authorization", JWT.getToken()) // 请苹果接口的令牌,通过 JWT 生成,有时间有过期(好像是一个小时过期,所以不要去缓存它,每次请求时去重新生成一个就好)
				.setHeader("apns-id", "eabeae54-14a8-11e5-b60b-1697f925ec7a") // 可以理解成APP名称吧,符合格式即可,随意命名
				.setHeader("apns-push-type", "alert") // 消息的提示方式,alert 是指弹出横幅
				.setHeader("apns-expiration", "0")
				.setHeader("apns-priority", "10") // 10 表示立即发送
				.setHeader("apns-topic", APPID) //  APPID,和证书一致
				.build();

		HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());

		Integer statuCode = response.statusCode(); // 返回状态码,如果是 200 则表示发送成功

		if (statuCode == null || statuCode.intValue() != 200) {
			System.out.println(response.body()); // 如果返回的状态码不是200,则发送失败,response.body() 是错误的原因
		}
		
		return statuCode;
	}
	
	
	
	

}

可以参考苹果官方文档说明:

Apple Developer Documentation

附上 JAVA HTTP/2协议请求APNS的完整代码

iOS消息推送(Java实现HTTP/2协议发送APNS)-Java文档类资源-CSDN下载

效果图

备注:这篇文章没有对证书和APP端代码(即第1步和第2步)做详细的描述,网上有很多文章对这部分有详解。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: iOS消息推送 APNs 是指苹果公司提供的一种用于向移动设备发送远程通知的服务。而使用 Java 实现 HTTP/2 协议发送推送消息可以通过以下步骤完成。 首先,我们需要使用 Java 开发一个 HTTP/2 客户端,以实现APNs 服务器的通信。我们可以使用 okhttp、netty 或者 java-http-client 等库来实现这个客户端。 其次,我们需要获取 APNs 服务器的推送地址和凭证认证信息。推送地址常见的有两个,分别是开发环境和生产环境。在获取推送地址之后,我们还需要生成一个包含认证信息的 JWT(JSON Web Tokens),以进行身份验证。 然后,我们可以使用 Java 客户端向 APNs 服务器发送 HTTP/2 请求。请求的内容应包括推送通知的 payload 和设备的设备标识符(Device Token)等信息。设备标识符是由 APNs 服务器为每个设备生成的唯一标识符,用于指定接收消息的设备。 最后,我们可以根据 APNs 服务器的响应来判断推送是否成功。APNs 服务器会返回一个包含推送结果的响应,其中包括推送是否成功以及失败的原因。 总之,使用 Java 实现 HTTP/2 协议发送 iOS 消息推送 APNs,需要开发一个符合 HTTP/2 协议的客户端,生成凭证信息并发送请求。通过与 APNs 服务器的通信,可以将推送消息发送到指定的 iOS 设备上。 ### 回答2: iOS消息推送APNs)是苹果公司提供的一种服务,用于将推送通知发送iOS设备上的应用程序。实现APNs推送的一种方法是使用HTTP/2协议发送请求。 在Java中,可以使用一些第三方库来实现使用HTTP/2协议发送APNs消息推送。其中,使用Netty库是一个常见的选择。 首先,你需要引入Netty库的相关依赖项,并创建一个Netty的客户端连接。 然后,你需要创建APNs推送的请求和消息内容。APNs消息使用JSON格式进行发送,你需要构建一个JSON对象来包含推送的内容。这个内容可以包括通知标题、内容、图标等。 接下来,你需要将JSON对象编码为二进制数据,并发送APNs服务器。此时,你可以使用Netty库提供的HTTP/2的客户端请求来发送发送请求的过程包括建立连接、发送帧、处理响应等步骤。你需要设置请求的方法、URL、Headers以及Payload(即消息内容的二进制数据)。 最后,你需要在接收到APNs服务器的响应后,进行对应的处理和错误处理。常见的响应包括成功响应和错误响应。 总结起来,实现使用HTTP/2协议发送APNs消息推送的过程,包括建立连接、构建JSON消息、编码为二进制数据、发送请求、处理响应等步骤。通过使用Netty库,可以简化这个实现过程,并提供了更好的性能和可扩展性。 ### 回答3: 在iOS中,APNS(Apple Push Notification Service)是一种用于向苹果设备(如iPhone、iPad、iPod Touch等)推送消息的服务。而在Java中,可以使用HTTP/2协议实现发送APNS通知。 HTTP/2是一种基于HTTP/1.1的进化版本,其在性能和效率上有所提升。使用Java实现HTTP/2协议发送APNS通知的步骤如下: 1. 首先,需要准备APNS证书。在苹果开发者账号中创建一个推送证书,并将其导出为.p12文件。 2. 将.p12文件转换为Java可用的密钥和证书形式。可以使用Java的KeyTool工具来完成此步骤。 3. 使用JavaHTTP/2库,如Jetty或Netty,建立与APNS服务器的HTTP/2连接。这些库可提供与APNS服务器之间的双向通信。 4. 在建立连接后,可以使用HTTP/2的帧和流的概念向APNS服务器发送推送通知。可以使用Jetty或Netty提供的API来创建和发送HTTP/2帧。 5. 在发送通知时,需要将推送的相关信息,如设备令牌、推送内容等,封装为HTTP/2的帧数据发送APNS服务器。 6. APNS服务器收到推送请求后,会根据设备令牌等信息将通知推送给相应的设备。 总之,使用Java实现HTTP/2协议发送APNS通知需要准备证书、使用HTTP/2库建立连接,并利用API创建和发送HTTP/2帧,最后将推送信息发送APNS服务器。这样就可以通过HTTP/2协议iOS设备推送消息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kerryzb

你鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值