- 傳智播客 課件整理
推送通知
- 注意:這里說的推送通知跟NSNotification有所區別
1.NSNotification是抽象的,不可見的
2.推送通知是可見的(能用肉眼看到)
- iOS中提供了2種推送通知
1.本地推送通知(LocalNotification)
2.遠程推送通知(RemoteNotification)
- n推送通知的作用
可以讓不在前臺運行的app,告知用戶app內部發生了什么事情
- 推送通知的呈現效果
1.在屏幕頂部顯示一塊橫幅
在屏幕頂部顯示一塊橫幅.png
2.在屏幕中間彈出一個UIAlertView
在屏幕中間彈出一個UIAlertView .png
還可以在呈現推送通知的同時播放音效
3.鎖屏時也照樣呈現鎖屏時也照樣呈現 .png
4.呈現推送通知的同時,還可以更新app圖標的數字呈現推送通知的同時,還可以更新app圖標的數字 .png
5.用戶接收的推送通知,都會展示在“通知中心”用戶接收的推送通知,都會展示在“通知中心”.png
- 推送通知的呈現效果總結
1.在屏幕頂部顯示一塊橫幅(顯示具體內容)
2.在屏幕中間彈出一個UIAlertView(顯示具體內容)
3.在鎖屏界面顯示一塊橫幅(鎖屏狀態下,顯示具體內容)
4.更新app圖標的數字(說明新內容的數量)
5.播放音效(提醒作用)
- 推送通知的呈現效果設置
顯示橫幅還是UIAlertView,取決于用戶的設置
顯示橫幅還是UIAlertView,取決于用戶的設置 1.png
顯示橫幅還是UIAlertView,取決于用戶的設置 2.png
顯示橫幅還是UIAlertView,取決于用戶的設置 3.png
顯示橫幅還是UIAlertView,取決于用戶的設置 4.png
- 推送通知的呈現效果設置
用戶也可以決定是否要開啟以下4個功能:
1.顯示App圖標數字
2.播放音效
3.鎖屏顯示
4.顯示在“通知中心”
- 推送通知的使用細節
1.發出推送通知時,如果當前程序正運行在前臺,那么推送通知就不會被呈現出來
2.點擊推送通知后,默認會自動打開發出推送通知的app
3.不管app打開還是關閉,推送通知都能如期發出
本地推送通知
- 什么是本地推送通知
顧名思義,就是不需要聯網就能發出的推送通知(不需要服務器的支持)
- 本地推送通知的使用場景
常用來定時提醒用戶完成一些任務,比如
清理垃圾、記賬、買衣服、看電影、玩游戲
如何發出本地推送通知
- 創建本地推送通知對象
UILocalNotification*ln= [[UILocalNotificationalloc] init];
n設置本地推送通知屬性
p推送通知的觸發時間(何時發出推送通知)
@property(nonatomic,copy) NSDate*fireDate;
p推送通知的具體內容
@property(nonatomic,copy) NSString*alertBody;
p在鎖屏時顯示的動作標題(完整標題:“滑動來”+ alertAction)
@property(nonatomic,copy) NSString*alertAction;
p音效文件名
@property(nonatomic,copy) NSString*soundName;
papp圖標數字
@property(nonatomic) NSIntegerapplicationIconBadgeNumber;
- 如何發出本地推送通知
n調度本地推送通知(調度完畢后,推送通知會在特地時間fireDate發出)
[[UIApplicationsharedApplication] scheduleLocalNotification:ln];
n獲得被調度(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray*scheduledLocalNotifications;
(已經發出且過期的推送通知就算調度結束,會自動從這個數組中移除)
n取消調度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification*)notification;
- (void)cancelAllLocalNotifications;
n立即發出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification*)notification;
- 本地推送通知的其他屬性
n每隔多久重復發一次推送通知
@property(nonatomic) NSCalendarUnitrepeatInterval;
n點擊推送通知打開app時顯示的啟動圖片
@property(nonatomic,copy) NSString*alertLaunchImage;
n附加的額外信息
@property(nonatomic,copy) NSDictionary*userInfo;
n時區
@property(nonatomic,copy) NSTimeZone*timeZone;
(一般設置為[NSTimeZonedefaultTimeZone],跟隨手機的時區)
- 點擊本地推送通知
n當用戶點擊本地推送通知,會自動打開app,這里有2種情況
papp并沒有關閉,一直隱藏在后臺
ü讓app進入前臺,并會調用AppDelegate的下面方法(并非重新啟動app)
- (void)application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification;
p
papp已經被關閉(進程已死)
ü啟動app,啟動完畢會調用AppDelegate的下面方法
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions;
2launchOptions參數通過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象
遠程推送通知
- 什么是遠程推送通知
顧名思義,就是從遠程服務器推送給客戶端的通知(需要聯網)
遠程推送服務,又稱為APNs(Apple Push Notification Services)
為什么需要遠程推送通知?
傳統獲取數據的局限性
只要用戶關閉了app,就無法跟app的服務器溝通,無法從服務器上獲得最新的數據內容
遠程推送通知可以解決以上問題
不管用戶打開還是關閉app,只要聯網了,都能接收到服務器推送的遠程通知
- 遠程推送通知使用須知
- 所有的蘋果設備,在聯網狀態下,都會與蘋果的服務器建立長連接
- 什么是長連接
只要聯網了,就一直建立連接- 長連接的作用
- 時間校準
- 系統升級
- 查找我的iPhone
- .....
- 長連接的好處
- 數據傳輸速度快
- 數據保持最新狀態
上兩張推送的原理圖
針對第二張圖這里有個疑問,如果我們在同一個設備上用不同的賬號登錄QQ,推送怎么識別不同的賬號?- 本教程來自傳智播客,感謝傳智播客的詳細資料
官方文檔的解釋
- n遠程推送的內容格式(服務器推送給客戶端的內容格式---JSON)
- 獲得deviceToken的過程
證書配置
一.開發iOS程序的推送功能,iOS端需要做的事
1.請求蘋果獲得deviceToken
2.得到蘋果返回的deviceToken
3.發送deviceToken給公司的服務器
4.監聽用戶對通知的點擊
二.調試iOS的遠程推送功能,必備條件:
1.真機
2.調試推送需要的證書文件
1 aps_development.cer: 某臺電腦就能調試某個app的推送服務
2 ios_development.cer:讓電腦具備真機調試的能力(調試設備)
3 iphone5_qq.mobileprovision:某臺電腦就能利用某臺設備調試某個程序
三.發布具有推送服務的app
1 aps_production.cer:如果發布的程序中包含了推送服務,就必須安裝這個證書
2 ios_distribution.cer : 讓電腦具備發布程序的能力
3 qq.mobileprovision : 某臺電腦就能發布某個程序
證書配置01 – 創建AppID
- n注意
p遠程推送只能在真機上測試!因此先要保證真機調試的環境沒有問題!
p
n遠程推送的第一步是要創建App ID
p目的是說明哪個App需要使用推送服務
p為遠程推送服務創建的AppID一定要是全稱,不能帶有*
證書配置02 – 為AppID創建APNs SSL證書
- 真機調試用的APNs SSL證書:要在哪臺電腦上調試具有推送服務的App
- n發布程序用的APNs SSL證書:要在哪臺電腦上發布具有推送服務的App
- n最終得到2個APNs SSL證書
pAPNsDevelopmentiOS:真機調試用的證書
pAPNsProductioniOS:發布程序用的證書
證書配置03 – 生成描述文件
- n描述文件的作用是用來描述
p哪臺設備要在哪臺電腦上調試哪個程序
證書配置04 –安裝
- 最終會得到3個文件
paps_development.cer:真機調試用的
paps_production.cer:發布程序用的
pnetease_news_iphone5_home.mobileprovision:描述文件
- 建議:先安裝cer文件,再安裝mobileprovision文件
注冊遠程推送通知
- 客戶端如果想接收APNs的遠程推送通知,必須先注冊(得到用戶的授權)
- 一般在App啟動完畢后就馬上注冊
//這個方法在iOS8已經廢棄
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
//注冊遠程通知
UIRemoteNotificationTypetype= UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:type];
returnYES;
}
```
```
//使用下面的代碼
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *userSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:userSettings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
}
- 如果是第一次注冊,會彈出下邊的對話框
注冊遠程推送通知
n注冊成功后會調用AppDelegate的下面方法,得到設備的deviceToken
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSLog(@"%@", deviceToken);
}
點擊遠程推送通知
n當用戶點擊遠程推送通知,會自動打開app,這里有2種情況
papp并沒有關閉,一直隱藏在后臺
ü讓app進入前臺,并會調用AppDelegate的下面方法(并非重新啟動app)
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo;
p
papp已經被關閉(進程已死)
ü啟動app,啟動完畢會調用AppDelegate的下面方法
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions;
2launchOptions參數通過UIApplicationLaunchOptionsRemoteNotificationKey取出服務器返回的字典內容