@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//launchOptions: 给注册推送时用 - 因为注册推送想在主界面加载出来才询问是否授权
setupJPush(launchOptions) // 配置JPUSH
return true
}
/
/**
配置极光推送
*/
private func setupJPush(launchOptions: [NSObject: AnyObject]?) {
JPUSHService.registerForRemoteNotificationTypes(UIUserNotificationType.Badge.rawValue | UIUserNotificationType.Alert.rawValue | UIUserNotificationType.Sound.rawValue, categories: nil)
JPUSHService.setupWithOption(launchOptions, appKey: JPUSH_APP_KEY, channel: JPUSH_CHANNEL, apsForProduction: JPUSH_IS_PRODUCTION)
JPUSHService.crashLogON()
// 延迟发送通知(app被杀死进程后收到通知,然后通过点击通知打开app在这个方法中发送通知)
performSelector(#selector(sendNotification(_:)), withObject: launchOptions, afterDelay: 1.5)
}
/**
/**
发送通知
*/
@objc private func sendNotification(launchOptions: [NSObject: AnyObject]?) {
if let options = launchOptions {
let userInfo = options[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject : AnyObject]
if let info = userInfo {
NSNotificationCenter.defaultCenter().postNotificationName("didReceiveRemoteNotificationOfJPush", object: info)
}
}
}
/**
传递deviceToken注册远程通知
*/
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
JPUSHService.registerDeviceToken(deviceToken)
}
/**
注册远程通知失败
*/
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
print("did Fail To Register For Remote Notifications With Error: \(error)")
}
/**
iOS7后接收到远程通知
*/
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
JPUSHService.handleRemoteNotification(userInfo)
completionHandler(UIBackgroundFetchResult.NewData)
if application.applicationState == .Background || application.applicationState == .Inactive {
application.applicationIconBadgeNumber = 0
NSNotificationCenter.defaultCenter().postNotificationName("didReceiveRemoteNotificationOfJPush", object: userInfo)
} else if application.applicationState == .Active {
application.applicationIconBadgeNumber = 0
let message = userInfo["aps"]!["alert"] as! String
let alertC = UIAlertController(title: "收到新的消息", message: message, preferredStyle: UIAlertControllerStyle.Alert)
let confrimAction = UIAlertAction(title: "查看", style: UIAlertActionStyle.Destructive, handler: { (action) in
NSNotificationCenter.defaultCenter().postNotificationName("didReceiveRemoteNotificationOfJPush", object: userInfo)
})
let cancelAction = UIAlertAction(title: "忽略", style: UIAlertActionStyle.Default, handler: { (action) in
})
alertC.addAction(confrimAction)
alertC.addAction(cancelAction)
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertC, animated: true, completion: nil)
}
}
/**
接收到本地通知
*/
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
JPUSHService.showLocalNotificationAtFront(notification, identifierKey: nil)
}
func applicationWillResignActive(application: UIApplication) {
}
func applicationDidEnterBackground(application: UIApplication) {
JFNewsDALManager.shareManager.clearCacheData()
}
func applicationWillEnterForeground(application: UIApplication) {
}
func applicationDidBecomeActive(application: UIApplication) {
}
func applicationWillTerminate(application: UIApplication) {
}
}
Swift - JPush极光推送的使用1(配置, 推送测试样例)
(1) APNs 是 Apple Push Notification service 的简称,中文翻译为:苹果推送通知服务。
(2) APNs 允许设备与苹果的推送通知服务器保持常连接状态。当你想发送一个推送通知给某个用户的iPhone上的应用程序时,你可以使用 APNs 发送一个推送消息给目标设备上已安装的某个应用程序。
(3) APNs 也是 iOS 系统里唯一的推送方式。
二, 极光推送(JPush)介绍
(1)极光推送是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上。
(2)推送客户端支持 Android, iOS 两个平台。(iOS下使用APNs推送)
(3)为 JPush Server 上报 Device Token,免除开发者管理 Device Token 的麻烦。
(4)前台运行时,可接收由 JPush 下发的(透传的)自定义消息。
(5)灵活管理接收用户: Tag(标签分组)、 Alias(用户别名)、 RegistrationID(设备注册ID)
三,使用极光推送的优点
虽然我们可以搭建自己应用服务器,将需要被推送的信息发给APNs。接着由APNs推送到指定的iOS设备上,然后再由设备通知到我们的应用程序,最后设备以通知或者声音的形式通知用户有新的消息。
但使用 JPush SDK 可以更快捷地为 iOS App 增加推送功能,减少集成 APNs 需要的工作量、开发复杂度,也让服务器端向 iOS 设备推送变得更加简单方便。
四,极光推送SDK集成步骤
1、在JPush Portal上创建应用
在 JPush 的管理 Portal 上创建应用并上传 APNs 证书。如果对 APNs 证书不太了解 请参考: iOS 证书设置指南
将 iOS SDK 包解压。下载地址: http://docs.jiguang.cn/resources/
然后把解压后的 lib 子文件夹(包含 JPUSHService.h、 jpush-ios-x.x.x.a)添加到你的工程目录中。
1
|
#
import
"JPUSHService.h"
|
5,允许XCode7支持Http传输方法
如果用的是 Xcode7 时,需要在App项目 info.plist 中添加如下配置以支持 http 传输。
1
2
3
4
5
|
<
key
>NSAppTransportSecurity</
key
>
<
dict
>
<
key
>NSAllowsArbitraryLoads</
key
>
<
true
/>
</
dict
>
|
6,开启Remote notifications
需要在 Xcode 中修改应用的 Capabilities 开启 Remote notifications 7,最后在AppDelegate.swift中添加如下代码,启动JPush的SDK服务。
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
44
45
46
47
48
49
50
51
52
53
|
import
UIKit
@UIApplicationMain
class
AppDelegate
:
UIResponder
,
UIApplicationDelegate
{
var
window:
UIWindow
?
func
application(application:
UIApplication
,
didFinishLaunchingWithOptions launchOptions: [
NSObject
:
AnyObject
]?)
->
Bool
{
//通知类型(这里将声音、消息、提醒角标都给加上)
let
userSettings =
UIUserNotificationSettings
(forTypes: [.
Badge
, .
Sound
, .
Alert
],
categories:
nil
)
if
((
UIDevice
.currentDevice().systemVersion
as
NSString
).floatValue >= 8.0) {
//可以添加自定义categories
JPUSHService
.registerForRemoteNotificationTypes(userSettings.types.rawValue,
categories:
nil
)
}
else
{
//categories 必须为nil
JPUSHService
.registerForRemoteNotificationTypes(userSettings.types.rawValue,
categories:
nil
)
}
// 启动JPushSDK
JPUSHService
.setupWithOption(
nil
, appKey:
"7b528361738e3709175798fd"
,
channel:
"Publish Channel"
, apsForProduction:
false
)
return
true
}
func
application(application:
UIApplication
,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken:
NSData
) {
//注册 DeviceToken
JPUSHService
.registerDeviceToken(deviceToken)
}
func
application(application:
UIApplication
,
didReceiveRemoteNotification userInfo: [
NSObject
:
AnyObject
],
fetchCompletionHandler completionHandler: (
UIBackgroundFetchResult
) ->
Void
) {
//增加IOS 7的支持
JPUSHService
.handleRemoteNotification(userInfo)
completionHandler(
UIBackgroundFetchResult
.
NewData
)
}
func
application(application:
UIApplication
,
didFailToRegisterForRemoteNotificationsWithError error:
NSError
) {
//可选
NSLog
(
"did Fail To Register For Remote Notifications With Error: \(error)"
)
}
//..........
}
|
五,推送测试
1,我们将上面配置好的应用编译发布到手机上(使用模拟器无法测试 JPush 推送)
2,第一次运行程序会提示我们是否允许推送通知,选择“好”即可。
原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1268.html