ios swift开发--ios远程推送通知配置


远程推送通知(Push Notifications)在 iOS 平台上是免费提供的,但需要一些准备工作。以下是开通和使用远程推送通知的基本步骤:

开通远程推送通知

注册 Apple Developer Program:
访问 Apple Developer 并注册一个开发者账号。个人开发者账号是免费的,但如果你想发布应用到 App Store,需要支付 99 美元/年的费用。
创建和配置 App ID:
登录 Apple Developer 账号,进入 Certificates, Identifiers & Profiles。
创建一个新的 App ID,并启用“Push Notifications”服务。
创建和下载推送证书:
在同一页面中,创建一个新的推送证书(Push Notification SSL Certificate)。
下载并安装证书,以便在你的服务器上使用。
配置 APNs 证书:
将下载的推送证书导出为 .p12 文件。
将 .p12 文件转换为 .pem 文件(可选,取决于你的服务器需求)。
在 Xcode 中配置项目:
打开你的 Xcode 项目。
选择项目的 Target,进入“Signing & Capabilities”选项卡。
添加“Push Notifications”功能。
确保你的 App ID 和 Team 都正确配置。
代码示例

以下是一个简单的示例,展示如何在 iOS 应用中注册和接收远程推送通知:

请求推送通知权限

import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 请求推送通知权限
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
            if granted {
                print("通知权限已授予")
            } else {
                print("通知权限被拒绝")
            }
        }

        // 注册推送通知
        application.registerForRemoteNotifications()

        return true
    }

    // 处理远程推送通知的注册
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
        let token = tokenParts.joined()
        print("Device Token: \(token)")

        // 将设备令牌发送到你的服务器
        sendDeviceTokenToServer(deviceToken: token)
    }

    // 处理远程推送通知的注册失败
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Failed to register for remote notifications: \(error.localizedDescription)")
    }

    // 发送设备令牌到服务器
    func sendDeviceTokenToServer(deviceToken: String) {
        // 你的服务器端逻辑
        print("Sending device token to server: \(deviceToken)")
    }
}
接收推送通知

Swift
浅色版本

import UserNotifications

@main
struct YourApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 请求推送通知权限
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
            if granted {
                print("通知权限已授予")
            } else {
                print("通知权限被拒绝")
            }
        }

        // 注册推送通知
        application.registerForRemoteNotifications()

        return true
    }

    // 处理远程推送通知的注册
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
        let token = tokenParts.joined()
        print("Device Token: \(token)")

        // 将设备令牌发送到你的服务器
        sendDeviceTokenToServer(deviceToken: token)
    }

    // 处理远程推送通知的注册失败
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Failed to register for remote notifications: \(error.localizedDescription)")
    }

    // 发送设备令牌到服务器
    func sendDeviceTokenToServer(deviceToken: String) {
        // 你的服务器端逻辑
        print("Sending device token to server: \(deviceToken)")
    }

    // 处理接收到的推送通知
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        // 处理用户点击通知后的操作
        print("Notification received: \(response.notification.request.content.body)")
        completionHandler()
    }
}
服务器端

你需要一个服务器来发送推送通知。可以使用 Apple 的 APNs (Apple Push Notification service)。以下是一个简单的 Node.js 示例,展示如何使用 apn 库发送推送通知:

const apn = require('apn');

// 创建 APNs 连接
const options = {
    token: {
        key: './path/to/your/key.p8', // APNs auth key
        keyId: 'YOUR_KEY_ID', // The Key ID obtained from your developer account
        teamId: 'YOUR_TEAM_ID' // The Team ID obtained from your developer account
    },
    production: false // Set to true if sending notifications to production devices
};

const apnProvider = new apn.Provider(options);

// 创建通知
const note = new apn.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expiry time (seconds from now)
note.badge = 1;
note.sound = "default";
note.alert = "This is a test notification!";
note.topic = 'com.yourcompany.yourapp'; // Bundle identifier of your app

// 发送通知
const deviceToken = 'YOUR_DEVICE_TOKEN';
apnProvider.send(note, deviceToken).then((result) => {
    console.log(result);
});
总结

注册 Apple Developer Program:免费注册,但发布应用到 App Store 需要付费。
配置 App ID 和推送证书:在 Apple Developer 账户中完成。
在 Xcode 中配置项目:添加“Push Notifications”功能。
请求和处理推送通知:在应用中请求权限并处理通知。
服务器端:使用 APNs 发送推送通知。
 

配置服务器端

发送远程推送通知(APNs)涉及几个步骤。

以下是一个详细的指南,使用 Node.js 作为示例语言,展示如何配置服务器端来发送推送通知。

步骤 1:准备 APNs 证书

创建 APNs 证书:
登录 Apple Developer 账户。
前往 Certificates, Identifiers & Profiles。
选择 Keys,然后点击 + 按钮创建一个新的密钥。
选择 Apple Push Notifications service (APNs),然后点击 Continue。
输入密钥的描述,然后点击 Generate。
下载生成的 .p8 文件并保存。
获取 Key ID 和 Team ID:
Key ID:在密钥列表中,找到你刚刚创建的密钥,复制其 Key ID。
Team ID:在 Apple Developer 账户的概览页面中,找到你的 Team ID。
步骤 2:安装 Node.js 和依赖

安装 Node.js:
如果你还没有安装 Node.js,可以从 Node.js 官网 下载并安装。
创建项目目录:
Sh
浅色版本

mkdir apns-server
cd apns-server
初始化项目:
Sh
浅色版本

npm init -y
安装 apn 库:
Sh
浅色版本

npm install apn
步骤 3:编写服务器代码

创建 index.js 文件:
Sh
浅色版本

touch index.js
编写代码:
Javascript
浅色版本

const apn = require('apn');

// APNs 连接配置
const options = {
    token: {
        key: './path/to/your/AuthKey_YourKeyID.p8', // APNs auth key path
        keyId: 'YOUR_KEY_ID', // The Key ID obtained from your developer account
        teamId: 'YOUR_TEAM_ID' // The Team ID obtained from your developer account
    },
    production: false // Set to true if sending notifications to production devices
};

// 创建 APNs 提供者
const apnProvider = new apn.Provider(options);

// 创建通知
const note = new apn.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expiry time (seconds from now)
note.badge = 1;
note.sound = "default";
note.alert = "This is a test notification!";
note.topic = 'com.yourcompany.yourapp'; // Bundle identifier of your app

// 设备令牌
const deviceToken = 'YOUR_DEVICE_TOKEN';

// 发送通知
apnProvider.send(note, deviceToken).then((result) => {
    console.log("Notification sent:", result);
}).catch((error) => {
    console.error("Error sending notification:", error);
});
步骤 4:运行服务器

确保 AuthKey_YourKeyID.p8 文件路径正确:
将 ./path/to/your/AuthKey_YourKeyID.p8 替换为实际的文件路径。
运行服务器:
Sh
浅色版本

node index.js
步骤 5:测试推送通知

确保设备已注册推送通知:
在你的 iOS 应用中,确保设备已注册并获取到设备令牌。
运行服务器:
运行 node index.js,你应该会看到类似以下的输出:
浅色版本

Notification sent: { sent: [ 'YOUR_DEVICE_TOKEN' ], failed: [] }
检查设备:
检查你的设备是否收到了推送通知。
常见问题

设备未收到通知:
确保设备已正确注册推送通知。
确保设备令牌正确无误。
确保 APNs 证书和配置正确。
确保设备连接到互联网。
错误信息:
查看 console.error 输出的错误信息,根据错误信息进行调试。
进一步扩展

批量发送通知:
可以将多个设备令牌放入数组中,一次性发送通知。
Javascript
浅色版本

const deviceTokens = ['TOKEN1', 'TOKEN2', 'TOKEN3'];
apnProvider.send(note, deviceTokens).then((result) => {
    console.log("Notification sent:", result);
}).catch((error) => {
    console.error("Error sending notification:", error);
});
自定义通知内容:
可以在 note 对象中添加更多自定义字段,如 payload、customData 等。
 

//

这个通知的作用是开发者向所有用户发通知吗,什么情况下需要用到远程通知
远程推送通知(Remote Push Notifications)的主要作用是让开发者能够从服务器向用户的设备发送消息,即使应用不在前台运行或甚至被关闭。这种机制使得开发者可以在特定情况下及时通知用户,提高应用的活跃度和用户体验。

远程推送通知的主要用途

即时消息:
例如,在即时通讯应用中,当用户收到新消息时,可以通过推送通知提醒用户。
新闻更新:
新闻应用可以推送最新的新闻标题和摘要,吸引用户查看详细内容。
促销活动:
电商应用可以推送限时折扣、新品上市等信息,促进用户购买。
账户通知:
例如,银行应用可以推送账户余额变动、交易确认等重要信息。
事件提醒:
日历应用可以推送即将到来的会议或日程安排。
游戏更新:
游戏应用可以推送新的关卡、活动或排行榜变化。
安全通知:
安全应用可以推送异常登录、账户风险等信息。
什么情况下需要用到远程通知

用户互动:
当需要与用户进行实时互动时,例如社交应用中的新消息提醒。
重要信息传递:
当有重要信息需要立即告知用户时,例如账户安全、紧急通知等。
增加用户粘性:
通过定期推送有价值的内容,增加用户打开应用的频率,提高用户粘性。
数据同步:
当应用需要在后台同步数据时,可以通过推送通知触发应用进行数据同步。
用户召回:
通过推送通知召回长时间未使用应用的用户,提高用户活跃度。
示例场景

即时通讯应用:
用户 A 向用户 B 发送了一条消息,服务器检测到新消息后,向用户 B 的设备发送推送通知,提醒用户 B 有新消息。
新闻应用:
服务器检测到最新新闻更新,向订阅该类别的用户发送推送通知,提醒用户查看最新新闻。
电商应用:
服务器检测到限时折扣活动开始,向符合条件的用户发送推送通知,提醒用户参与活动。
银行应用:
用户进行一笔大额转账,服务器检测到交易后,向用户发送推送通知,确认交易详情。
实现步骤总结

设备注册推送通知:
应用请求设备注册推送通知,并获取设备令牌。
应用将设备令牌发送到服务器。
服务器发送推送通知:
服务器使用设备令牌和 APNs 证书向 APNs 发送通知。
APNs 将通知推送到设备。
示例代码回顾

客户端(iOS 应用)

import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 请求推送通知权限
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
            if granted {
                print("通知权限已授予")
            } else {
                print("通知权限被拒绝")
            }
        }

        // 注册推送通知
        application.registerForRemoteNotifications()

        return true
    }

    // 处理远程推送通知的注册
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
        let token = tokenParts.joined()
        print("Device Token: \(token)")

        // 将设备令牌发送到你的服务器
        sendDeviceTokenToServer(deviceToken: token)
    }

    // 处理远程推送通知的注册失败
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Failed to register for remote notifications: \(error.localizedDescription)")
    }

    // 发送设备令牌到服务器
    func sendDeviceTokenToServer(deviceToken: String) {
        // 你的服务器端逻辑
        print("Sending device token to server: \(deviceToken)")
        // 例如,使用网络请求将设备令牌发送到服务器
        // URLSession 或其他网络库
    }

    // 处理接收到的推送通知
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        // 处理用户点击通知后的操作
        print("Notification received: \(response.notification.request.content.body)")
        completionHandler()
    }
}
服务器端(Node.js)

const apn = require('apn');

// APNs 连接配置
const options = {
    token: {
        key: './path/to/your/AuthKey_YourKeyID.p8', // APNs auth key path
        keyId: 'YOUR_KEY_ID', // The Key ID obtained from your developer account
        teamId: 'YOUR_TEAM_ID' // The Team ID obtained from your developer account
    },
    production: false // Set to true if sending notifications to production devices
};

// 创建 APNs 提供者
const apnProvider = new apn.Provider(options);

// 创建通知
const note = new apn.Notification();
note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expiry time (seconds from now)
note.badge = 1;
note.sound = "default";
note.alert = "This is a test notification!";
note.topic = 'com.yourcompany.yourapp'; // Bundle identifier of your app

// 设备令牌
const deviceToken = 'YOUR_DEVICE_TOKEN';

// 发送通知
apnProvider.send(note, deviceToken).then((result) => {
    console.log("Notification sent:", result);
}).catch((error) => {
    console.error("Error sending notification:", error);
});


总结

远程推送通知是一种强大的工具,可以帮助开发者与用户保持实时互动,提高应用的活跃度和用户体验。通过上述步骤,你可以实现从服务器向用户设备发送推送通知的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471124.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展,多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型,融合了视觉与语言处理能力,旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

Java面向对象高级2

1.代码块 2.内部类 成员内部类 public class Demo{public static void main(String[] args) {outer.inner innew outer().new inner();in.run();}}class outer{private String str"outer";public class inner{public void run(){String sstr;System.out.println(s);…

Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)

作者:来自 Elastic Ranjana Devaji, Dana Juratoni Elasticsearch 8.16 引入了 BBQ(Better Binary Quantization - 更好的二进制量化)—— 一种压缩向量化数据的创新方法,其性能优于传统方法,例如乘积量化 (Product Qu…

androidstudio下载gradle慢

1,现象: 2,原因,国内到国外网址慢 3,解决方法:更改gradle-wrapper.properties #Wed Sep 26 20:01:52 CST 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER…

浅谈:基于三维场景的视频融合方法

视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 , 现实的漫游效果不是从摄像机的角度来看 , 但其仍然存在很多困难 。基于三维场景的视频融合 , 因其直观等特效在视频监控等相关领域有着…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器:Requests库的神秘面纱**一、背景:为何选择Requests库?二、Requests库是什么?三、如何安装Requests库?四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…

【算法一周目】双指针(2)

目录 有效三角形的个数 解题思路 C代码实现 和为s的两个数字 解题思路 C代码实现 三数之和 解题思路 C代码实现 四数之和 解题思路 C代码实现 有效三角形的个数 题目链接:611. 有效三角形的个数题目描述:给定一个包含非负整数的数组nums&…

基于Python的网上银行综合管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

C++编程技巧与规范-类和对象

类和对象 1. 静态对象的探讨与全局对象的构造顺序 静态对象的探讨 类中的静态成员变量(类类型静态成员) 类中静态变量的声明与定义&#xff08;类中声明类外定义&#xff09; #include<iostream> using namespace std;namespace _nmspl {class A{public:A():m_i(5){…

边缘的检测

边缘检测效果&#xff0c;是一种用于突出图像中的边缘&#xff0c;使物体的轮廓更加明显的图像处理技术&#xff0c;边缘检测的主要目的是找到图像中亮度变化显著的区域&#xff0c;这些区域通常对应于物体的边界&#xff0c;边缘检测相当于利用 Shader 代码自动给屏幕图像进行…

HP G10服务器ESXI6.7告警提示ramdisk tmp已满

物理服务器是HP G10 VCENTER内两台服务器报错提示ramdisk"tmp"已满&#xff0c;无法写入文件 登录ESXI命令行后发现两台主机的/tmp目录都没有空间了 定位到是ams-bbUsg.txt文件占用了大量的空间 1、关闭集群的DRS功能 2、迁移当前主机上面运行的所有虚拟机至其他主…

深度学习中的感受野:从基础概念到多层次特征提取

在深度学习&#xff0c;特别是计算机视觉任务中&#xff0c;感受野&#xff08;Receptive Field&#xff09;是一个至关重要的概念。它指的是在神经网络中某一层的神经元在输入图像上“看到”的区域大小。感受野的大小影响了网络能捕捉的特征层级&#xff0c;从而决定了它的特征…

Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)

前言 本文一开始是属于此文《UMI——斯坦福刷盘机器人&#xff1a;从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分&#xff0c;考虑后Diffusion Policy的重要性很高&#xff0c;加之后续还有一系列基于其的改进工作 故独立成本文&#xff0c;且写的过程中 …

【数据结构与算法】第12课—数据结构之归并排序

文章目录 1. 归并排序2. 计数排序3. 排序算法复杂度及稳定性分析在这里插入图片描述 1. 归并排序 分治法&#xff08;Divide and Conquer&#xff09;是一种重要的算法设计策略&#xff0c;其核心思想是将一个复杂的大问题分解为若干个小规模的子问题&#xff0c;递归地解决这些…

2024 年 Apifox 和 Postman 对比介绍详细版

Apifox VS Postman &#xff0c;当下流行的的两款 API 开发工具&#xff0c;2024 版对比&#xff01;

vue请求数据报错,设置支持跨域请求,以及2种请求方法axios或者async与await

设置跨域 通过vite创建的项目&#xff0c;一般会在你项目文件中自动生成一个名为vite.config文件&#xff0c;点击添加支持跨域的代码 import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({plu…

【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)

& 第四届信号处理与通信技术国际学术会议&#xff08;SPCT 2024&#xff09; 2024 4th International Conference on Signal Processing and Communication Technology 2024年12月27-29日 中国深圳 www.icspct.com 第四届信号处理与通信技术国际学术会议&#x…

【大数据学习 | HBASE高级】rowkey的设计,hbase的预分区和压缩

1. rowkey的设计 ​ RowKey可以是任意字符串&#xff0c;最大长度64KB&#xff0c;实际应用中一般为10~100bytes&#xff0c;字典顺序排序&#xff0c;rowkey的设计至关重要&#xff0c;会影响region分布&#xff0c;如果rowkey设计不合理还会出现region写热点等一系列问题。 …

基于微信小程序的农场管理系统的设计与实现,LW+源码+讲解

1.2 课题意义 现如今&#xff0c;信息种类变得越来越多&#xff0c;信息的容量也变得越来越大&#xff0c;这就是信息时代的标志。近些年&#xff0c;计算机科学发展得也越来越快&#xff0c;而且软件开发技术也越来越成熟&#xff0c;因此&#xff0c;在生活中的各个领域&…

学习记录:js算法(九十二):克隆图

文章目录 克隆图思路一 克隆图 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。 class Node {public int…