iOS8-推送(本地和遠程)的簡單使用

參考文章:
本地推送:一、iOS推送之本地推送(iOS Notification Of Local Notification)
二、iOS中使用本地通知為你的APP添加提示用戶功能
遠程推送:一、iOS推送之遠程推送(iOS Notification Of Remote Notification)
二、iOS本地推送與遠程推送詳解
注:此文現(xiàn)在已經(jīng)不能適配iOS10了,iOS10的推送采用了新的方法,做iOS9及以下的系統(tǒng)可讀此篇文章。
iOS10的推送方法可以查看:iOS10-推送(本地和遠程)的簡單使用

tips:1.如果想要將通知欄上方的通知清除,只要將APP的角標置為0就可以了。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

IOS中消息的推送有兩種方式,分別是本地推送和遠程推送(APNS)。

一、本地推送

本地推送介紹

本地推送和遠程推送的功能是一樣的,都是要提醒用戶去做某些事情。但是和遠程推送不同的就是本地推送是不需要設(shè)備聯(lián)網(wǎng)的,而遠程推送是必需要設(shè)備聯(lián)網(wǎng)的,因為只有聯(lián)網(wǎng)狀態(tài)下,才能和蘋果的APNs服務(wù)器建立長連接,從而推送消息。本地推送是由App自己設(shè)定的,并且發(fā)送給安裝此App的這臺設(shè)備,屬于一對一的對應(yīng)關(guān)系。

首先,我們先要明白一個概念,這里的本地推送是UILocalNotification類,和系統(tǒng)的NSNotificationCenter通知中心是完全不同的概念。

本地推送,實際上是由IOS系統(tǒng)管理的一個功能,比如某些后臺應(yīng)用做了某項活動需要我們處理、已經(jīng)退出的應(yīng)用在某個時間提醒我們喚起等等,如果注冊了通知,系統(tǒng)都會在通知觸發(fā)時給我們發(fā)送消息。由此,我們可以通過系統(tǒng)給我們的APP添加通知用戶的功能,并且應(yīng)用非常廣泛。例如,鬧種類應(yīng)用,有按時簽到相似功能的應(yīng)用。

注意:一個App最多只能設(shè)置64個本地推送,當超過此限制的時候,系統(tǒng)會自動忽略多余的本地推送,而保留能最快觸發(fā)的64個。循環(huán)的本地推送會被系統(tǒng)認為是同一個本地推送。

創(chuàng)建本地推送,需要用到UILocalNotification類
先來看它的幾個屬性:

@property(nonatomic,copy) NSDate *fireDate; 設(shè)置系統(tǒng)發(fā)送通知的時間(如果是過去的時間或者0,則會立刻發(fā)起通知)
@property(nonatomic,copy) NSTimeZone *timeZone;// 設(shè)置時間的時區(qū)
@property(nonatomic) NSCalendarUnit repeatInterval;// 設(shè)置周期性通知
NSCalendarUnit對象是枚舉,設(shè)定通知的周期
typedef NS_OPTIONS(NSUInteger, NSCalendarUnit) {
        NSCalendarUnitEra                = kCFCalendarUnitEra,
        NSCalendarUnitYear               = kCFCalendarUnitYear,
        NSCalendarUnitMonth              = kCFCalendarUnitMonth,
        NSCalendarUnitDay                = kCFCalendarUnitDay,
        NSCalendarUnitHour               = kCFCalendarUnitHour,
        NSCalendarUnitMinute             = kCFCalendarUnitMinute,
        NSCalendarUnitSecond             = kCFCalendarUnitSecond,
        NSCalendarUnitWeekday            = kCFCalendarUnitWeekday,
        NSCalendarUnitWeekdayOrdinal     = kCFCalendarUnitWeekdayOrdinal,
        }
@property(nonatomic,copy) NSCalendar *repeatCalendar;// 設(shè)置周期性通知參照的日歷表,NSCalendar的使用方法請自行查找
@property(nonatomic,copy) CLRegion *region;// 在用戶進去或者離開某一區(qū)域時發(fā)送通知
@property(nonatomic,assign) BOOL regionTriggersOnce; 設(shè)置區(qū)域檢測通知是否重復(fù)(如果為YES,則沒次進入該區(qū)域都會發(fā)送,否則只發(fā)送一次)
@property(nonatomic,copy) NSString *alertBody;  // 設(shè)置通知的主體內(nèi)容
@property(nonatomic) BOOL hasAction; //是否隱藏滑動啟動按鈕
@property(nonatomic,copy) NSString *alertAction;// 設(shè)置滑動打開的提示文字
@property(nonatomic,copy) NSString *alertLaunchImage; // 設(shè)置點擊通知后啟動的啟動圖片
@property(nonatomic,copy) NSString *alertTitle;//通知的短標題
@property(nonatomic,copy) NSString *soundName; // 收到通知時,播放的系統(tǒng)音
@property(nonatomic) NSInteger applicationIconBadgeNumber; //設(shè)置應(yīng)用程序Icon頭標數(shù)字
@property(nonatomic,copy) NSDictionary *userInfo; // 用戶字典,可用于傳遞通知消息參數(shù)
NSString *const UILocalNotificationDefaultSoundName; // 推送提示音,注意:這個字符串是系統(tǒng)默認的提示音

創(chuàng)建一個本地推送通知

// 在需要添加本地通知的地方進行添加處理
 // 1.創(chuàng)建一個本地通知
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 1.1.設(shè)置通知發(fā)出的時間
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:100];
//設(shè)置重復(fù)間隔
localNote.repeatInterval = NSCalendarUnitMinute;
// 1.2.設(shè)置通知內(nèi)容
localNote.alertBody = @"這是一個推送這是一個推送";
 // 1.3.設(shè)置鎖屏時,字體下方顯示的一個文字
 //    localNote.alertAction = @"趕緊!!!!!";
 // 1.4.設(shè)置啟動圖片(通過通知打開的)
localNote.alertLaunchImage = @"144";
// 1.5.設(shè)置通過到來的聲音
localNote.soundName = UILocalNotificationDefaultSoundName;
// 1.6.設(shè)置應(yīng)用圖標左上角顯示的數(shù)字
localNote.applicationIconBadgeNumber = 999;
// 1.7.設(shè)置一些額外的信息
localNote.userInfo = @{@"qq" : @"1234567", @"msg" : @"success"};
//  2 設(shè)置好本地推送后必須調(diào)用此方法啟動此推送
    [[UIApplication sharedApplication] scheduleLocalNotification:localNote];

現(xiàn)在,一個簡單的本地推送已經(jīng)創(chuàng)建好了,如果需要在推送執(zhí)行完畢后,取消推送,可以使用下面的方法

    // 1、取消某一個通知
    NSArray *notificaitons = [[UIApplication sharedApplication] scheduledLocalNotifications];
    //獲取當前所有的本地通知
    if (!notificaitons || notificaitons.count <= 0) {
        return;
    }
    for (UILocalNotification *notify in notificaitons) {
        if ([[notify.userInfo objectForKey:@"id"] isEqualToString:@"想要取消的推送的標識符"]) {
            //取消一個特定的通知
            [[UIApplication sharedApplication] cancelLocalNotification:notify];
            break;
        }
    }
    
    // 2、取消所有的本地通知
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

本地推送的注冊與處理

分為本地推送和遠程推送2種。可以在應(yīng)用沒有打開甚至手機鎖屏情況下給用戶以提示。它們都需要注冊,注冊后系統(tǒng)會彈出提示框(如下圖)提示用戶是否同意,如果同意則正常使用;如果用戶不同意則下次打開程序也不會彈出該提示框,需要用戶到設(shè)置里面設(shè)置。一共有三種提示類型:
UIUserNotificationTypeBadge:應(yīng)用圖標右上角的信息提示
UIUserNotificationTypeSound:播放提示音
UIUserNotificationTypeAlert:提示框
APP安裝后,第一次打開時,會彈出提示框詢問用戶是否允許推送,用戶選擇之后,以后都不會再進行提示,除非用戶卸載重裝:

示例圖.png

想要正常進行推送,就必須要進行注冊:

/// 一般在程序啟動時注冊通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if (10.0>[[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // iOS8
    // categories 可以設(shè)置不同類別的推送,在收到推送的代理方法中根據(jù)categories的identifier進行不同的推送處理
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil]; 
        [application registerUserNotificationSettings:setting];
    }

// 如果用戶對程序進行滑飛操作,程序進程被殺死后,重新啟動APP,推送的代理方法是不走的,這個時候就可以添加下面的代碼,獲取到推送,進行對應(yīng)的操作。
    NSDictionary *userInfoLocal = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
    if (userInfoLocal) {
        // 這里添加處理代碼
        NSLog(@"=== Local:%@", userInfoLocal);
    }
    return YES;
}

接下來就需要對收到的推送信息進行處理了

/** 獲取用戶對通知的設(shè)置信息 */ //NS_AVAILABLE_IOS(8_0);
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings  {
}
// 程序處于前臺(或者程序處于后臺,但是用戶點擊了收到的通知信息),就會運行該方法  //NS_AVAILABLE_IOS(4_0, 10_0);
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    /* notification === <UIConcreteLocalNotification: 0x127579610>{fire date = 2016年12月19日 星期一 中國標準時間 上午11:31:27, time zone = (null), repeat interval = NSCalendarUnitMinute, repeat count = UILocalNotificationInfiniteRepeatCount, next fire date = 2016年12月19日 星期一 中國標準時間 上午11:32:27, user info = {
     msg = success;
     qq = 1234567;
     }}*/
    // 這里添加處理代碼
}

如果在上面注冊通知的時候,攜帶了 categories 參數(shù),則會調(diào)用下面的方法。

//NS_AVAILABLE_IOS(8_0, 10_0);
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void(^)())completionHandler {
    // identifier是識別符,
    //處理完消息,最后一定要調(diào)用這個代碼塊
    completionHandler();
}
// 下面這個方法是 9.0新加的,如果要是適配8.0,只需要用上面的方法就可以了,參數(shù) responseInfo 可以通過 notification.userInfo 取到。
//NS_AVAILABLE_IOS(9_0, 10_0);
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler {
}

以上就是關(guān)于 iOS8.0-10.0 的本地推送的使用了。
注:上面提到的有關(guān) categories 參數(shù)的使用,我沒有進行測試,如果使用時有問題,歡迎給我留言。

二、遠程推送

想要使用遠程推送,需要先在開發(fā)者網(wǎng)站申請推送證書

遠程推送原理

注:(從作者TIME_for的文章復(fù)制過來的)
學習一些東西前我認為最好能了解它的原理,這樣以后我們遇到問題的時候,就可以很快速的找到錯誤之所在,如果對原理不感興趣的同學可直接下翻到應(yīng)用部分。

iOS app大多數(shù)都是基于client/server模式開發(fā)的,client就是安裝在我們設(shè)備上的app,server就是遠程服務(wù)器,主要給我們的app提供數(shù)據(jù),因為也被稱為Provider。那么問題來了,當App處于Terminate狀態(tài)的時候,當client與server斷開的時候,client如何與server進行通信呢?是的,這時候Remote Notifications很好的解決了這個困境。蘋果所提供的一套服務(wù)稱之為Apple Push Notification service,就是我們所謂的APNs。

推送消息傳輸路徑: Provider-APNs-Client App
我們的設(shè)備聯(lián)網(wǎng)時(無論是蜂窩聯(lián)網(wǎng)還是Wi-Fi聯(lián)網(wǎng))都會與蘋果的APNs服務(wù)器建立一個長連接(persistent IP connection),當Provider推送一條通知的時候,這條通知并不是直接推送給了我們的設(shè)備,而是先推送到蘋果的APNs服務(wù)器上面,而蘋果的APNs服務(wù)器再通過與設(shè)備建立的長連接進而把通知推送到我們的設(shè)備上(參考圖1-1,圖1-2)。而當設(shè)備處于非聯(lián)網(wǎng)狀態(tài)的時候,APNs服務(wù)器會保留Provider所推送的最后一條通知,當設(shè)備轉(zhuǎn)換為連網(wǎng)狀態(tài)時,APNs則把其保留的最后一條通知推送給我們的設(shè)備;如果設(shè)備長時間處于非聯(lián)網(wǎng)狀態(tài)下,那么APNs服務(wù)器為其保存的最后一條通知也會丟失。Remote Notification必須要求設(shè)備連網(wǎng)狀態(tài)下才能收到,并且太頻繁的接收遠程推送通知對設(shè)備的電池壽命是有一定的影響的。

remotePush

deviceToken的生成
當一個App注冊接收遠程通知時,系統(tǒng)會發(fā)送請求到APNs服務(wù)器,APNs服務(wù)器收到此請求會根據(jù)請求所帶的key值生成一個獨一無二的value值也就是所謂的deviceToken,而后APNs服務(wù)器會把此deviceToken包裝成一個NSData對象發(fā)送到對應(yīng)請求的App上。然后App把此deviceToken發(fā)送給我們自己的服務(wù)器,就是所謂的Provider。Provider收到deviceToken以后進行儲存等相關(guān)處理,以后Provider給我們的設(shè)備推送通知的時候,必須包含此deviceToken。

這個時候你可能會問deviceToken到底是什么?有什么用?為什么是獨一無二的?
是什么:deviceToken其實就是根據(jù)注冊遠程通知的時候向APNs服務(wù)器發(fā)送的Token key,Token key中包含了設(shè)備的UDID和App的Bundle Identifier,然后蘋果APNs服務(wù)器根據(jù)此Token key編碼生成一個deviceToken。deviceToken可以簡單理解為就是包含了設(shè)備信息和應(yīng)用信息的一串編碼。
有什么用:上面提到Provider推送消息的時候必須帶有此deviceToken,然后此消息就根據(jù)deviceToken(UDID + App's Bundle Identifier)找到對應(yīng)的設(shè)備以及該設(shè)備上對應(yīng)的應(yīng)用,從而把此推送消息推送給此應(yīng)用。
唯一性:蘋果APNs的編碼技術(shù)和deviceToken的獨特作用保證了他的唯一性。每臺設(shè)備的 deviceToken都是不一樣的。
注:deviceToken也是會變的,將用戶將程序卸載重裝或者用戶升級系統(tǒng)的時候deviceToken是會變化的。 ”If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes“,因此應(yīng)每次都發(fā)給服務(wù)器(provider)

遠程推送的注冊與處理

遠程推送的注冊
遠程推送的注冊與本地推送相比,只需要加一行代碼就可以了。

/// 一般在程序啟動時注冊通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if (10.0>[[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // iOS8
    // categories 可以設(shè)置不同類別的推送,在收到推送的代理方法中根據(jù)categories的identifier進行不同的推送處理
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil]; 
        [application registerUserNotificationSettings:setting];
    }
/**注冊遠程通知要添加的代碼,該代碼可以寫在這里,也可以寫在獲取用戶設(shè)置推送信息的回調(diào)方法里,didRegisterUserNotificationSettings*/
[[UIApplication sharedApplication] registerForRemoteNotifications];

/*
//  iOS7及其之后,無論是程序被殺死還是處于后臺,只要用戶點擊了通知,都會調(diào)用“- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler ”方法,因此如果是iOS7及以上系統(tǒng),則不必在didFinishLaunchingWithOptions中做處理,只在該方法中做處理即可,此時應(yīng)避免在didFinishLaunchingWithOptions函數(shù)中也做重復(fù)處理。
    NSDictionary *userInfoLocal = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfoLocal) {
        // 這里添加處理代碼
        NSLog(@"=== Local:%@", userInfoLocal);
    }
*/
    return YES;
}

遠程推送的代理方法

/** 獲取用戶對通知的設(shè)置信息 */ //NS_AVAILABLE_IOS(8_0);
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings  {
}
/** 遠程通知注冊成功委托 */ //NS_AVAILABLE_IOS(3_0);
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken  {
    // 對 deviceToken 進行處理
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    // 需要把 deviceToken 上傳給服務(wù)器
    /**上傳deviceToken的代碼*/
}
/** 遠程通知注冊失敗委托 */ //NS_AVAILABLE_IOS(3_0);
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error  {
  NSLog(@"%@",error);
}

收到遠程推送的回調(diào)方法

// 收到遠程推送時,程序在前臺,或者程序在后臺但是點擊了收到的推送通知打開程序 //NS_AVAILABLE_IOS(7_0);
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{
    // 在此方法中一定要調(diào)用completionHandler這個回調(diào),告訴系統(tǒng)是否處理成功
    // UIBackgroundFetchResultNewData,  成功接收到數(shù)據(jù)
    // UIBackgroundFetchResultNoData,   沒有接收到數(shù)據(jù)
    // UIBackgroundFetchResultFailed    接受失敗
    if (userInfo) {
        completionHandler(UIBackgroundFetchResultNewData);
    } else {
        completionHandler(UIBackgroundFetchResultNoData);
    }
}
//NS_AVAILABLE_IOS(3_0, 10_0); // 如果是iOS8.0以上的系統(tǒng),不會運行該方法,只會運行上面的方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo  {
}

如果在上面注冊通知的時候,攜帶了 categories 參數(shù),則會調(diào)用下面的方法。

//NS_AVAILABLE_IOS(8_0, 10_0);
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler {
    //處理完消息,最后一定要調(diào)用這個代碼塊
    completionHandler();
}
// 下面這個方法是 9.0新加的,如果要是適配8.0,只需要用上面的方法就可以了,參數(shù) responseInfo 可以通過 notification.userInfo 取到。
//NS_AVAILABLE_IOS(9_0, 10_0);
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler {
}

設(shè)置程序后臺運行
設(shè)置后臺運行后,收到遠程推送后會調(diào)用方法:
application: didReceiveRemoteNotification: fetchCompletionHandler:
iOS7之前蘋果是不支持多任務(wù)的,這也是iOS系統(tǒng)對硬件要求低,流暢性好的原因之一。iOS7之后,蘋果開始支持多任務(wù),即App可在后臺做一些更新UI、下載數(shù)據(jù)的操作等。若要接收到遠程推送的時候要在后臺做一些事情則需要把后臺遠程推送模式打開。不適配iOS7之前系統(tǒng)的項目建議使用此后臺模式,充分利用蘋果推出的多任務(wù)模式,不枉費蘋果的一片苦心?。≡O(shè)置后臺模式方法項目對應(yīng)TARGETS-Capabilities-Background Modes-Remote Notifications具體設(shè)置方法如下圖。

示例圖

遠程推送負載

遠程推送負載大小
遠程通知負載的大小根據(jù)Provider使用的API不同而不同。當使用HTTP/2 provider API時,負載最大為4096bytes,即4kB;當使用legacy binary interface時,負載最大為2048bytes,即2kB。當負載大小超過規(guī)定的負載大小時,APNs會拒絕發(fā)送此消息。

遠程推送負載內(nèi)容格式
一般公司服務(wù)端會要我們客戶端定義好格式給他們。
每一條通知的消息都會組成一個JSON字典對象,其格式如下所示,示例中的key值為蘋果官方所用key。自定義字段的時候要避開這些key值。

{ "aps" : {
           "alert" : { // string or dictionary 
                    "title" : "string" 
                    "body" : "string", 
                    "title-loc-key" : "string or null" 
                    "title-loc-args" : "array of strings or null" 
                    "action-loc-key" : "string or null" 
                    "loc-key" : "string" 
                    "loc-args" : "array of strings" 
                    "launch-image" : "string" 
           }, 
           "badge" : number, 
           "sound" : "string" 
           "content-available" : number; 
           "category" : "string"
   },
}
aps:推送消息必須有的keyalert:推送消息包含此key值,系統(tǒng)就會根據(jù)用戶的設(shè)置展示標準的推送信息
badge:在app圖標上顯示消息數(shù)量,缺少此key值,消息數(shù)量就不會改變,消除標記時把此key對應(yīng)的value設(shè)置為0
sound:設(shè)置推送聲音的key值,系統(tǒng)默認提示聲音對應(yīng)的value值為default
content-available:此key值設(shè)置為1,系統(tǒng)接收到推送消息時就會調(diào)用不同的回調(diào)方法,iOS7之后配置后臺模式
category:UIMutableUserNotificationCategory's identifier 可操作通知類型的key值
title:簡短描述此調(diào)推送消息的目的,適用系統(tǒng)iOS8.2之后版本body:推送的內(nèi)容
title-loc-key:功能類似title,附加功能是國際化,適用系統(tǒng)iOS8.2之后版本
title-loc-args:配合title-loc-key字段使用,適用系統(tǒng)iOS8.2之后版本
action-loc-key:可操作通知類型key值,不詳細敘述
loc-key:參考title-loc-key
loc-args:參考title-loc-args
launch-image:點擊推送消息或者移動事件滑塊時,顯示的圖片。如果缺少此key值,會加載app默認的啟動圖片。

當然以上key值并不是每條推送消息都必帶的key值,應(yīng)當根據(jù)需求來選擇所需要的key值,除了以上系統(tǒng)所提供的key值外,你還可以自定義自己的key值,來作為消息推送的負載,自定義key值與aps此key值并列。如下格式:

{ "aps" : { 
           "alert" : "Provider push messag.", 
           "badge" : 9, 
           "sound" : "toAlice.aiff" 
           }, 
  "Id" : 1314, // 自定義key值 
  "type" : "customType" // 自定義key值
}

推送函數(shù)的調(diào)用:

首次安裝后啟動:
didRegisterForRemoteNotificationsWithDeviceToken 被調(diào)用
系統(tǒng)詢問用戶是否同意接收 Notifications
不管用戶選擇同意或拒絕,didRegisterUserNotificationSettings 被調(diào)用

應(yīng)用非首次啟動時:
如果 notifications 處于拒絕狀態(tài):didRegisterUserNotificationSettings 被調(diào)用
如果 notifications 處于允許狀態(tài)
didRegisterForRemoteNotificationsWithDeviceToken 被調(diào)用
didRegisterUserNotificationSettings 被調(diào)用

應(yīng)用運行過程中用戶修改 notifications 設(shè)置:
從拒絕變?yōu)樵试S:**didRegisterForRemoteNotificationsWithDeviceToken **被調(diào)用
從允許變?yōu)榫芙^:什么也不發(fā)生。

微信的推送簡略圖

示例圖.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容