什么是推送通知?
APP退到后臺(tái),或者關(guān)閉時(shí);應(yīng)用推送一條消息告訴用戶某件事情,應(yīng)用通過(guò)點(diǎn)擊通知進(jìn)入到應(yīng)用相應(yīng)的頁(yè)面.
推送通知應(yīng)用場(chǎng)景?
推送通知應(yīng)用場(chǎng)景很多比如:
(1)一些任務(wù)管理APP,會(huì)在任務(wù)時(shí)間即將到達(dá)時(shí),通知你做該任務(wù);
(2)健身App定時(shí)提醒你應(yīng)該健身了;
(3)買過(guò)電影火車票后,提前半小時(shí)告訴你,電影即將開場(chǎng),火車即將發(fā)車;
(4)當(dāng)你QQ或者微信收到消息時(shí),即使退到后臺(tái),或者關(guān)閉APP,也可以收到信息通知告訴我們;
(5)電商APP,推送一條消息通知我們有新品等等
(6)大文件,電影后臺(tái)下載時(shí),下載完成推送通知告知用戶,文件已經(jīng)下載完成.
推送通知的分類
本地通知:
通知發(fā)送方: 開發(fā)人員負(fù)責(zé)在APP內(nèi)發(fā)送
應(yīng)用場(chǎng)景: 確定知道未來(lái)某個(gè)時(shí)間點(diǎn)應(yīng)該提醒用戶什么
遠(yuǎn)程推送通知:
遠(yuǎn)程推送服務(wù),又稱為APNs(Apple Push Notification Services)
通知發(fā)送方: 服務(wù)器
應(yīng)用場(chǎng)景:
1. 不確定未來(lái)某個(gè)時(shí)間點(diǎn)應(yīng)該提醒用戶什么,臨時(shí)性的
2. 當(dāng)APP徹底退出時(shí)也想繼續(xù)讓用戶獲取一些最新消息
推送通知的呈現(xiàn)效果(顯示橫幅還是UIAlertView,取決于用戶的設(shè)置)
用戶接收的推送通知,都會(huì)在通知欄彈出,所有通知都匯總在“通知中心”
在屏幕頂部顯示一塊橫幅(顯示具體內(nèi)容)
在屏幕中間彈出一個(gè)UIAlertView(顯示具體內(nèi)容)
在鎖屏界面顯示一塊橫幅(鎖屏狀態(tài)下,顯示具體內(nèi)容)
更新app圖標(biāo)的數(shù)字(說(shuō)明新內(nèi)容的數(shù)量)
播放音效(提醒作用)
用戶也可以決定是否要開啟以下4個(gè)功能:
顯示App圖標(biāo)數(shù)字
播放音效
鎖屏顯示
顯示在“通知中心”
創(chuàng)建本地推送通知對(duì)象
UILocalNotification *ln = [[UILocalNotification alloc] init];
設(shè)置本地推送通知屬性
推送通知的觸發(fā)時(shí)間(何時(shí)發(fā)出推送通知)
@property(nonatomic,strong) NSDate *fireDate;
推送通知的具體內(nèi)容
@property(nonatomic,strong) NSString *alertBody;
在鎖屏?xí)r顯示的動(dòng)作標(biāo)題(完整標(biāo)題:“滑動(dòng)來(lái)” + alertAction)
@property(nonatomic,strong) NSString *alertAction;
音效文件名
@property(nonatomic,strong) NSString *soundName;
app圖標(biāo)數(shù)字
@property(nonatomic,assign) NSInteger applicationIconBadgeNumber;
發(fā)出本地推送通知
調(diào)度本地推送通知(調(diào)度完畢后,推送通知會(huì)在特地時(shí)間fireDate發(fā)出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
獲得被調(diào)度(定制)的所有本地推送通知
@property(nonatomic,strong)NSArray*scheduledLocalNotifications;
(已經(jīng)發(fā)出且過(guò)期的推送通知就算調(diào)度結(jié)束,會(huì)自動(dòng)從這個(gè)數(shù)組中移除)
取消調(diào)度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
立即發(fā)出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
本地推送通知的其他屬性
每隔多久重復(fù)發(fā)一次推送通知
@property(nonatomic,assign) NSCalendarUnit repeatInterval;
點(diǎn)擊推送通知打開app時(shí)顯示的啟動(dòng)圖片
@property(nonatomic,strong) NSString *alertLaunchImage;
附加的額外信息
@property(nonatomic,strong) NSDictionary *userInfo;
時(shí)區(qū)
@property(nonatomic,strong) NSTimeZone *timeZone;
(一般設(shè)置為[NSTimeZone defaultTimeZone] ,跟隨手機(jī)的時(shí)區(qū))
點(diǎn)擊本地推送通知
當(dāng)用戶點(diǎn)擊本地推送通知,會(huì)自動(dòng)打開app,這里有2種情況
app并沒(méi)有關(guān)閉,一直隱藏在后臺(tái)
讓app進(jìn)入前臺(tái),并會(huì)調(diào)用AppDelegate的下面方法(并非重新啟動(dòng)app)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
app已經(jīng)被關(guān)閉(進(jìn)程已死)
啟動(dòng)app,啟動(dòng)完畢會(huì)調(diào)用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
launchOptions參數(shù)通過(guò)UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對(duì)象
iOS 8.0的變化
在iOS 8.0中,如果要使用本地通知,需要得到用戶的許可
在didFinishLaunchingWithOptions方法中添加如下代碼:
if(系統(tǒng)版本 >= 8.0) { // 注冊(cè)接收通知的類型?
?UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
?[application registerUserNotificationSettings:settings]; // 注冊(cè)允許接收遠(yuǎn)程推送通知
?[application registerForRemoteNotifications];?
} else { // 如果是iOS7.0,使用以下方法注冊(cè)
?[application registerForRemoteNotificationTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound];?
}
Swift代碼:
func registerAuthor() {
if #available(iOS 8.0, *) {
let type = UIUserNotificationType.Alert.rawValue | UIUserNotificationType.Badge.rawValue | UIUserNotificationType.Sound.rawValue
let sets = UIUserNotificationSettings(forTypes: UIUserNotificationType(rawValue: type), categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(sets)
}
}
控制器:
// 1. 創(chuàng)建一個(gè)本地通知
let localNot = UILocalNotification()
// 1.1 設(shè)置通知的必選項(xiàng)
localNot.alertBody = "我是一個(gè)本地通知"
// 1.2 通知的發(fā)送時(shí)間
localNot.fireDate = NSDate(timeIntervalSinceNow: 2)
// 重復(fù)周期
//? ? ? ? localNot.repeatInterval = .Minute
// 設(shè)置鎖屏滑動(dòng)文字
localNot.hasAction = true
localNot.alertAction = "回復(fù)"
// 啟動(dòng)圖片(當(dāng)用戶點(diǎn)擊了本地通知, 啟動(dòng)我們APP 的時(shí)候, 帶的啟動(dòng)圖片)
// 如果是在ios9.0以前, 當(dāng)鎖屏界面, 出現(xiàn)一個(gè)通知, 用戶點(diǎn)擊了通知, 啟動(dòng)APP 的時(shí)候, 會(huì)自動(dòng)將我們?cè)O(shè)置的圖片, 當(dāng)做啟動(dòng)圖像 來(lái)顯示
// ios9.0, 這個(gè)屬性, 不太靈
// 如果這個(gè)圖片,找不到, 會(huì)使用系統(tǒng)默認(rèn)的啟動(dòng)圖片
localNot.alertLaunchImage = "xxx"
// 設(shè)置通知彈框的標(biāo)題
// 標(biāo)題, 這對(duì)于, 通知中心的通知有效
if #available(iOS 8.2, *) {
localNot.alertTitle = "通知標(biāo)題"
}
// 設(shè)置通知的聲音
localNot.soundName = "通知聲音文件.aac"
// 設(shè)置圖標(biāo)右上角的數(shù)字(0 代表不顯示)
localNot.applicationIconBadgeNumber = 1
// 2. 發(fā)送本地通知
// 應(yīng)用程序級(jí)別的操作
//? ? ? ? UIApplication.sharedApplication().presentLocalNotificationNow(localNot)
UIApplication.sharedApplication().scheduleLocalNotification(localNot)
// 取消所有計(jì)劃的通知
UIApplication.sharedApplication().cancelAllLocalNotifications()
遠(yuǎn)程推送
一.開發(fā)iOS程序的推送功能, iOS端需要做的事
1.請(qǐng)求蘋果獲得deviceToken
2.得到蘋果返回的deviceToken,發(fā)送deviceToken給公司的服務(wù)器
3. 監(jiān)聽用戶對(duì)通知的點(diǎn)擊
二.調(diào)試iOS的遠(yuǎn)程推送功能, 必備條件:
1.真機(jī)
2.調(diào)試推送需要的證書文件
1> aps_development.cer : 某臺(tái)電腦就能調(diào)試某個(gè)app的推送服務(wù)
2> iphone5_qq.mobileprovision : 某臺(tái)電腦就能利用某臺(tái)設(shè)備調(diào)試某個(gè)程序
三.發(fā)布具有推送服務(wù)的app
1> aps_production.cer : 如果發(fā)布的程序中包含了推送服務(wù),就必須安裝這個(gè)證書
2> qq.mobileprovision? : 某臺(tái)電腦就能發(fā)布某個(gè)程序
遠(yuǎn)程推送應(yīng)用配置過(guò)程
1. 創(chuàng)建支持遠(yuǎn)程推送功能的App ID
2. 創(chuàng)建調(diào)試證書,并選中剛剛創(chuàng)建的App ID
3. 下載CER文件,并導(dǎo)入鑰匙串管理
4. 創(chuàng)建發(fā)布證書,并選中剛剛創(chuàng)建的App ID
5. 下載CER文件,并導(dǎo)入鑰匙串管理
6. 檢查App ID,確認(rèn)證書已經(jīng)指定
7. 生成描述文件
證書配置01 – 創(chuàng)建App ID
注意
遠(yuǎn)程推送只能在真機(jī)上測(cè)試!因此先要保證真機(jī)調(diào)試的環(huán)境沒(méi)有問(wèn)題!
遠(yuǎn)程推送的第一步是要?jiǎng)?chuàng)建App ID
目的是說(shuō)明哪個(gè)App需要使用推送服務(wù)
為遠(yuǎn)程推送服務(wù)創(chuàng)建的App ID一定要是全稱,不能帶有*
證書配置02 – 為App ID創(chuàng)建APNs SSL證書
有生產(chǎn)證書和發(fā)布證書,生產(chǎn)證書用來(lái)調(diào)試,發(fā)布證書用來(lái)發(fā)布應(yīng)用,應(yīng)用上線之前必須配置好推送發(fā)布證書,發(fā)布應(yīng)用之后才能使用推送功能,如果上線的應(yīng)用推送證書沒(méi)有配置好,打包上線審核時(shí)蘋果會(huì)通過(guò)郵件的形式提醒開發(fā)者,否則應(yīng)用將沒(méi)有推送功能
證書配置03 – 生成描述文件
證書配置04 – 安裝
最終會(huì)得到3個(gè)文件
aps_development.cer:真機(jī)調(diào)試用的
aps_production.cer:發(fā)布程序用的
netease_news_iphone5_home.mobileprovision:描述文件
建議:先安裝cer文件,再安裝mobileprovision文件
注冊(cè)遠(yuǎn)程推送通知
客戶端如果想接收APNs的遠(yuǎn)程推送通知,必須先注冊(cè)(得到用戶的授權(quán))
一般在App啟動(dòng)完畢后就馬上注冊(cè)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 注冊(cè)遠(yuǎn)程通知
UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:type];
return YES; }
注冊(cè)成功后會(huì)調(diào)用AppDelegate的下面方法,得到設(shè)備的deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSLog(@"%@", deviceToken); ? }
JPush
一套遠(yuǎn)程推送解決方案,支持android和iOS兩個(gè)平臺(tái)
它能夠快捷地為iOS App增加推送功能,減少集成APNs需要的工作量、開發(fā)復(fù)雜度
更多的信息,可以參考JPush官方網(wǎng)站:https://www.jpush.cn
集成iOS SDK的步驟可以參考
http://docs.jpush.cn/pages/viewpage.action?pageId=2621727