iOS推送

注意:

UILocalNotification:本地通知,進行UI通知(iOS8以后也需要先注冊通知授權)。
這兩個類不在同一個框架中:
NSNotificationCenter在Foundation框架中
UILocalNotification在UIKit框架中

本地推送

iOS7:不需要授權
iOS8:以后需要授權
步驟:
1、通過在AppDelegate中判斷版本注冊通知授權
2、在需要的界面創建一個本地通知,設置通知的屬性,最后又AppDelegate調用通知

在#import "AppDelegate.h"中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        UIUserNotificationSettings *userNotification =  [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil ];
        [application registerUserNotificationSettings:userNotification];   
    }
    return YES;
}

在#import "ViewController.h"中
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
   // 1.創建本地通知
    UILocalNotification *localNote = [[UILocalNotification alloc] init];

    // 2.設置本地通知的內容
    // 2.1.設置通知發出的時間
    localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
    // 2.2.設置通知的內容
    localNote.alertBody = @"通知內容";
    // 2.3.設置滑塊的文字
    localNote.alertAction = @"滑塊文字";
    // 2.4.決定alertAction是否生效
    localNote.hasAction = NO;
    // 2.5.設置點擊通知的啟動圖片
    localNote.alertLaunchImage = @"隨便都可以";
    // 2.6.設置alertTitle
    localNote.alertTitle = @"123";
    // 2.7.設置有通知時的音效
    localNote.soundName = @"語音文件名";
    // 2.8.設置應用程序圖標右上角的數字
    localNote.applicationIconBadgeNumber = 9;
    // 2.9.設置額外信息
    localNote.userInfo = @{@"type" : @1};

    // 3.調用通知
    [[UIApplication sharedApplication] scheduleLocalNotification:localNote];
}
Application代理方法的launchOptions屬性
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ;
launchOptions:用戶直接打開程序的時候這個參數是沒有值的。
若由其他應用程序通過openURL:啟動,則UIApplicationLaunchOptionsURLKey對應的對象為啟動URL(NSURL),
UIApplicationLaunchOptionsSourceApplicationKey對應啟動的源應用程序的bundle ID (NSString);
若由本地通知啟動,則UIApplicationLaunchOptionsLocalNotificationKey對應的是為啟動應用程序的的本地通知對象(UILocalNotification);
若由遠程通知啟動,則UIApplicationLaunchOptionsRemoteNotificationKey對應的是啟動應用程序的的遠程通知信息userInfo(NSDictionary)
根據通知跳轉到相應的界面
1、在AppDelegate中實現方法監聽通知,判斷是否進入后臺,根據通知設置的額外信息userInfo來打開相應的界面。
// 應用程序在進入前臺,或者在前臺的時候都會執行該方法
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    // 針對應用程序在后臺的時候進行的跳轉
    if (application.applicationState == UIApplicationStateInactive) {
        NSLog(@"進行界面的跳轉");
        NSLog(@"%@", notification.userInfo);

        UIView *redView = [[UIView alloc] init];
        redView.frame = CGRectMake(0, 0, 100, 100);
        redView.backgroundColor = [UIColor redColor];
        [self.window.rootViewController.view addSubview:redView];
    }
}
2、當程序被殺死了,當再次點擊進來是不會來到實現的代理方法,此時需要在程序加載完畢之后判斷。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 界面的跳轉(針對應用程序被殺死的狀態下的跳轉)
    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        // 跳轉代碼
        UILabel *redView = [[UILabel alloc] init];
        redView.frame = CGRectMake(0, 0, 200, 300);
        redView.numberOfLines = 0;
        redView.font = [UIFont systemFontOfSize:12.0];
        redView.backgroundColor = [UIColor redColor];
        redView.text = [NSString stringWithFormat:@"%@", launchOptions];
        [self.window.rootViewController.view addSubview:redView];
    }
    return YES;
}

遠程推送原理

一.什么是遠程通知
概念:由服務器發送消息給用戶彈出消息的通知(需要聯網)
遠程推送服務,又稱為APNs(Apple Push Notification Services)
二.為什么需要遠程通知
例子:淘寶最近雙11搞活動,各種送紅包,想告知用戶.但是該用戶不經常打包淘寶APP.淘寶如何通知該用戶有最新的活動呢?
傳統方式:只有用戶打開了淘寶客戶端,客戶端向服務器請求是否有最新的活動,才能在APP中告知用戶活動.
局限性:只要用戶關閉了app,就無法跟app的服務器溝通,無法從服務器上獲得最新的數據內容
遠程通知的好處:不管用戶打開還是關閉app,只要聯網了,都能接收到服務器推送的遠程通知

屏幕快照 2016-06-05 下午12.38.44.png

如何做遠程通知

需要真機,配置證書。
以微信客戶端為例
1、客戶端將手機的唯一標識UDID和應用程序的唯一標識Bound Identifier發送給蘋果的APNs服務器。
2、蘋果的APNs服務器根據這兩個唯一標識生成一個加密的唯一標識deviceToken,并放回給客服端。
3、在AppDelegate中實現相應的方法攔截,并將這個deviceToken和微信帳號ID發送給客戶端的服務器,客戶端的服務器保存(deviceToke和微信帳號對應)。
4、當別人需要發送消息給特定的微信帳號好友,微信服務器將對應的帳號的deviceToken和消息發送給蘋果的APNs服務器。
5、蘋果的APNs服務器根據對應的deviceToken發送推送通知給微信客戶端。
6、根據推送的消息,監聽用戶的點擊(類似本地通知)

代碼

#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//但程序被殺死,點擊推送通知進入程序來到這,根據不同iOS版本進行通知的授權與注冊
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
      //注冊通知授權
        [application registerUserNotificationSettings:settings];
     //注冊通知
        [application registerForRemoteNotifications];
    } else { // iOS7
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
    }

    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
        // 跳轉
    }
    return YES;
}

//攔截蘋果APNs服務器返回的deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 將DeviceToken傳給服務器
    NSLog(@"%@", deviceToken.description);
}

//當程序從后臺點擊推送通知進入時會調用這個方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%@", userInfo);
}

//當程序進入后臺,不點擊推送消息,也會調用這個方法,但是發送的通知有固定的格式,1.需要打開后臺模式 2.告訴系統是否有新內容的更新3、需要添加"content-available":"1";
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"11111111");

    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];

    // 1.需要打開后臺模式 2.告訴系統是否有新內容的更新 3.發送的通知有固定的格式("content-available":"1")
    completionHandler(UIBackgroundFetchResultNewData);
}

設置應用程序右上角顯示提示數字的兩種方法

方法一:    [application setApplicationIconBadgeNumber:2]; (優先級高)
方法二:    UILocalNotification *localNote = [[UILocalNotification alloc] init];
   localNote.applicationIconBadgeNumber = 9;

遠程通知證書配置

- .配置一個明確的APPID

  • 選擇明確的APPID,并且將遠程通知功能選中
屏幕快照 2016-06-05 下午12.48.47.png
屏幕快照 2016-06-05 下午12.49.27.png
  • 顯示Push Notifications并非Enabled,而是Configurable.


    屏幕快照 2016-06-05 下午12.50.44.png
    • 需要配置對應的證書

二 證書的配置

  • 在Certificates中配置證書
    • 選擇證書的類型(調試和發布都需要配置)
屏幕快照 2016-06-05 下午12.52.15.png
  • 選擇為哪一個APPID配置證書


    屏幕快照 2016-06-05 下午12.53.50.png
  • 其他步驟同真機調試和發布程序

  • 配置完成后獲得兩個證書文件


    屏幕快照 2016-06-05 下午12.54.43.png
  • 配置描述文件

屏幕快照 2016-06-05 下午12.55.15.png
  • 和真機描述文件完全一致

獲取DeviceToken

1.在蘋果的APNs服務器注冊,以獲取DeviceToken
通常在didFinishLaunchingWithOptions中添加如下代碼進行注冊

if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
        // 1.向用戶請求可以給用戶推送消息
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [application registerUserNotificationSettings:settings];

        // 2.注冊遠程通知(拿到用戶的DeviceToken)
        [application registerForRemoteNotifications];
    } else {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }

注冊之后在另外一個代理方法中,拿到DeviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 5e8cf393 9e950137 86ac8375 12185078 19eb3ebd 936777e1 f061caec a48cb236
    // 將用戶的用戶名和deviceToken發送給服務器,讓服務器進行保存備份即可
    NSLog(@"%@", deviceToken);
}

  • 將DeviceToken發送到服務器即可

測試遠程通知

  • 當前我們沒有自己的服務器,如何測試?

  • 可以使用一個第三方的Mac程序來測試:PushMeBaby

  • 使用該程序需要修改一些內容

    • 編譯程序,報錯的行注釋掉


      屏幕快照 2016-06-05 下午1.00.02.png
  • 運動pushMeBaby程序

![屏幕快照 2016-06-05 下午1.00.42.png](http://upload-images.jianshu.io/upload_images/1965034-16133560df57e119.png?
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

注意:填寫的內容
填寫推送給的DeviceToken
添加推送的內容:固定格式
{"aps":{"alert":"彈出的信息","badge":1,"sound":"聲音","info":"額外信息"}}

ios10推送介紹

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容