1. 程式人生 > >iOS本地通知或者本地推送的使用

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" : [NSStringstringWithFormat:@"%ld",(long)type]};

    // 3.呼叫通知

    [[UIApplication sharedApplicationpresentLocalNotificationNow: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!

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