0.接入推送
0.创建推送证书、创建极光推送应用
这部分不做赘述
1.接入iOS SDK
在 Siging & Capabilities 中添加 Access WiFi Information 和 PushNotifications
同时打开 Remote notifications
 
在Podfile中加入
| 1
2
 |   pod 'JCore'
  pod 'JPush'
 | 
 
然后执行 pod install 导入SDK
在桥接文件中加入
| 1
2
3
4
5
6
 | // 引入 JPush 功能所需头文件
#import "JPUSHService.h"
// iOS10 注册 APNs 所需头文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
 | 
 
这部分会有版本选择以及IDFA等问题,详见:极光文档
1.接收消息
1.注册极光推送
在AppDelegate中的didFinishLaunchingWithOptions中注册极光推送
| 1
2
3
4
5
6
7
8
9
 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  // 推送代码
  let entity = JPUSHRegisterEntity()
  entity.types = 1 << 0 | 1 << 1 | 1 << 2
  JPUSHService.register(forRemoteNotificationConfig: entity, delegate: self)
  // 填写自己的appKey
  JPUSHService.setup(withOption: launchOptions, appKey: "xxxxx", channel: "App Store", apsForProduction: false, advertisingIdentifier: nil)
  return true
}
 | 
 
2.接收消息
编写上传deviceToken、接收推送消息的执行方法
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 | // MARK: --推送代理
extension AppDelegate : JPUSHRegisterDelegate {
    func jpushNotificationCenter(_ center: UNUserNotificationCenter!, openSettingsFor notification: UNNotification!) {
        print("jpushNotificationCenter")
    }
    
    func jpushNotificationAuthorization(_ status: JPAuthorizationStatus, withInfo info: [AnyHashable : Any]!) {
        print("jpushNotificationAuthorization")
    }
    
    //系统获取Token
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        _ = deviceToken.reduce("",{$0 + String(format:"%02x",$1)})
        JPUSHService.registerDeviceToken(deviceToken)
    }
    
    //获取token 失败
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { //可选
        print("did Fail To Register For Remote Notifications With Error: \(error)")
    }
    
    @available(iOS 10.0, *)
    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)
            UIApplication.shared.applicationIconBadgeNumber = notification.request.content.badge as! Int
        }
        // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
        print("前台 收到推送 userInfo=\(userInfo)")
        completionHandler(Int(UNNotificationPresentationOptions.alert.rawValue))
    }
    
    @available(iOS 10.0, *)
    func jpushNotificationCenter(_ center: UNUserNotificationCenter!, didReceive response: UNNotificationResponse!, withCompletionHandler completionHandler: (() -> Void)!) {
        print("点击推送消息 content=\(response.notification.request.content.userInfo)")
        let userInfo = response.notification.request.content.userInfo
        if response.notification.request.trigger is UNPushNotificationTrigger {
            JPUSHService.handleRemoteNotification(userInfo)
        }
        completionHandler()
    }
}
 | 
 
这时候我们已经能在jpushNotificationCenter 中接收到推送消息内容了
3.为设备设置唯一标识
一般将用户的唯一id、手机号用作标识符,只需在用户登录后执行
| 1
2
3
 | JPUSHService.setAlias("手机号", completion: { (iResCode, iAlias, seq) in
                print("alias,\("手机号") . completion,\(iResCode),\(String(describing: iAlias)),\(seq)")
            }, seq: 0)
 | 
 
4.测试消息推送
前往极光官网、找到发送通知,只需填写这几项就可以测试是否能收到推送。
 
 
最后收到的推送大致格式为:
| 1
2
3
4
5
6
7
8
 | {
    "alert": {
        "body": "test body",
        "title": "test title"
    },
    "badge": 1,
    "sound": "default"
}
 | 
 
2.跳转页面
首先在应用主页面(或其他页面)的ViewController里创建跳转页面相关代码:
| 1
2
3
4
5
6
7
8
9
 | override func viewDidLoad() {
  NotificationCenter.default.addObserver(self, selector: #selector(jpush(noti:)), name: NSNotification.Name(rawValue: "jpush"), object: nil)
}
// MARK: - 直接跳转对应页面
@objc func jpush(noti: Notification) {
  let jpushViewController = mainStoryboard.instantiateViewController(withIdentifier: "jpushViewController")as!JpushViewController
  self.present(jpushViewController, animated: true, completion: nil)
}
 | 
 
然后在用户点击推送时执行:
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 | @available(iOS 10.0, *)
func jpushNotificationCenter(_ center: UNUserNotificationCenter!, didReceive response: UNNotificationResponse!, withCompletionHandler completionHandler: (() -> Void)!) {
  print("点击推送消息 content=\(response.notification.request.content.userInfo)")
  let userInfo = response.notification.request.content.userInfo
  if response.notification.request.trigger is UNPushNotificationTrigger {
    JPUSHService.handleRemoteNotification(userInfo)
  }
  let notification = NSNotification.Name(rawValue: "jpush")
  NotificationCenter.default.post(name: notification, object: nil, userInfo: nil)
  completionHandler()
}
 | 
 
跳转页面功能就完成了。如果需要推送消息携带额外信息,可以在后台将键值对添加到 extra 中,键值对会被添加在 response.notification.request.content.userInfo 里,直接取出就行。