Swift使用极光推送JPush的Demo

2023-05-16

JPushDemo

github项目地址
需要导入JPush框架,可以使用cocoapod导入,也可以手动导入

环境配置

配置环境可以参考极光推送的官方文档:

iOS 证书设置指南

iOS SDK 集成指南

iOS SDK API

使用说明

待环境配置好了之后,就可以进入极光推送开始推送消息了

极光推送首页

推送使用示例如下:

发送通知

这里写图片描述

发送自定义消息

这里写图片描述

代码转换

因为极光推送文档里的环境配置使用的是OC代码,如果对OC不熟悉的话,可以参考以下翻译成Swift的代码,如果你是OC大牛,那就忽略这里

添加头文件

因为极光推送的框架JPush是OC写的框架,Swift不能直接使用,所以需要创建一个桥接文件,会创建桥接文件的直接复制代码即可,不会创建桥接文件的,并且工程下没有OC文件(.m文件的)可以直接File->New->File->Objective-C File,然后任意输入一个文件名,这时会提示你是否自动创建桥接文件,选择是,就会创建一个桥接文件了,然后我们把下面的代码复制到xxx-Bridging-Header.h文件中

// 引入JPush功能所需头文件
#import "JPUSHService.h"
// iOS10注册APNs所需头文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
// 如果需要使用idfa功能所需要引入的头文件(可选)
#import <AdSupport/AdSupport.h>

添加Delegate

为AppDelegate添加Delegate。

参考代码:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, JPUSHRegisterDelegate {

}

添加初始化代码

添加初始化APNs代码

请将以下代码添加到func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

let entity = JPUSHRegisterEntity()
entity.types = 1 << 0 | 1 << 1 | 1 << 2
JPUSHService.register(forRemoteNotificationConfig: entity, delegate: self)

添加初始化JPush代码

请将以下代码添加到func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

let advertisingId = ASIdentifierManager.shared().advertisingIdentifier.uuidString
JPUSHService.setup(withOption: launchOptions, appKey: "a8cc62546a2407102cf484b6", channel: "App Store", apsForProduction: false, advertisingIdentifier: advertisingId)

(参数说明请看文档)

注册APNs成功并上报DeviceToken

请在AppDelegate.swift实现该回调方法并添加回调方法中的代码

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    //注册 DeviceToken
    JPUSHService.registerDeviceToken(deviceToken)
}

实现注册APNs失败接口(可选)

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) {
        //可选
        NSLog("did Fail To Register For Remote Notifications With Error: \(error)")
    }
}

添加处理APNs通知回调方法

请在AppDelegate.swift实现该回调方法并添加回调方法中的代码

// MARK: JPUSHRegisterDelegate
// iOS 10 Support
func jpushNotificationCenter(_ center: UNUserNotificationCenter!, willPresent notification: UNNotification!, withCompletionHandler completionHandler: ((Int) -> Void)!) {
    let userInfo = notification.request.content.userInfo
    if notification.request.trigger is UNPushNotificationTrigger {
        JPUSHService.handleRemoteNotification(userInfo)
    }
    // 需要执行这个方法,选择是否提醒用户,有BadgeSoundAlert三种类型可以选择设置
    completionHandler(Int(UNNotificationPresentationOptions.alert.rawValue))
}

// iOS 10 Support
func jpushNotificationCenter(_ center: UNUserNotificationCenter!, didReceive response: UNNotificationResponse!, withCompletionHandler completionHandler: (() -> Void)!) {
    let userInfo = response.notification.request.content.userInfo
    if response.notification.request.trigger is UNPushNotificationTrigger {
        JPUSHService.handleRemoteNotification(userInfo)
    }
    // 系统要求执行这个方法
    completionHandler()
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    JPUSHService.handleRemoteNotification(userInfo)
    completionHandler(UIBackgroundFetchResult.newData)
}

添加处理JPush自定义消息回调方法

在iOS SDK集成指南中并没有直接给出处理JPush自定义消息的回调方法,需要你自己到API中去寻找,这里,我直接把它抽出来写在下面

功能说明

1、只有在前端运行的时候才能收到自定义消息的推送。

2、从jpush服务器获取用户推送的自定义消息内容和标题以及附加字段等。

实现方法

请将以下代码添加到func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

NotificationCenter.default.addObserver(self, selector: #selector(networkDidReceiveMessage(notification:)), name: NSNotification.Name.jpfNetworkDidReceiveMessage, object: nil)

实现回调方法 networkDidReceiveMessage

@objc func networkDidReceiveMessage(notification: Notification) {
    let userInfo = notification.userInfo
    if let extras = userInfo?["extras"] as? Dictionary<String, String> {
        NSLog("extras: \(extras)")
    }
    // 将自定义消息的内容转换成本地推送
    if let con = userInfo?["content"] as? String {
        //设置推送内容
        let content = UNMutableNotificationContent()
        content.body = con

        //设置通知触发器
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.01, repeats: false)

        //设置请求标识符
        let requestIdentifier = "com.average.Demo"

        //设置一个通知请求
        let request = UNNotificationRequest(identifier: requestIdentifier,
                                            content: content, trigger: trigger)

        //将通知请求添加到发送中心
        UNUserNotificationCenter.current().add(request) { error in
            if error == nil {
                print("Time Interval Notification scheduled: \(requestIdentifier)")
            }
        }
    }
}

这里我跟官方的处理方式不同,官方的API中,获取到content和extras之后直接打印出来,我这里只输出extras,而将content作为本地推送的消息body推送出去,有关本地推送的相关知识,可以参考这篇博客

Swift - UserNotifications框架使用详解2(发送本地通知)

还有朋友对AppDelegate.swift中的

UNUserNotificationCenter.current()
    .requestAuthorization(options: [.alert, .sound, .badge]) {
        (accepted, error) in
        if !accepted {
            print("用户不允许消息通知。")
        }
}

和ViewController.swift中的

// 判断权限
UNUserNotificationCenter.current().getNotificationSettings {
    settings in
    switch settings.authorizationStatus {
    // 已获取到通知权限
    case .authorized:
        break
    // 还未获取权限
    case .notDetermined:
        //请求授权
        UNUserNotificationCenter.current()
            .requestAuthorization(options: [.alert, .sound, .badge]) {
                (accepted, error) in
                if !accepted {
                    print("用户不允许消息通知。")
                }
        }
    // 用户关闭通知权限
    case .denied:
        DispatchQueue.main.async(execute: { () -> Void in
            let alertController = UIAlertController(title: "消息推送已关闭",
                                                    message: "想要及时获取消息。点击“设置”,开启通知。",
                                                    preferredStyle: .alert)

            let cancelAction = UIAlertAction(title:"取消", style: .cancel, handler:nil)

            let settingsAction = UIAlertAction(title:"设置", style: .default, handler: {
                (action) -> Void in
                let url = URL(string: UIApplicationOpenSettingsURLString)
                if let url = url, UIApplication.shared.canOpenURL(url) {
                    if #available(iOS 10, *) {
                        UIApplication.shared.open(url, options: [:],
                                                  completionHandler: {
                                                    (success) in
                        })
                    } else {
                        UIApplication.shared.openURL(url)
                    }
                }
            })

            alertController.addAction(cancelAction)
            alertController.addAction(settingsAction)

            self.present(alertController, animated: true, completion: nil)
        })
    }
}

感兴趣,想要仔细了解,也可以参考下面这篇博客

Swift - UserNotifications框架使用详解1(基本介绍,权限的申请与判断)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift使用极光推送JPush的Demo 的相关文章

  • 如何在 Swift 2.0 中使用 stringByAddingPercentEncodingWithAllowedCharacters() 作为 URL

    我在 Swift 1 2 中使用过这个 let urlwithPercentEscapes myurlstring stringByAddingPercentEscapesUsingEncoding NSUTF8StringEncoding
  • Swift:二元运算符“==”不能应用于“协议”类型的操作数

    我有一个协议 protocol ProfileManagerDelegete func dataHaveUpdated type ReturnType 并创建一个协议数组 并添加 删除侦听器 var listeners ProfileMan
  • 如何在 RxSwift 中延迟地从 Collection 中一件一件地发出项目

    我想从anyCollection 创建一个Observable 它会在延迟后一一发出每个元素 另外 在下一步我想对项目 模型 执行一些更新 例如 喂所有狗 一只一只 间隔 5 秒 class Dog var name String var
  • Firebase queryOrderedbyChild 不返回 Null 值

    我有一个根据年龄搜索用户的查询 self ref child users queryOrdered byChild age queryStarting atValue 18 queryEnding atValue 25 observeSin
  • 将字符串拆分为数组,在 Swift 中保留定界符/分隔符

    寻找一种 优雅的 解决方案来分割字符串并将分隔符保留为数组中的项目 示例1 hello world hello world 示例2 hello world hello world thx 假设您要使用名为的分隔符分割字符串separator
  • 如何通过 Google Sheets API 进行基本写作?

    在使用 Swift 学习 Google Sheets API 的过程中 我想将单个范围写入电子表格 调查iOS 快速入门指南 https developers google com sheets quickstart ios ver swi
  • 如何更改 MGLPolyline 的颜色?

    如何更改 MGLPolyline 的颜色 我曾经看过here https stackoverflow com questions 32024464 customize mglpolyline using mapbox但答案不起作用 我还尝试
  • 图表的集合视图呈现:图表 cocoapods 的“没有可用的图表数据”

    我正在编码GraphViewController包含图形数组的类 类型为LineChartView 但是 当我尝试以集合视图的单元格格式显示这些图形时 使用调用的类GraphCell the LineChartView对象似乎没有加载任何数
  • Xcode - 调试视图层次结构

    我正在尝试调试应用程序的视图层次结构 Xcode 窗口的左侧窗格中出现了一个紫色的小方块 请参见屏幕截图 知道这个问题可能是什么吗 好吧 我找到了这个问题的根源 这是一个约束问题
  • Twitter api 文本字段值被截断

    为什么文本字段值被截断以及如何获得完整的值 截至目前 我正在尝试获取如下所示的文本字段值 do if let responseObject try NSJSONSerialization JSONObjectWithData respons
  • GM 发布 Xcode 6 编译

    我刚刚下载了 Xcode 6 的 GM 版本 但无法编译并出现以下错误 Command Applications Xcode app Contents Developer Toolchains XcodeDefault xctoolchai
  • 在哪里实现 Swift 协议?

    在 Swift 中实现协议一致性时 我有两个选择 具有相同的最终结果 在类中实现协议 也就是说 在类定义的顶部声明一致性 并将实现放在类体内 或者 在扩展中实现协议 也就是说 完全在类之外编写符合协议的代码 这是一个例子 public cl
  • 将两个字符的字符串转换为布尔数组的快速方法是什么?

    我有一个很长的字符串 有时超过 1000 个字符 我想将其转换为布尔值数组 它需要非常快速地多次执行此操作 let input String 001 let output Bool false false true 我天真的尝试是这样的 i
  • 使用 Swift 将自定义字体添加到 macOS 应用程序

    我遵循了一堆教程 但它不起作用 我只是想向 macOS 应用程序添加自定义字体 我基本上尝试过 添加了 ttf字体文件到我的项目 目标会员资格已设置 我还确保使用复制文件Copy Files within Bundle Phases 编译后
  • 是否可以在 Swift 中交错 WebView 和 CALayerViews

    我有一个充当多个 CAShapeLayers 容器的视图 它们包含在屏幕上形成组合的贝塞尔曲线 用户可以通过不同的方式管理线宽 颜色 形状填充 不透明度等 我想通过占据相同容器的 WebView 引入文本 诀窍是 理想情况下我希望能够控制每
  • 如何在 Swift 中将文件名与文件扩展名分开?

    给定包中文件的名称 我想将该文件加载到我的 Swift 应用程序中 所以我需要使用这个方法 let soundURL NSBundle mainBundle URLForResource fname withExtension ext 无论
  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • 如何从 ContentView 外部显示 SwiftUI 警报?

    我正在构建 Swift 应用程序 并试图找出如何显示警报 我有一个单独的 swift 文件正在执行一些计算 并且在某些条件下我希望它向用户显示警报 基本上告诉他们出了问题 然而 我见过的大多数例子都要求警报在ContentView或以其他方
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • UItextView 背景颜色 Linespacing 区域太

    我正在尝试在 UITextView 中复制文本突出显示 不是搜索文本突出显示 但我也被行间距的颜色所困扰 我该如何纠正这个问题 现在的情况 期望的结果 我已将以下属性添加到我的 UiTextview 的属性文本中 对于段落行间距 我使用了以

随机推荐