你有没有遇到过这种情况?早上手机突然弹出一条新闻提醒,说是某场比赛的比分更新了——这其实是远程推送在起作用。而当你设了个明天上午9点的会议提醒,即使没联网也能准时收到通知,这就是本地推送的功劳。
远程推送是什么
远程推送,也叫服务器推送,是由应用后台服务器主动发送的消息。比如微信收到新消息、淘宝下单成功提示、天气突变预警等,都是通过远程方式推送到你的设备上。
这类推送依赖网络连接。只要你的手机连着网,哪怕App不在前台运行,甚至被杀掉,系统依然能收到通知。实现原理是App在启动时向系统注册,并获取一个唯一的设备令牌(token),服务器拿着这个token通过苹果APNs或谷歌FCM等通道把消息发过来。
本地推送又是什么
本地推送完全由App自己在设备内部触发,不需要服务器参与。典型场景是你在记事本里设置了“下午3点吃药”,到了时间就会弹出提醒。这种通知是在你设定时就写进了系统通知队列,之后由操作系统按时唤起。
因为不依赖网络,所以即使飞行模式或者断网,本地推送照样能准时出现。但它也有局限:无法动态更新内容,也不能用来传递实时信息,毕竟它的一切规则都在你上次使用App时就已经定好了。
两者核心差异对比
触发来源不同:远程推送来自服务器,本地推送来自App自身逻辑。
网络需求不同:远程必须联网才能接收;本地一旦设置完成,离线也能触发。
使用场景不同:远程适合社交消息、订单状态、实时资讯;本地更适合定时提醒、闹钟、日程安排。
技术实现上的区别
以iOS为例,远程推送需要配置证书、搭建服务端逻辑,还要处理token刷新问题。而本地推送只需要在App内调用系统API即可:
// 本地推送示例(Swift)
let content = UNMutableNotificationContent()
content.title = "喝水提醒"
content.body = "别忘了喝一杯水!"
var dateComponents = DateComponents()
dateComponents.hour = 15
dateComponents.minute = 0
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
let request = UNNotificationRequest(identifier: "drink_water", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
相比之下,远程推送的代码虽然客户端简单,但后端要复杂得多:
// 简化的远程推送请求(Node.js + FCM)
const message = {
token: deviceToken,
notification: {
title: '新消息',
body: '你有一条未读聊天'
}
};
admin.messaging().send(message);
实际体验中的表现
有时候你会发现某些App的通知延迟了几分钟才到,尤其是安卓机上。这是因为系统为了省电会限制后台活动,远程推送可能被暂时搁置。而本地推送一般更准时,因为它直接挂在系统任务里。
另外,远程推送可以带操作按钮,比如“立即回复”“接听来电”,点击后跳转到具体页面;本地推送也能做类似交互,但数据固定,没法根据最新情况调整文案。
如何选择用哪种方式
如果你开发一个待办事项App,用户设置截止时间提醒,显然该用本地推送。如果是做直播平台,需要通知观众“主播开播了”,那就得靠远程推送及时触达。
有些App还会结合两者:先用本地推送提醒“记得打卡”,如果用户一直没打开,再通过远程推送补一刀,提高唤醒率。