天天看點

iOS本地通知或者本地推送的使用

遠端推送基本都沒啥問題,按規範來走,證書做好給伺服器,本地加載上證書基本都是可以實作的。

本地通知就需要自己建立通知,發送通知,比遠端多了這兩步,一般的會有幾個需要注意的地方:

1,iOS8-iOS10是一套發通知方法,10以後是一套方法;

2,通知可能不顯示,可能會覆寫,隻顯示一個;

3,iOS10以前,APP在前台時收到通知不下拉自動顯示(搞了很久,有實作的留言探讨下);

4,APP在前台,下拉檢視通知清單時,如果此時有通知發出,程式會調用在背景打開通知的方法。如果代碼裡顯示通知内容是進行頁面跳轉,這個時候就實作了頁面跳轉,接收幾個通知,就顯示幾個頁面;

使用通知先注冊通知:在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

方法中注冊以下代碼:

if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {

        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];

        [application registerUserNotificationSettings:settings];

    }

先看iOS10以後發送本地通知,代碼如下:

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

    center.delegate = self;

    UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];

    content.title = @"title";

    content.body = @"body";

    content.sound = [UNNotificationSound defaultSound];

    content.userInfo =

@{@"userInfo":data,@"type" : [NSString stringWithFormat:@"%ld",(long)type]};

    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier: [[NSUUID UUID] UUIDString] content:content trigger:nil];

    [center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {

        NSLog(@"成功添加推送");

    }];

注意設定代理,注意設定唯一identifier,如果不設定,會覆寫,隻顯示一個通知。下面實作代理,在發送通知的頁面實作以下代理方法:

//iOS10新增:處理前台收到通知的代理方法

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{

    NSDictionary * userInfo = notification.request.content.userInfo;

    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {//應用處于前台時的遠端推送接受

    } else {//應用處于前台時的本地推送接受

        completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge);//

    }

}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler{

    if (@available(iOS 10.0, *)) {

        UNNotificationContent *content = response.notification.request.content;

        // 如果在上面的通知方法中設定了一些,可以在這裡列印額外資訊的内容,就做到監聽,也就可以根據額外資訊,做出相應的判斷

        NSData *data = [content.userInfo objectForKey:@"userInfo"];

        NSString *type = [content.userInfo objectForKey:@"type"];

        NSUInteger c = [type integerValue];        

        AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;

        [app processNotificationData:c data:data];

    } else {

        // Fallback on earlier versions

    }

}

第一個方法是顯示通知用的,第二個是接收通知用的。可以在第二個方法進行頁面操作。

再來看iOS10以前,發通知代碼:

// 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 = @"launch.png";

    // 2.6.設定alertTitle

    localNote.alertTitle = @"title";

     // 2.7.設定有通知時的音效

    localNote.soundName = @"buyao.wav";

    // 2.8.設定應用程式圖示右上角的數字

    NSInteger i = [UIApplication sharedApplication].applicationIconBadgeNumber;

    localNote.applicationIconBadgeNumber = i +1;

    // 2.9.設定額外資訊

    localNote.userInfo = @{@"userInfo":data,@"type" : [NSString stringWithFormat:@"%ld",(long)type]};

    // 3.調用通知

    [[UIApplication sharedApplication] presentLocalNotificationNow:localNote];

再來看接收通知的方法,在APPdelegate實作:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

{

    // 必須要監聽--應用程式在背景的時候進行的跳轉

    if (application.applicationState == UIApplicationStateInactive) {

        NSLog(@"UIApplicationStateInactive");

        // 如果在上面的通知方法中設定了一些,可以在這裡列印額外資訊的内容,就做到監聽,也就可以根據額外資訊,做出相應的判斷

        NSData *data = [notification.userInfo objectForKey:@"userInfo"];

        NSString *type = [notification.userInfo objectForKey:@"type"];

        NSUInteger c = [type integerValue];

        [self processNotificationData:c data:data];

    }else if (application.applicationState == UIApplicationStateActive){

        NSLog(@"UIApplicationStateActive");

    }else{

        NSLog(@"UIApplicationStateBackground");

    }

}

注意,如果在didReceiveLocalNotification實作了,

application.applicationIconBadgeNumber = 0;

那通知也不會實作.

Good luck!

如果能對您有幫助,請幫忙點贊!