iOS推送流程以及激光推送介紹

做遠(yuǎn)程推送,首先在蘋果的開發(fā)者中心配置兩個(gè)證書吸耿,下載到本地祠锣,在鑰匙串中點(diǎn)擊對(duì)應(yīng)證書,選擇導(dǎo)出證書即可得到激光所需要的p12文件咽安,這個(gè)過程中會(huì)用密碼填寫锤岸,需要記住。
這里主要介紹本地推送板乙,本地進(jìn)行推送重點(diǎn)在于構(gòu)建出firedate和間timerinter是偷,來達(dá)到某個(gè)時(shí)間點(diǎn)的推送。iOS系統(tǒng)的升級(jí)系統(tǒng)的推送系統(tǒng)也進(jìn)行了比較大的更新募逞,尤其在iOS10以及以后推出了一套新的API來管理推送蛋铆。還有就是對(duì)于iOS8的系統(tǒng),必須注冊(cè)并用戶點(diǎn)擊了同意才能進(jìn)行推送放接,當(dāng)然都需要在info里面添加需要進(jìn)行推送的字段刺啦。

iOS8:注冊(cè)推送通過UIUserNotificationSettings這個(gè)對(duì)象來設(shè)置推送類型,通過UIApplication 注冊(cè)通知纠脾。

UIUserNotificationSettings *localNot = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:localNot];

iOS10:通過UNUserNotificationCenter這個(gè)對(duì)象來獲取授權(quán)玛瘸,并且也把查詢用戶授權(quán)的接口也以及給出

  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  center.delegate = self;
  [center requestAuthorizationWithOptions:UNAuthorizationOptionAlert|UNAuthorizationOptionSound|UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) {
           
            if (!error&& granted) {
                
                NSLog(@"用戶點(diǎn)擊允許");
            } else {
                
                NSLog(@"注冊(cè)失敗");
            }
        }];
 [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
           
            if (settings.authorizationStatus == UNAuthorizationStatusDenied) {
                //
                NSLog(@"未作出選擇");
            } else if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
                //
                NSLog(@"未授權(quán)");
            } else {
                
                NSLog(@"已經(jīng)授權(quán)");
            }
        }];

遠(yuǎn)程推送

ios_8_to_ios 10
[[UIApplication sharedApplication] registerForRemoteNotifications];

iOS_10_later
 [[UIApplication sharedApplication] registerForRemoteNotifications];

iOS_8_ before

[application registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];

發(fā)送通知:為了兼容iOS10以及大于:發(fā)送本地通知也有兩套不同的API。
iOS10er:發(fā)送本地通知主要依賴于application這個(gè)對(duì)象苟蹈,首先構(gòu)造出UILocalNotification這個(gè)發(fā)送本地通知的對(duì)象糊渊,再通過application這個(gè)對(duì)象發(fā)送UILocalNotification,UILocalNotification的firedate和@property(nonatomic) NSCalendarUnit repeatInterval; 決定了在那個(gè)時(shí)間發(fā)送通知和重復(fù)規(guī)律慧脱,不過需要注意的是,repeaterval是一個(gè)枚舉類型:

        NSCalendarUnitEra                = kCFCalendarUnitEra,
        NSCalendarUnitYear               = kCFCalendarUnitYear,
        NSCalendarUnitMonth              = kCFCalendarUnitMonth,
        NSCalendarUnitDay                = kCFCalendarUnitDay,
        NSCalendarUnitHour               = kCFCalendarUnitHour,
        NSCalendarUnitMinute             = kCFCalendarUnitMinute,
        NSCalendarUnitSecond             = kCFCalendarUnitSecond,
        NSCalendarUnitWeekday            = kCFCalendarUnitWeekday,
        NSCalendarUnitWeekdayOrdinal     = kCFCalendarUnitWeekdayOrdinal,

我在開發(fā)中需要在某一天按照周重復(fù)來提醒用戶渺绒,選擇的是NSCalendarUnitWeekdayOrdinal(不知道為什么不是選擇NSCalendarUnitWeekday這個(gè)枚舉值)。userinfo這個(gè)字典屬性:可以用來放這個(gè)通知的id(自己生成),在取消通知的時(shí)候根據(jù)該id值判斷是否為需求取消的宗兼。
iOS10later:iOS發(fā)送通知?jiǎng)t簡(jiǎn)單很多躏鱼,通過UNNotificationTrigger的子類UNTimeIntervalNotificationTrigger;UNCalendarNotificationTrigger殷绍;UNLocationNotificationTrigger三個(gè)類染苛,根據(jù)需求來構(gòu)造出本地通知。

UNTimeIntervalNotificationTrigger:+ (instancetype)triggerWithTimeInterval:(NSTimeInterval)timeInterval repeats:(BOOL)repeats;

這個(gè)方法構(gòu)造主到,不過只有timeintercal茶行,而沒有firedate,猜想應(yīng)該是當(dāng)前時(shí)間(還沒有驗(yàn)證)镰烧;我在開發(fā)中用到的是UNCalendarNotificationTrigger:它需要一個(gè)NSDateComponents對(duì)象,來指定起飛時(shí)間楞陷,這個(gè)可以借助NSCalendar怔鳖,這個(gè)對(duì)象根據(jù)發(fā)送通知的時(shí)間來構(gòu)造出NSDateComponents:

 static dispatch_once_t onceToken;
 static NSCalendar *calender;
 dispatch_once(&onceToken, ^{
       calender = [NSCalendar currentCalendar];
  });
NSDateComponents *compen = [calender components:NSCalendarUnitWeekday|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitMonth fromDate:alertDate];
 UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:compen repeats:YES];//repeats決定是否重復(fù)

到這里是否有疑問間隔如何設(shè)置,其實(shí)也是借助datecompent這個(gè)對(duì)象固蛾,比如你想要設(shè)置每天八點(diǎn)结执,只需要trigger.dateComponents.houre = 8;就可以達(dá)到天重復(fù),對(duì)于周重復(fù)艾凯,設(shè)置weekday這個(gè)屬性即可(這也是對(duì)于iOS10以后通知間隔不是選擇NSCalendarUnitWeekday疑惑所在献幔,注意NSDateComponents是一個(gè)深拷貝對(duì)象,需要trigger.dateComponents.weekday = x;)趾诗。很重要一點(diǎn)對(duì)于iOS10可以查看nextfiredate來檢查是否正確蜡感,對(duì)iOS10er可以輸出locationnotifation這個(gè)對(duì)象,也可以查看下個(gè)觸發(fā)點(diǎn)恃泪。
UNMutableNotificationContent:決定了通知如何顯示:到這里我們就可以構(gòu)造出一個(gè)請(qǐng)求對(duì)象了:

UNNotificationRequest [UNNotificationRequest requestWithIdentifier:remindArray[i] content:content trigger:trigger];//得到request就可以拿UNUserNotificationCenter這個(gè)對(duì)象來發(fā)送了
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];      
 [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {              
      if (!error) {                                    
          NSLog(@"week:%ld hour:%ld minute:%ld remindid:%@",(long)trigger.dateComponents.weekday,    (long)trigger.dateComponents.hour,(long)trigger.dateComponents.minute,remindArray[i]);                
          NSLog(@"通知已經(jīng)成功添加");              
  }        
}];

取消通知:iOS10later:

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center removePendingNotificationRequestsWithIdentifiers:identArray];

iOS10er:

NSArray *array = [[UIApplication sharedApplication] scheduledLocalNotifications];
for (UILocalNotification *local in array) {
            NSString *notiString = local.userInfo[kidentifier];
            BOOL find = NO;
            for (NSString *identfil in identArray) {
                
                if ([identfil isEqualToString:notiString]) {
                    
                    find = YES;
                    break;
                } else
                    continue;
            }
            if (find) {
                
                [findArray addObject:local];
            }
        }
        for (UILocalNotification *local in findArray) {
            
            [[UIApplication sharedApplication] cancelLocalNotification:local];
            NSLog(@"取消本地通知...%@",local.userInfo[kidentifier]);
        }

在收到通知不同系統(tǒng)版本處理
<iOS10:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    
    NSLog(@"接收到本地通知");
    
    // 通過UI控件來測(cè)試.當(dāng)App徹底退出時(shí), 用戶點(diǎn)擊通知, 打開APP , 會(huì)不會(huì)調(diào)用這個(gè)方法
//    UISwitch *sw = [[UISwitch alloc] init];
//    [self.window.rootViewController.view addSubview:sw];
    
    // 查看當(dāng)前的狀態(tài)出于(前臺(tái): 0)/(后臺(tái): 2)/(從后臺(tái)進(jìn)入前臺(tái): 1)
    NSLog(@"applicationState.rawValue: %zd", application.applicationState);
    
    // 執(zhí)行響應(yīng)操作
    // 如果當(dāng)前App在前臺(tái),執(zhí)行操作
    if (application.applicationState == UIApplicationStateActive) {
        
        UIAlertView *alerview = [[UIAlertView alloc] initWithTitle:notification.alertTitle message:notification.alertBody delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
        [alerview show];
       // [MBProgressHUD showSuccess:notification.alertBody];
        NSLog(@"執(zhí)行前臺(tái)對(duì)應(yīng)的操作");
    } else if (application.applicationState == UIApplicationStateInactive) {
        // 后臺(tái)進(jìn)入前臺(tái)
        NSLog(@"執(zhí)行后臺(tái)進(jìn)入前臺(tái)對(duì)應(yīng)的操作");
        //NSLog(@"%@", notification.userInfo);
    } else {
        // 當(dāng)前App在后臺(tái)
        NSLog(@"執(zhí)行后臺(tái)對(duì)應(yīng)的操作");
    }
}

>=iOS10:iOS10以后通知管理更加方便郑兴,不管遠(yuǎn)程還是本地都通過走兩個(gè)方法,一個(gè)是在前臺(tái)收到通知贝乎,以及在后臺(tái)收到通知情连,方法如下

//前臺(tái)接收通知時(shí)
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    
    UNNotificationRequest *requst = notification.request;
    UNNotificationContent *content = requst.content;
    NSDictionary *userInfo = content.userInfo;
    
    if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        
        
        NSLog(@"iOS 10 收到遠(yuǎn)端通知");
    } else {
        
        NSLog(@"iOS 收到本地通知");
    }
    //執(zhí)行這個(gè)方法,處于前臺(tái)的app才可以顯示通知览效,類型可以選擇
    completionHandler(UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert);
}

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    
    completionHandler();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末却舀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锤灿,更是在濱河造成了極大的恐慌挽拔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件但校,死亡現(xiàn)場(chǎng)離奇詭異篱昔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門州刽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來空执,“玉大人,你說我怎么就攤上這事穗椅”姘恚” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵匹表,是天一觀的道長(zhǎng)门坷。 經(jīng)常有香客問我,道長(zhǎng)袍镀,這世上最難降的妖魔是什么默蚌? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮苇羡,結(jié)果婚禮上绸吸,老公的妹妹穿的比我還像新娘。我一直安慰自己设江,他們只是感情好锦茁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叉存,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歼捏。 梳的紋絲不亂的頭發(fā)上瞳秽,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音瓢棒,去河邊找鬼脯宿。 笑死连霉,一個(gè)胖子當(dāng)著我的面吹牛窟感,可吹牛的內(nèi)容都是我干的歉井。 我是一名探鬼主播躏嚎,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼箭阶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼尾膊!你這毒婦竟也來了冈敛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滩届,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泡挺,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贱除,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年月幌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缅帘。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盖袭,死狀恐怖鳄虱,靈堂內(nèi)的尸體忽然破棺而出拙已,到底是詐尸還是另有隱情系宫,我是刑警寧澤扩借,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響屯碴,放射性物質(zhì)發(fā)生泄漏忱叭。R本人自食惡果不足惜虚缎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一陌僵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧创坞,春花似錦碗短、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纲堵,卻和暖如春巡雨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背席函。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工铐望, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人向挖。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓蝌以,卻偏偏與公主長(zhǎng)得像炕舵,于是被迫代替她去往敵國(guó)和親何之。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 推送通知 注意:這里說的推送通知跟NSNotification有所區(qū)別 NSNotification是抽象的咽筋,不可...
    iOS開發(fā)攻城獅閱讀 4,199評(píng)論 1 13
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2溶推,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐,SD...
    Isspace閱讀 6,701評(píng)論 10 16
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,700評(píng)論 0 15
  • 寫作原因:網(wǎng)上看了很多推送文章都沒有完美的解答我的疑惑奸攻;主要有以下兩點(diǎn)蒜危,1:推送來了我點(diǎn)擊應(yīng)用圖標(biāo)進(jìn)入應(yīng)用怎么取到...
    Thebloodelves閱讀 4,498評(píng)論 26 71
  • “問世間,情為何物睹耐?直教生死相許辐赞。” 元好問這個(gè)千古名句大家耳熟能詳硝训,卻很少有人留意响委,情深如許的曲辭新思,說的並非人類...
    凌谷閱讀 271評(píng)論 0 1