*今天测试了一下Java 给iOS客户端推送消息,包括静默推送 ,还有别名推送,其实是和token绑定在一块的,别名推送是用于 有用户分群需求的应用,什么时候绑定token,什么时候解绑(用户退出登录,一个用户手机,平板多设备登录),
玩转推送后有很多问题都迎刃而解了,但是一波未平一波又起啊!又会有新的问题出现,先看看代码吧*
iOS

// 说明 这是在用户同意推送的前提上进行的,如果用户没有同意,那下面的都是扯淡了,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[[LY_NetWorking shareNetwork] checkNetworking];//这里要注意啊,注册一定写在 requestAuthorizationWithOptions 前面[application registerForRemoteNotifications];NSLog(@"launchOptions = %@",launchOptions);// 这里值兼容iOS 10以后UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];center.delegate = self;[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {NSLog(@"granted = %d",granted);}];return YES;
}// 这个方法就厉害了,在后台(前台也可以)可以接收到静默推送啊
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
{NSLog(@" userInfo-- %@",userInfo);// 这里可以写你想实现的逻辑,completionHandler(UIBackgroundFetchResultNoData);}
// iOS10新增:这个方法也厉害了,是什么,对,是接收消息前对消息的 提示类型进行设置,区分本地和远程通知哈
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{//UNNotificationPresentationOptionAlert 有提示,//UNNotificationPresentationOptionBadge 有角标completionHandler(UNNotificationPresentationOptionSound);
}
//iOS10新增:处理后台点击通知的代理方法
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
{completionHandler();
}
// token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken
{//正确写法NSString *deviceString = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];deviceString = [deviceString stringByReplacingOccurrencesOfString:@" " withString:@""];NSLog(@"deviceToken=%@",deviceString);
}
//获取DeviceToken失败
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{NSLog(@"[DeviceToken Error]:%@\n",error.description);
}

Java部分


package com.sir.Push;import java.io.File;
import java.util.ArrayList;
import java.util.List;import javapns.devices.Device;
import javapns.devices.implementations.basic.BasicDevice;
import javapns.notification.AppleNotificationServerBasicImpl;
import javapns.notification.PushNotificationManager;
import javapns.notification.PushNotificationPayload;
import javapns.notification.PushedNotification;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;/*** @author Sir* @version TODO*/
public class Server {private static Log log = LogFactory.getLog(Server.class.getName());/************************************************需要javaPNS_2.2.jar包 注意导包如果用JSON串的话,还有到 那几个包***************************************************//*** apple推送方法* @param tokens   iphone手机的 device-token* @param path p12文件 * @param password  p12所需要的密码* @param message 推送的内容* @param count 角标* @param sendCount 单发还是群发  true单发 false群发*/public void sendpush(List<String> tokens,String path, String password, String message,Integer count,boolean sendCount) {try {//message是一个json格式的串{"aps":{"alert":"iphone测试推送!"}}//这是一个 设置提示类型 的类PushNotificationPayload payLoad =  PushNotificationPayload.fromJSON(message);payLoad.addAlert("iphone测试推送ly3!   www.guligei.com"); //测试推送内容!payLoad.addBadge(count); // iphone角标payLoad.addSound("default"); // 铃声,默认PushNotificationManager pushManager = new PushNotificationManager();//true 正式推送 false测试推送pushManager.initializeConnection(new AppleNotificationServerBasicImpl(path, password, false));List<PushedNotification> notifications = new ArrayList<PushedNotification>(); // 发送push 消息if (sendCount) {            Device device = new BasicDevice();device.setToken(tokens.get(0));PushedNotification notification = pushManager.sendNotification(device, payLoad, true);notifications.add(notification);} else {            List<Device> device = new ArrayList<Device>();for (String token : tokens) {device.add(new BasicDevice(token));}notifications = pushManager.sendNotifications(payLoad, device);}List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);int failed = failedNotifications.size();int successful = successfulNotifications.size();if (successful > 0 && failed == 0) {System.out.print("推送成功:"+failedNotifications.toString());} else if (successful == 0 && failed > 0) {System.out.print("推送失败:"+failedNotifications.toString());} else if (successful == 0 && failed == 0) {System.out.print("推送失败:"+failedNotifications.toString());System.out.println("No notifications could be sent, probably because of a critical error");} else {System.out.print("推送失败:"+failedNotifications.toString());}// pushManager.stopConnection();} catch (Exception e) {e.printStackTrace();}}/*** TODO* @param args*/public static void main(String[] args) {Server send=new Server();List<String> tokens=new ArrayList<String>();tokens.add("cdc11cfbc06e421db828c330b16374137e57c9b8cb5916e85f5e1bfabfda9586");String path="dev_push.p12";String password="1234";//普通推送 在里面添加定义的字段,
//      String message="{'aps':{'alert':'测试test'}}";// 静默推送一定有 'content-available': 1,String message="{'aps':{'content-available': 1}}";Integer count=1;boolean sendCount=false;send.sendpush(tokens, path, password, message, count, sendCount);}}

最近在研移动客户端 与 Java 后台的通信方式
一般移动端访问是通过get,post与服务器通信,但是这种半双工通信有个明显的缺点,那就是服务器不能主动发消息给客户端,必须是客户端请求,服务器回答模式,这样有时候就会满足不了我们的需求
*我总结了一下 有这样几种我知道的方式
1,Websocket ,不太熟悉 应该与socket 差不多哦

2,socket 客户端与服务器维持一个长连接(如何维护如此多的长连接,如果应对大规模的消息下发以及后续针对下发消息的各种统计动作都是技术难点),

3,推送,也是可以让服务器给客户端发消息的(现在应用一般都是全平台的,发送一条消息,应该同时发送给Android,iOS, WinPhone,Android端走自建的TCP长连接通道,iOS与WinPhone走自家的系统推送通道。那么意味着你服务端要维护这三套推送系统。显然对于小团队,要独自建立一套消息推送系统的难度非常大,所以市场上涌现出很多优秀的推送产品,帮开发者聚合这些推送方式,并提供统一的推送接口。国外如 Urban Airship, Parse等, 国内有JPush,百度云推送,信鸽)*

4,心跳包也能算一种,但是不好(时间太短对服务器压力大,太长链接不稳定,iOS后台还有很多限制),

在此之上,有衍生出针对消息的发布/订阅模型
客户端可以订阅某一个Topic,服务端根据Topic找到对应的Channel进行批量的消息下发。所有的客户端隐式的订阅的all这个opic,所以『类似中国移动给全网信号内所有手机发消息的模式』亦可以理解『广播消息』

移动客户端与服务器通信方式一相关推荐

  1. Unity与服务器通信方式有哪些?

    Unity与服务器通信方式: 一.WWW:(短连接) 二.Network: 三.Socket(套接字): 四.Photon:(长连接) 五.第三方: 一.WWW:(短连接) 二.Network: us ...

  2. 服务端php的更新手游客户端,PHP服务器安卓app下载|PHP服务器下载1.11.3 官方移动客户端-PHP服务器官方移动客户端1.11.3-蜻蜓手游网...

    PHP服务器应用详情 PHP 5.4+以及7+版本拥有如下模块:core, date, ereg, libxml, openssl, pcre, sqlite3, zlib, bcmath, bz2, ...

  3. Flex4之与后台服务器通信方式:URLRequest+URLLoader【JAVA方式】

    这次说的URLRequest是ActionScript和服务端通信的最基本方式 要实现ActionScript与服务端交互, 首先必须知道以下几个类: URLRequest类 记录请求服务端的URL信 ...

  4. Python作为移动客户端后台服务器

    python+flask实现服务器: 安装python和flask略过,servicestest.py代码: from flask import Flask, jsonifyapp = Flask(_ ...

  5. LoRaWAN网关如何工作?集中器、运行程序、服务器缺一不可

    目录 一.技术基础 二.LoRaWAN网关构成 1.集中器 2.主机 3.外壳 三.LoRaWAN网关工作通信链 1.LoRa Packet forwarder 2.LoRaWAN服务器 3.回程连接 ...

  6. web浏览器与网站服务器,Web浏览器如何与Web服务器通信

    Web浏览器如何与Web服务器通信  在理解Web优化的必要性之前,要先知道问题根源所在--浏览器和服务器通信方式的基本属性导致了这个问题,如图1-2所示. 图1-2 用户向example.com发送 ...

  7. token 的设计方案

    作者:做个前端 链接:https://www.jianshu.com/p/e07f51c5c8bd 网上关于移动客户端与服务器数据传输之间的 token 的细节使用好像都没有详细的说明,基本都是一笔带 ...

  8. iOS应用签名原理--数字签名?代码签名?双层代码签名?

    数字签名 数字签名(又称公钥数字签名.电子签章等)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名通常定义两种互补的运算,一个用于签名,另一个 ...

  9. java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...

    使用Java从客户端套接字读取数据(Read data from a client socket in Java) 我编写了从客户端套接字发送/接收数据的代码. 发送数据步骤已成功完成,但是当我想从套 ...

最新文章

  1. R语言manova函数进行多元方差分析(Multivariate analysis of variance 、MANOVA)、如果多变量检验结果有显著性,summary.aov函数锦欣单变量方差分析
  2. java求最小步数,使数组值相等的最小步数 Minimum Moves to Equal Array Elements
  3. linux服务器dns配置丢失处理
  4. Android 学习之pull解析Xml
  5. Google首席科学家谈Google是怎么做深度学习的
  6. python维度扩展_在TensorFlow中实现矩阵维度扩展
  7. linux 命令/目录 名称 英文单词 缩写 助记
  8. PDB调试Python程序
  9. java输入正数和负数并计算个数
  10. 倒计时_考研倒计时30天,拼了
  11. Linux 线程调度与优先级
  12. 龙星电脑横机制版软件_龙星制版软件下载 龙星电脑横机是什么系统
  13. 【板栗糖GIS】工作疑难—win11如何解压z01分解卷压缩包
  14. 戴尔服务器bios进不去系统,戴尔电脑进不了系统和BIOS
  15. ps人物素描及黑白上色
  16. win10系统重装(无需u盘)(无需下载第三方软件)(绝对纯净版)(全网最简)
  17. IDEA启动卡在preparing workspace
  18. 文石c67ml carta(firmware:1.8.2)如何全屏看pdf书籍
  19. 安装SSL证书可以解决浏览器提示的不安全警告
  20. python nonlocal 的应用

热门文章

  1. python socket模块[errno 113_error:
  2. NOIP2015提高组 信息传递(图论)
  3. Python海龟绘图,画花朵
  4. mysql和python先学哪个_Python之路-python(mysql介绍和安装、pymysql、ORM sqlachemy)
  5. html怎么把背景换成相片,怎么给照片换背景 图片后期处理把阴沉天空背景换成云彩背景...
  6. 桂林银行携手华为,做“好山水”里的“好银行”
  7. 《Cisco防火墙》一6.5 虚拟防火墙的管理访问
  8. 视频和图片合成软件,简单快速合成视频和图片
  9. Java生鲜电商平台-异常模块的设计与架构
  10. Java生鲜电商平台-订单架构实战