UILocalNotification本地通知

什么是本地通知
  • 顧名思義,不需要聯(lián)網(wǎng)就能發(fā)送的通知,無需服務(wù)器.
本地通知使用場景
  • 常用來提醒用戶完成一些定時(shí)任務(wù),比如
  • 清理垃圾,買衣服,看電影,睡覺,運(yùn)動(dòng)等

1. 如何發(fā)送本地推送通知


推送通知也屬于UI的一部分,所以推送通知對象是以UI開頭

方法送通知的代碼方法控制器的-touchesBegan: withEvent: 中測試,比較合適,放到viewDidLoad方法,用戶的注冊請求還沒有完成方法就調(diào)用了

  • 創(chuàng)建本地通知
//  創(chuàng)建本地通知對象
    UILocalNotification *ln = [[UILocalNotification alloc] init];
  • 設(shè)置本地通知屬性(推薦一個(gè)一個(gè)屬性測試運(yùn)行)
//  1.設(shè)置通知的內(nèi)容(如果此屬性不設(shè)置是不會(huì)發(fā)送通知的)
    ln.alertBody = @"小明,你媽叫你回家吃飯了!";
//  2.設(shè)置通知觸發(fā)的開始時(shí)間
    ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];
//  3.設(shè)置重復(fù)通知的時(shí)間,間隔
    ln.repeatInterval = NSCalendarUnitSecond;
//  4.設(shè)置重復(fù)執(zhí)行使用日歷(用戶設(shè)置的日歷)
    ln.repeatCalendar = [NSCalendar  currentCalendar];
//    NSString * const NSGregorianCalendar; 公歷
//    NSString * const NSChineseCalendar; 農(nóng)歷
//    ln.repeatCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar];
//  5.設(shè)置應(yīng)用圖標(biāo)右上角的數(shù)字
    ln.applicationIconBadgeNumber = 3;
//  6.設(shè)置點(diǎn)擊推送通知進(jìn)入界面的時(shí)候顯示,加載圖片
    ln.alertLaunchImage = @"";
//  7 設(shè)置通知的音效(只有真機(jī)有效)
    local.soundName = UILocalNotificationDefaultSoundName;
//  8 設(shè)置一些額外信息
    local.userInfo = @{@"QQ":@"55555",@"info":@"約了沒"};

//  iOS8.0 以后新增屬性
//  ************************************
//  1.設(shè)置區(qū)域,進(jìn)入或離開某個(gè)區(qū)域的時(shí)候觸發(fā)
//    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(40.1,106.1);
//    ln.region = [[CLCircularRegion alloc] initWithCenter:coordinate radius:10.0 identifier:@"ab"];
//  2.設(shè)置進(jìn)入或離開某個(gè)區(qū)域只執(zhí)行一次
//    ln.regionTriggersOnce = YES;
//  ***************************************

//  iOS8.2 新增屬性
//    ln.alertTitle = @"通知標(biāo)題";


  • 使用應(yīng)用[UIApplication]調(diào)度本地通知
//  讓應(yīng)用調(diào)度通知
    [[UIApplication sharedApplication] scheduleLocalNotification:ln];

2. 本地推送通知頁面跳轉(zhuǎn)


無論應(yīng)用是在前臺(tái),后臺(tái)還是已經(jīng)關(guān)閉都能如期接收到本地通知,但是當(dāng)用戶點(diǎn)擊通知進(jìn)入應(yīng)用的時(shí)候,我們需要根據(jù)不同情況,進(jìn)行處理

AppDelegate本地通知代理方法


/**
 *  一旦接收到本地通知就會(huì)調(diào)用該方法
 *  注意這個(gè)方法:應(yīng)用在前臺(tái)也會(huì)調(diào)用
 *  @param application  應(yīng)用
 *  @param notification 本地通知對象
 */
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

//  當(dāng)應(yīng)用在前臺(tái)時(shí)候什么都不做
    if (application.applicationState == UIApplicationStateActive) {
        return;
    }

//  當(dāng)應(yīng)用不再前臺(tái)的時(shí)候才去跳轉(zhuǎn),這樣用戶體檢更好
    UITabBarController *tbVc = (UITabBarController *)application.keyWindow.rootViewController;
    tbVc.selectedIndex = 1;

}

但是當(dāng)應(yīng)用已經(jīng)退出的時(shí)候,點(diǎn)擊通知進(jìn)入本應(yīng)用時(shí)候,不在調(diào)用application:didReceiveLocalNotification:的代理方法,難道當(dāng)應(yīng)用退出后,用戶再進(jìn)入應(yīng)用我們就不再跳轉(zhuǎn)指定界面了嗎?為了更好用戶體驗(yàn),我此時(shí)也應(yīng)該讓應(yīng)用跳轉(zhuǎn)到指定的界面,怎么才能實(shí)現(xiàn)這個(gè)功能呢? 我們知道當(dāng)應(yīng)用程序啟動(dòng)的時(shí)候一定會(huì)調(diào)用application: didFinishLaunchingWithOptions:的代理方法,在這里我們能拿到本地通知信息,也可以跳轉(zhuǎn)相應(yīng)的界面

//  如果是點(diǎn)擊本地通知進(jìn)來的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就會(huì)有內(nèi)容
    if(launchOptions[UIApplicationLaunchOptionsLocalNotificationKey])
    {
        //頁面跳轉(zhuǎn)
        UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
        tbVc.selectedIndex = 1;
    }

一個(gè)應(yīng)用可能要各種不同的通but知,點(diǎn)擊不同的通知可以跳轉(zhuǎn)不同界面,這個(gè)有該怎么做呢?

  1. 在發(fā)送通知時(shí)候,設(shè)置userInfo屬性
//  7.設(shè)置應(yīng)用信息
    ln.userInfo = @{@"pageKey":@"friend"};
  1. 在AppDelegate本地通知代理方法中進(jìn)行判斷

/**
 *  一旦接收到本地通知就會(huì)調(diào)用該方法
 *  注意這個(gè)方法:應(yīng)用在前臺(tái)也會(huì)調(diào)用
 *  @param application  應(yīng)用
 *  @param notification 本地通知對象
 */
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

//  當(dāng)應(yīng)用在前臺(tái)時(shí)候什么都不做
    if (application.applicationState == UIApplicationStateActive) {
        return;
    }
//  當(dāng)應(yīng)用不再前臺(tái)的時(shí)候才去跳轉(zhuǎn),這樣用戶體檢更好
//  獲取tabBarController
    UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;


//  獲取用戶設(shè)置的跳轉(zhuǎn)頁
    NSString *page = notification.userInfo[@"pageKey"];
//  如果是朋友圈
    if ([page isEqualToString:@"session"]) {
        tbVc.selectedIndex = 1;
    }else{
//       否則跳轉(zhuǎn)到好友
        tbVc.selectedIndex = 0;
    }
}

  • 測試launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]中的內(nèi)容
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
//  獲取UIApplicationLaunchOptionsLocalNotificationKey對應(yīng)內(nèi)容
    id obj = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
//  獲取控制器(注意此時(shí)需要通過self.window,通過application.keyWindow無法獲取到,因?yàn)榇藭r(shí)的window還沒有成為keyWindow)
    UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
//  獲取索引為0的控制(注意此時(shí)tbVc.selectedViewController為nil)
    UIViewController *vc = tbVc.viewControllers[0];

//  創(chuàng)建一個(gè)文本
    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor brownColor];
//  設(shè)置text為UIApplicationLaunchOptionsLocalNotificationKey對應(yīng)的內(nèi)容
    label.text =  [obj description] ;
    label.frame = CGRectMake(10, 100, 300, 400);
    label.numberOfLines = 0;
//  添加到控制器的View上
    [vc.view addSubview:label];


    return YES;
}

顯示結(jié)果:


336729BE-B7DA-4B83-9515-E10864F3FADE.png
  • 我們從中可以出他是一個(gè)UILocalNotification對象
  • 所以我們?nèi)〕鯱ILocalNotification對象,剩下的做法與接收到本地通知代理方法中處理相同,所以我們把它提取為一個(gè)公用的方法
/**
 *  根據(jù)通知跳轉(zhuǎn)到不同頁面
 */
- (void) jumpToPageWithLocalNotification:(UILocalNotification *) notification
{
    //  獲取tabBarController
    UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;

    //  獲取用戶設(shè)置的跳轉(zhuǎn)頁
    NSString *page = notification.userInfo[@"pageKey"];
    //  如果是朋友圈
    if ([page isEqualToString:@"session"]) {
        tbVc.selectedIndex = 0;
    }else{
        //       否則跳轉(zhuǎn)到好友
        tbVc.selectedIndex = 1;
    }
}
  • 在didReceiveLocalNotification方法中
/**
 *  一旦接收到本地通知就會(huì)調(diào)用該方法
 *  注意這個(gè)方法:應(yīng)用在前臺(tái)也會(huì)調(diào)用
 *  @param application  應(yīng)用
 *  @param notification 本地通知對象
 */
- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{

//  當(dāng)應(yīng)用在前臺(tái)時(shí)候什么都不做
    if (application.applicationState == UIApplicationStateActive) {
        return;
    }
//  當(dāng)應(yīng)用不再前臺(tái)的時(shí)候才去跳轉(zhuǎn),這樣用戶體檢更好
    [self jumpToPageWithLocalNotification:notification];
}

在didFinishLaunchingWithOptions方法中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
//  如果是點(diǎn)擊本地通知進(jìn)來的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就會(huì)有內(nèi)容
    UILocalNotification *notifcation = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
//  如果存在通知
    if(notifcation){
        [self jumpToPageWithLocalNotification:notifcation];
    }

    return YES;
}```

###3. iOS8的不同點(diǎn)
---
你如果把上面的程序運(yùn)行在iOS8上,會(huì)爆出如下錯(cuò)誤

>預(yù)習(xí)01-本地推送通知[掌握][615:7847] Attempting to schedule a local notification <UIConcreteLocalNotification: 0x7f935182b150>{fire date = Monday, July 13, 2015 at 9:02:25 AM China Standard Time, time zone = (null), repeat interval = 0, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = Monday, July 13, 2015 at 9:02:25 AM China Standard Time, user info = {
    pageKey = friend;
}} **with an alert but haven't received permission from the user to display alerts**

也就是在iOS8上要發(fā)送本地通知需要 **請求用戶權(quán)限**
如何請求用戶權(quán)限呢?一般在新版有變化的地方,在頭文件中都會(huì)有相應(yīng)的說明,所以點(diǎn)擊到scheduleLocalNotification:方法中,看看有沒有我們需要信息
![4D110E8B-9D15-4460-B093-6970621F3229.png](http://upload-images.jianshu.io/upload_images/1253942-62c168e5061a56c9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
點(diǎn)擊進(jìn)去,我們看到
![B3F79CF3-8DCE-4E4D-8F0A-3BD39EF08AF1.png](http://upload-images.jianshu.io/upload_images/1253942-6174fc97ba719369.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
意思就是說:在iOS8.0以后,在調(diào)度通知之前你需要使用UIApplication的對象方法registerUseNotificationSetting:來請求用戶授權(quán).

這種請求權(quán)限的代碼一般放在didFinishLaunchingWithOptions:方法中,在用戶不卸載的情況下,只需要請求一次,下次在運(yùn)行就不用請求了!

// 1.如果是iOS8請求用戶權(quán)限
if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {

    /*
     UIUserNotificationType:

     UIUserNotificationTypeBadge   = 1 << 0, // 接收到通知可更改程序的應(yīng)用圖標(biāo)
     UIUserNotificationTypeSound   = 1 << 1, // 接收到通知可播放聲音
     UIUserNotificationTypeAlert   = 1 << 2, // 接收到通知課提示內(nèi)容
     如果你需要使用多個(gè)類型,可以使用 "|" 來連接
     */

// 向用戶請求通知權(quán)限
// categories暫時(shí)傳入nil
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];

    [application registerUserNotificationSettings:setting];
}
運(yùn)行程序

![21E244DC-087A-4679-9D62-BFDEC648672C.png](http://upload-images.jianshu.io/upload_images/1253942-ee6ddc53a049ddb5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
測試點(diǎn)擊通知,進(jìn)入應(yīng)用,也沒問題

--------
接下來,我們說說-[UIUserNotificationSettings settingsForTypes:categories:] 中的 **categories**

* categories可以讓我們發(fā)送通知之前預(yù)定義一些通知也就是通知上可以顯示按鈕,他需要是一個(gè)裝有UIUserNotificationCategory類的對象的NSSet的對象.
但是官方推薦我們使用它的子類UIMutableUserNotificationCategory,來動(dòng)態(tài)的添加通知的行為按鈕,iOS8支持前臺(tái)和后臺(tái)的兩種行為.
* 通知Action按鈕以長條展示如圖
![notifcation_action_button.gif](http://upload-images.jianshu.io/upload_images/1253942-22b7dbce7618a358.gif?imageMogr2/auto-orient/strip)
* 通知Action按鈕以AlertView展示如圖
![notification_action_allertview.gif](http://upload-images.jianshu.io/upload_images/1253942-4a6cf2c9fda8767c.gif?imageMogr2/auto-orient/strip)

1. 注冊分類,并在分類中添加不同的行為
由于注冊用戶通知設(shè)置代碼量比較大我們實(shí)現(xiàn)一個(gè)新的方法registerUserNotification

  • (void) registerUserNotification
    {
    // 向用戶請求通知權(quán)限
    /*
    UIUserNotificationType:用戶通知的類型

    UIUserNotificationTypeBadge = 1 << 0, // 接收到通知可更改程序的應(yīng)用圖標(biāo)
    UIUserNotificationTypeSound = 1 << 1, // 接收到通知可播放聲音
    UIUserNotificationTypeAlert = 1 << 2, // 接收到通知課提示內(nèi)容
    如果你需要使用多個(gè)類型,可以使用 "|" 來連接
    */
    // 1.設(shè)置用戶通知權(quán)限類型
    UIUserNotificationType types = UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert;

// 2.創(chuàng)建通知的行為按鈕

// 2.1創(chuàng)建第一個(gè)行為
UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
// 2.1.1 設(shè)置行為的唯一標(biāo)示
action1.identifier = UIMutableUserNotificationActionBackground;
// 2.1.2 設(shè)置通知按鈕的的標(biāo)題
action1.title = @"后臺(tái)";
// 以什么樣模式運(yùn)行應(yīng)用
// UIUserNotificationActivationModeForeground, // 當(dāng)應(yīng)用在前臺(tái)的時(shí)候觸發(fā)
// UIUserNotificationActivationModeBackground // 即使應(yīng)用不在前臺(tái)也觸發(fā)
action1.activationMode = UIUserNotificationActivationModeBackground;
// 2.1.3 是否只有鎖屏的鎖屏狀態(tài)下才能顯示
action1.authenticationRequired = NO;
// 2.1.4 按鈕的性質(zhì)
action1.destructive = NO;

// 2.1創(chuàng)建第一個(gè)行為
UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
// 2.1.1 設(shè)置行為的唯一標(biāo)示
action2.identifier =UIMutableUserNotificationActionForeground;
// 2.1.2 設(shè)置通知按鈕的的標(biāo)題
action2.title = @"前臺(tái)";
// 以什么樣模式運(yùn)行應(yīng)用
// UIUserNotificationActivationModeForeground, // 當(dāng)應(yīng)用在前臺(tái)的時(shí)候觸發(fā)
// UIUserNotificationActivationModeBackground // 即使應(yīng)用不在前臺(tái)也觸發(fā)
action2.activationMode = UIUserNotificationActivationModeForeground;
// 2.1.3 用戶必須輸入密碼才能執(zhí)行
action2.authenticationRequired = YES;
// 2.1.4 按鈕的性質(zhì)(沒有效果)
action2.destructive = YES;

// 3.創(chuàng)建用戶通知分類
UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
// 3.1 設(shè)置類別的唯一標(biāo)識
category.identifier = @"myCategory";
// 3.2 設(shè)置通知的按鈕
// Context:
// UIUserNotificationActionContextDefault, //默認(rèn)上下文(情景)下的英文(通常都是)
// UIUserNotificationActionContextMinimal //通知內(nèi)容區(qū)域受限情況下內(nèi)容
[category setActions:@[action1,action2] forContext:UIUserNotificationActionContextDefault];

// 4.創(chuàng)建用戶通知的設(shè)置信息
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:types categories:[NSSet setWithObject:category]];

// 注冊設(shè)置
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
}


* 在發(fā)送本地推送通知時(shí)候指定通知的分類標(biāo)示

// 9.設(shè)置通知的類別
ln.category = @"myCategory";


* 監(jiān)聽點(diǎn)擊通知按鈕的行為,在AppDelegate中實(shí)現(xiàn)監(jiān)聽通知按鈕點(diǎn)擊方法

/**

  • 當(dāng)用戶點(diǎn)擊通知上定制的按鈕執(zhí)行的行為(注意:不點(diǎn)擊行為按鈕,不會(huì)進(jìn)入該方法)
  • @param application 應(yīng)用
  • @param identifier 行為標(biāo)識符
  • @param notification 本地通知
  • @param completionHandler 完成回調(diào)
    */
  • (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString )identifier forLocalNotification:(UILocalNotification )notification completionHandler:(void (^)())completionHandler
    {
    // 處理不同行為
    if ([identifier isEqualToString:UIMutableUserNotificationActionBackground]) {
    NSLog(@"后臺(tái)運(yùn)行程序");
    }else if ([identifier isEqualToString:UIMutableUserNotificationActionForeground]){
    NSLog(@"前臺(tái)運(yùn)行程序");
    }else{
    NSLog(@"其他");
    }
    /

    You should call the completion handler as soon as you've finished handling the action.
    當(dāng)任務(wù)處理完畢時(shí)候,你應(yīng)該盡快的調(diào)用completion的block.
    */

// 在當(dāng)任務(wù)完成的時(shí)候,調(diào)用任務(wù)完成的block
completionHandler();
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庆寺,一起剝皮案震驚了整個(gè)濱河市误算,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖钮科,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拖叙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赂乐,“玉大人薯鳍,你說我怎么就攤上這事“ご耄” “怎么了挖滤?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浅役。 經(jīng)常有香客問我壶辜,道長,這世上最難降的妖魔是什么担租? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮抵怎,結(jié)果婚禮上奋救,老公的妹妹穿的比我還像新娘。我一直安慰自己反惕,他們只是感情好尝艘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姿染,像睡著了一般背亥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悬赏,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天狡汉,我揣著相機(jī)與錄音,去河邊找鬼闽颇。 笑死盾戴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兵多。 我是一名探鬼主播尖啡,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼橄仆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衅斩?” 一聲冷哼從身側(cè)響起盆顾,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畏梆,沒想到半個(gè)月后您宪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡具温,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年蚕涤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铣猩。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揖铜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出达皿,到底是詐尸還是另有隱情天吓,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布峦椰,位于F島的核電站龄寞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏汤功。R本人自食惡果不足惜物邑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滔金。 院中可真熱鬧色解,春花似錦、人聲如沸餐茵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忿族。三九已至锣笨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間道批,已是汗流浹背错英。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屹徘,地道東北人走趋。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親簿煌。 傳聞我的和親對象是個(gè)殘疾皇子氮唯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

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

  • 應(yīng)用程序必須進(jìn)行適當(dāng)配置,才可以接受本地或遠(yuǎn)程通知姨伟。配置過程在iOS和OS X略有不同惩琉,但基本原理是相同的。在啟動(dòng)...
    shenzhenboy閱讀 1,380評論 1 2
  • 這兩天在做一個(gè)日程提醒功能夺荒,用UILocalNotification做日程的提醒功能瞒渠,相關(guān)知識如下: 一、本地通知...
    七維樹閱讀 1,156評論 1 1
  • 極光推送: 1.JPush當(dāng)前版本是1.8.2技扼,其SDK的開發(fā)除了正常的功能完善和擴(kuò)展外也緊隨蘋果官方的步伐伍玖,SD...
    Isspace閱讀 6,701評論 10 16
  • 項(xiàng)目中用到了本地通知功能,便到網(wǎng)上搜羅了一翻剿吻,各式各樣的說法窍箍,經(jīng)過自己的驗(yàn)證,整理如下 首先要說明的是IOS最多允...
    CrazySteven閱讀 640評論 3 2
  • 躁動(dòng)的夏日仿佛一夜之間來到了大地上丽旅,即使隔三差五的還來點(diǎn)小寒流椰棘,但不容置疑,它真的來了榄笙。剛剛結(jié)束或者說放棄了一段本...
    季鴻宇閱讀 206評論 0 0