推送通知
- 注意:這裡說的推送通知跟NSNotification有所差別
- NSNotification是抽象的,不可見的
- 推送通知是可見的(能用肉眼看到)
- iOS中提供了2種推送通知
- 本地推送通知(Local Notification)
- 遠端推送通知(Remote Notification)
推送通知的呈現效果總結
- 總結一下,推送通知有5種不同的呈現效果
- 在螢幕頂部顯示一塊橫幅(顯示具體内容)
- 在螢幕中間彈出一個UIAlertView(顯示具體内容)
- 在鎖屏界面顯示一塊橫幅(鎖屏狀态下,顯示具體内容)
- 更新app圖示的數字(說明新内容的數量)
- 播放音效(提醒作用)
推送通知的使用細節
- 發出推送通知時,如果目前程式正運作在前台,那麼推送通知就不會被呈現出來
- 點選推送通知後,預設會自動打開發出推送通知的app
- 不管app打開還是關閉,推送通知都能如期發出
本地推送通知
- 什麼是本地推送通知
- 顧名思義,就是不需要聯網就能發出的推送通知(不需要伺服器的支援)
- 本地推送通知的使用場景
- 常用來定時提醒使用者完成一些任務,比如
- 清理垃圾、記賬、買衣服、看電影、玩遊戲
如何發出本地推送通知
- 建立本地推送通知對象
UILocalNotification *ln = [[UILocalNotification alloc] init];
- 設定本地推送通知屬性
- 推送通知的觸發時間(何時發出推送通知)
@property(nonatomic,copy) NSDate *fireDate;
- 推送通知的具體内容
@property(nonatomic,copy) NSString *alertBody;
- 在鎖屏時顯示的動作标題(完整标題:“滑動來” + alertAction)
@property(nonatomic,copy) NSString *alertAction;
- 音效檔案名
@property(nonatomic,copy) NSString *soundName;
- app圖示數字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
如何發出本地推送通知
- 排程本地推送通知(排程完畢後,推送通知會在特地時間fireDate發出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
- 獲得被排程(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
(已經發出且過期的推送通知就算排程結束,會自動從這個數組中移除)
- 取消排程本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
- 立即發出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
本地推送通知的其他屬性
- 每隔多久重複發一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;
- 點選推送通知打開app時顯示的啟動圖檔
@property(nonatomic,copy) NSString *alertLaunchImage;
- 附加的額外資訊
@property(nonatomic,copy) NSDictionary *userInfo;
- 時區
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般設定為[NSTimeZone defaultTimeZone] ,跟随手機的時區)
點選本地推送通知
- 當使用者點選本地推送通知,會自動打開app,這裡有2種情況
- app并沒有關閉,一直隐藏在背景
- 讓app進入前台,并會調用AppDelegate的下面方法(并非重新啟動app)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
- app已經被關閉(程序已死)
- 啟動app,啟動完畢會調用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- launchOptions參數通過UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知對象
遠端推送通知(難)
- 什麼是遠端推送通知
- 顧名思義,就是從遠端伺服器推送給用戶端的通知(需要聯網)
- 遠端推送服務,又稱為APNs(Apple Push Notification Services)
- 為什麼需要遠端推送通知?
- 傳統擷取資料的局限性
- 隻要使用者關閉了app,就無法跟app的伺服器溝通,無法從伺服器上獲得最新的資料内容
- 遠端推送通知可以解決以上問題
- 不管使用者打開還是關閉app,隻要聯網了,都能接收到伺服器推送的遠端通知
遠端推送通知使用須知
- 所有的蘋果裝置,在聯網狀态下,都會與蘋果的伺服器建立長連接配接
- 什麼是長連接配接
- 隻要聯網了,就一直建立連接配接
- 長連接配接的作用
- 時間校準
- 系統更新
- 查找我的iPhone
- .. ...
- 長連接配接的好處
- 資料傳輸速度快
- 資料保持最新狀态
一.開發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 : 某台電腦就能釋出某個程式
注冊遠端推送通知
- 注冊成功後會調用AppDelegate的下面方法,得到裝置的deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@", deviceToken);
}
點選遠端推送通知
- 當使用者點選遠端推送通知,會自動打開app,這裡有2種情況
- app并沒有關閉,一直隐藏在背景
- 讓app進入前台,并會調用AppDelegate的下面方法(并非重新啟動app)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
- app已經被關閉(程序已死)
- 啟動app,啟動完畢會調用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- launchOptions參數通過UIApplicationLaunchOptionsRemoteNotificationKey取出伺服器傳回的字典内容
JPush
- 什麼是JPush
- 一套遠端推送解決方案,支援android和iOS兩個平台
- 它能夠快捷地為iOS App增加推送功能,減少內建APNs需要的工作量、開發複雜度
- 更多的資訊,可以參考JPush官方網站:https://www.jpush.cn
- 內建iOS SDK的步驟可以參考
- http://docs.jpush.cn/pages/viewpage.action?pageId=2621727
一. 推送通知
1. 什麼是推送通知?
> 首先明确:**此處的推送通知跟我們的”NSNotification”沒有半毛錢關系
> 可以了解為: 向使用者推送一條資訊來通知使用者某件事情
> 作用: 可以在APP退到背景,或者關閉時;繼續推送一條消息告訴使用者某件事情
2. 推送通知的應用場景?
(1) 一些任務管理APP,會在任務時間即将到達時,通知你做該任務;
(2) 健身App定時提醒你應該健身了;
(3) 買過電影票後,提前半小時告訴你,電影即将開場;
(4) 當你QQ或者微信收到消息時,即使退到背景,或者關閉APP,也可以收到資訊通知告訴我們;
(5) 電商APP,推送一條消息通知我們有新品上架等等
3. 推送通知的展現樣式?
(1) 在螢幕頂部顯示一塊橫幅(顯示具體内容)
(2) 在螢幕中間彈出一個UIAlertView(顯示具體内容)
(3) 在鎖屏界面顯示一塊橫幅(鎖屏狀态下,顯示具體内容)
(4) 更新app圖示的數字(說明新内容的數量)
(5) 播放音效(提醒作用)
* 注意:以上樣式隻能是使用者自己設定,我們無法通過代碼控制*
4. 推送通知的分類
1.本地推送通知
“本地”可以了解為”不聯網”;即使沒有網絡情況下,也可以推送通知消息
應用場景: 确定知道未來某個時間點應該提醒使用者什麼
2.遠端推送通知
概念:
與“本地”相對,表示,必須在聯網情況下才會向使用者推送通知消息
遠端推送服務,又稱為APNs(Apple Push Notification Services)
應用場景:
1. 不确定未來某個時間點應該提醒使用者什麼,臨時性的
2. 當APP徹底退出時也想繼續讓使用者擷取一些最新消息
使用原則: 誰能确定通知時間和内容, 誰就可以發送(開發人員在APP内部通過代碼發送=本地通知; 伺服器可以确定通知時間和内容=遠端通知)
5. 推送通知的實作
1. 本地推送通知
1.建立UILocalNotification對象
2.設定一些必要屬性
推送通知的觸發時間(何時發出推送通知)
@property(nonatomic,copy) NSDate *fireDate;
推送通知的具體内容
@property(nonatomic,copy) NSString *alertBody;
3.開始推送通知
- 根據fireDate設定的時間進行推送
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
- 立即推送
presentLocalNotificationNow:(UILocalNotification *)notification;
4.監聽使用者點選通知
- app處于前台
此時不會彈框通知使用者通知的到達,但是還是會調用對應的代理方法
- app并沒有關閉,一直隐藏在背景時
此時使用者點選通知資訊後,會讓app進入前台,并會調用AppDelegate的下面方法
application: didReceiveLocalNotification:
- app已經被關閉(程序已死)
此時使用者點選通知資訊後,會啟動app,啟動完畢會調用AppDelegate的下面方法
application: didFinishLaunchingWithOptions:
launchOptions參數通過UIApplicationLaunchOptionsLocalNotif icationKey取出本推送通知對象
5.額外設定
每隔多久重複發一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;
點選推送通知打開app時顯示的啟動圖檔
@property(nonatomic,copy) NSString *alertLaunchImage;
附加的額外資訊
@property(nonatomic,copy) NSDictionary *userInfo;
時區
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般設定為[NSTimeZone defaultTimeZone] ,跟随手機的時區)
在鎖屏時顯示的動作标題(完整标題:“滑動來” + alertAction)
@property(nonatomic,copy) NSString *alertAction;
音效檔案名
@property(nonatomic,copy) NSString *soundName;
app圖示數字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
6.其他操作
- 獲得被排程(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
已經發出且過期的推送通知就算排程結束,會自動從這個數組中移除
- 取消排程本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
7.注意事項
- 在iOS 8.0+,如果要使用本地通知,需要得到使用者的許可
在didFinishLaunchingWithOptions方法中添加如下代碼
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:settings];
8.額外補充
- 在iOS8.0之後,可以設定推送通知帶操作行為
在注冊設定時,設定categories:參數
監聽通知操作行為的點選
2. 遠端推送通知
1.遠端推送的原理
> 所有蘋果裝置, 在聯網狀态下,都會與蘋果伺服器建立一個長連接配接
“長連接配接”: 相對的一個概念是”短連接配接”
“長連接配接”優勢: 伺服器可以向用戶端發送資訊,保證資料即時性
劣勢: 占用客戶和伺服器資源
“短連接配接”優勢: 節省資源,一個會話結束後,立即釋放資源
劣勢: 伺服器無法主動向用戶端發資訊
> 蘋果裝置“長連接配接”作用:
時間校準
系統更新
查找我的iPhone
推送通知...
> 原理就是借助蘋果裝置與APNs伺服器之間的長連接配接, 借助APNs伺服器将消息發送給用戶端
2.遠端推送通知實作的條件
> 隻有真機可以調試推送通知
因為隻有真機具備UDID, 才能夠生成deviceToken
> 需要真機調試證書, 推送測試證書
3.遠端推送通知實作, 用戶端需要做的事
1. 請求蘋果獲得deviceToken
- (void)registerRemoteNotification
{
if (isIOS(8.0))
{
1. 請求通知授權
UIUserNotificationSettings *notificationSet = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSet];
2. 注冊遠端通知
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
iOS8.0之前請求遠端推送通知
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound ];
}
}
2. 得到蘋果傳回的deviceToken,發送deviceToken給公司的伺服器
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@", deviceToken);
}
3. 監聽使用者對通知的點選
實作APP代理方法
接收到通知, 并且在以下場景
當APP在前台時, 可以調用
當APP從背景, 進入到前台, 可以調用
注意:當APP 被徹底退出時, 不調用這個方法, 調用 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"%@", userInfo);
}
或者:
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
}
4.遠端推送測試
> PushMeBaby
1. 編譯會出現錯誤, 直接把錯誤行注釋即可;
2. 需要填寫對應的deviceToken;
3. 需要将推送測試證書改名為aps.cer 拖入項目中;
5.第三方推送
極光推送(JPush)
個推
信鴿
具體內建步驟以及使用方法, 請檢視對應的官方文檔, 非常詳細;
第三方服務合集: [http://mdsa.51cto.com/services/]
二. 應用程式間跳轉
1. 什麼是應用間跳轉,有什麼作用?
- 應用場景
1. 使用第三方使用者登入,需要使用者授權,還需要"傳回到調用的程式,同時傳回授權的使用者名"
2. 應用程式推廣,網易彩票,設定-推薦應用-有很多應用程式圖示如果本機已經安裝過,會直接跳轉到另外一個應用程式, 軟體的廣告,推廣結果,後續會有一些列的金錢上的結算
3. 支付寶,第三方支付,淘寶,電話費充值。。。
2. 應用程式間跳轉實作?
直接打開對應APP的scheme即可
1.概念須知
> URL : 統一資源定位符
scheme(協定頭) : 決定通過什麼方式查找資源 http:// ftp:// tel:// file://
path(路徑) : 資源路徑 www.baidu.com 192.168.1.1/資源 110 /User/Desktop
2. 設定方式
> 預設情況下應用程式是沒有自己的URL的,如果想要擁有自己的URL,需要設定URL
項目 -> info -> URL Types -> URL Scheme
3. 打開方式
代碼:
[[UIApplication shareApplication] openURL:appURL];
4.跳轉到對方APP, 對方APP執行的代理方法
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
}
iOS9.0跳轉适配
在info.plist檔案中添加LSApplicationQueriesSchemes 字段 ,是數組類型
三. 社交分享
1. 什麼是社交分享, 有什麼作用?
- 通過使用者的分享,讓更多的人去了解和使用這個App
- 目前移動網際網路應用程式推廣的最重要手段之一
- 屬于口碑營銷的範疇,經典成功案例是《瘋狂猜圖》
2. 社交分享的實作方案
1.系統自帶社交分享
1. 導入Social.framework
2. 判斷服務是否可用
[SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo];
3. 彈出分享内容輸入界面
SLComposeViewController *cc = \[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
[self presentViewController:cc animated:YES completion:nil];
4. 額外設定
[cc setInitialText:@"測試文字"]; 初始化文字
[cc addImage:[UIImage imageNamed:@"lufy"]]; 配圖
2.第三方SDK實作(友盟分享)
下載下傳位址: [http://www.umeng.com/]
1. 申請賬号,建立應用
2. 下載下傳SDK
3. 參照內建文檔
- 遠端推送應用配置過程
1. 建立支援遠端推送功能的App ID
2. 建立調試證書,并選中剛剛建立的App ID
3. 下載下傳CER檔案,并導入鑰匙串管理
4. 建立釋出證書,并選中剛剛建立的App ID
5. 下載下傳CER檔案,并導入鑰匙串管理
6. 檢查App ID,确認證書已經指定
7. 生成描述檔案
格式:{"aps":{"alert":"This is some fancy message.","badge":1,"sound":"default"}}
遠端推送應用程式開發過程
1. 建立應用程式
2. 指定AppID,在developer.apple.com上設定的AppID
if(系統版本 >= 8.0)
{
注冊接收通知的類型
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
注冊允許接收遠端推送通知
[application registerForRemoteNotifications];
}
else
{
如果是iOS7.0,使用以下方法注冊
[application registerForRemoteNotificationTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound];
}
當得到蘋果的APNs伺服器傳回的DeviceToken就會被調用
7040f7d5 5a974598 c5cf31b5 3e340b39 68affd25 122f0ce1 3f315226 396c2e5b
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"deviceToken是:%@", deviceToken);
}
接收到遠端通知,觸發方法和本地通知一緻
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"%@", userInfo);
}
使用背景的遠端消息推送
1> 在Capabilities中打開遠端推送通知
2> 實作代理方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
遠端消息資料格式:
{"aps" : {"content-available" : 1},"content-id" : 42}
執行completionHandler有兩個目的
1> 系統會估量App消耗的電量,并根據傳遞的UIBackgroundFetchResult 參數記錄新資料是否可用
2> 調用完成的處理代碼時,應用的界面縮略圖會自動更新
注意:接收到遠端通知到執行完網絡請求之間的時間不能超過30秒
if (userInfo) {
int contentId = [userInfo[@"content-id"] intValue];
ViewController *vc = (ViewController *)application.keyWindow.rootViewController;
[vc loadDataWithContentID:contentId completion:^(NSArray *dataList) {
vc.dataList = dataList;
NSLog(@"重新整理資料結束");
completionHandler(UIBackgroundFetchResultNewData);
}];
} else {
completionHandler(UIBackgroundFetchResultNoData);
}
GitHub 項目連結 :
https://github.com/liminting/MTTestPushVoice