iOS 10 推送高階篇(必看)_IOS

來源:互聯網
上載者:User

推薦閱讀:

iOS10推送之基礎知識(必看篇)

這篇文章開始,我會跟大家好好講講,蘋果新發布的iOS10的所有通知類。

一、建立本地通知案例詳解:

注意啊,小夥伴們,本地通知也必須在appdelegate中註冊中心,通知的開關打不開啟無所謂的,畢竟是本地通知,但是通知的接收的代理,以及通知點擊的代理,蘋果給合二為一了。所以大家還是需要在appdelegate中寫上這2個方法,還有不要忘記在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions註冊通知中樞。如果使用極光推送的小夥伴,寫看一下我的基礎篇,辛苦大家啦

建立一個UNNotificationRequest類的執行個體,一定要為它設定identifier, 在後面的尋找,更新, 刪除通知,這個標識是可以用來區分這個通知與其他通知

把request加到UNUserNotificationCenter, 並設定觸發器,等待觸發
如果另一個request具有和之前request相同的標識,不同的內容, 可以達到更新通知的目的

建立一個本地通知我們應該先建立一個UNNotificationRequest類,並且將這個類添加到UNUserNotificationCenter才可以。代碼如下:

// 1.建立一個UNNotificationRequestNSString *requestIdentifer = @"TestRequest";UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger];// 2.將UNNotificationRequest類,添加進當前通知中樞中[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {}];

在建立UNNotificationRequest類時,官方的解釋是說,一個通知請求可以在預定通過時間和位置,來通知使用者。觸發的方式見UNNotificationTrigger的相關說明。調用該方法,在通知觸發的時候。會取代具有相同標識符的通知請求,此外,訊息個數受系統限制。

上面的翻譯,看上去可能有些拗口,簡單來說,就是我們需要為UNNotificationRequest設定一個標識符,通過標識符,我們可以對該通知進行添加,刪除,更新等操作。

以下是完整的建立通知的代碼:

// 1.建立通知內容UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];content.title = @"徐不同測試通知";content.subtitle = @"測試通知";content.body = @"來自徐不同的簡書";content.badge = @1;NSError *error = nil;NSString *path = [[NSBundle mainBundle] pathForResource:@"icon_certification_status1@2x" ofType:@"png"];// 2.設定通知附件內容UNNotificationAttachment *att = [UNNotificationAttachment attachmentWithIdentifier:@"att1" URL:[NSURL fileURLWithPath:path] options:nil error:&error];if (error) {NSLog(@"attachment error %@", error);}content.attachments = @[att];content.launchImageName = @"icon_certification_status1@2x";// 2.設定聲音UNNotificationSound *sound = [UNNotificationSound defaultSound];content.sound = sound;// 3.觸發模式UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];// 4.設定UNNotificationRequestNSString *requestIdentifer = @"TestRequest";UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger1];//5.把通知加到UNUserNotificationCenter, 到指定觸發點會被觸發[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {}];

通過以上代碼,我們就可以建立一個5秒觸發本地通知,具體樣式可以看下圖

下拉放大content.launchImageName = @”icon_certification_status1@2x”;顯示的圖片是這行代碼的效果,如圖

根據上面內容,大家會發現在建立UNNotificationRequest的時候,會需要UNMutableNotificationContent以及UNTimeIntervalNotificationTrigger這兩個類。下面我就對相關的類,以及類擴充,做相應的說明。

1.UNNotificationContent以及UNMutableNotificationContent(通知內容和可變通知內容)

通知內容分為可變的以及不可變的兩種類型,類似於可變數組跟不可變數組。後續我們通過某一特定標識符更新通知,便是用可變通知了。

不管是可變通知還是不可變通知,都有以下的幾個屬性:

// 1.附件數組,存放UNNotificationAttachment類@property (NS_NONATOMIC_IOSONLY, copy) NSArray *attachments ;// 2.應用程式角標,0或者不傳,意味著角標消失@property (NS_NONATOMIC_IOSONLY, copy, nullable) NSNumber *badge;// 3.主體內容@property (NS_NONATOMIC_IOSONLY, copy) NSString *body ;// 4.app通知下拉預覽時候展示的圖@property (NS_NONATOMIC_IOSONLY, copy) NSString *launchImageName;// 5.UNNotificationSound類,可以設定預設聲音,或者指定名稱的聲音@property (NS_NONATOMIC_IOSONLY, copy, nullable) UNNotificationSound *sound ;// 6.推送內容的子標題@property (NS_NONATOMIC_IOSONLY, copy) NSString *subtitle ;// 7.通知線程的標識@property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier;// 8.推送內容的標題@property (NS_NONATOMIC_IOSONLY, copy) NSString *title ;// 9.遠程通知推送內容@property (NS_NONATOMIC_IOSONLY, copy) NSDictionary *userInfo;// 10.category標識@property (NS_NONATOMIC_IOSONLY, copy) NSString *categoryIdentifier;

以上的的屬性,我都增加了相應的說明,大家可以對照我的注釋來使用。

2.UNNotificationAttachment (附件內容通知)

在UNNotificationContent類中,有個附件數組的屬性,這就是包含UNNotificationAttachment類的數組了。

@property (NS_NONATOMIC_IOSONLY, copy) NSArray *attachments ;

蘋果的解釋說,UNNotificationAttachment(附件通知)是指可以包含音頻,映像或視頻內容,並且可以將其內容顯示出來的通知。使用本地通知時,可以在通知建立時,將附件加入即可。對於遠程通知,則必須實現使用UNNotificationServiceExtension類通知服務擴充。

建立附件的方法是attachmentWithIdentifier:URL:options:error:。在使用時,必須指定使用檔案附件的內容,並且檔案格式必須是支援的類型之一。建立附件後,將其分配給內容對象的附件屬性。 (對於遠程通知,您必須從您的服務擴充做到這一點。)

附件通知支援的類型如下圖:

下面是建立UNNotificationAttachment的方法:

+ (nullable instancetype)attachmentWithIdentifier:(NSString *)identifier URL:(NSURL *)URL options:(nullable NSDictionary *)options error:(NSError *__nullable *__nullable)error;

注意:URL必須是一個有效檔案路徑,不然會報錯

這裡我再在說下options的屬性,一共有4種選項(這幾個屬性可研究死我了)

1UNNotificationAttachmentOptionsTypeHintKey此鍵的值是一個包含描述檔案的類型統一類型標識符(UTI)一個NSString。如果不提供該鍵,附件的副檔名來確定其類型,常用的類型標識符有

kUTTypeImage,kUTTypeJPEG2000,kUTTypeTIFF,kUTTypePICT,kUTTypeGIF ,kUTTypePNG,kUTTypeQuickTimeImage等。看到這裡你一定有疑問,這些類型匯入報錯了啊!!我研究了蘋果文檔,發現大家需要添加以下架構才可以,具體大家可以通過以下類型來處理。

注意:

架構就是#import

使用方法如下:

dict[UNNotificationAttachmentOptionsTypeHintKey] = (__bridge id _Nullable)(kUTTypeImage);

2UNNotificationAttachmentOptionsThumbnailHiddenKey,是一個BOOL值,為YES時候,縮圖將隱藏,預設為YES。如圖:

大家可以對照上面的圖來看,就明白是哪裡的圖消失了。

使用方法如下:

dict[UNNotificationAttachmentOptionsThumbnailHiddenKey] = @YES;

3UNNotificationAttachmentOptionsThumbnailClippingRectKey剪貼矩形的縮圖。這個密鑰的值是包含一個歸一化的CGRect – 也就是說,一個單元的矩形,其值是在以1.0〜 0.0 ,表示要顯示的原始映像的所述部分的字典。例如,指定的(0.25 , 0.25)的原點和大小(0.5 ,0.5 )定義了剪輯矩形,只顯示映像的中心部分。使用CGRectCreateDictionaryRepresentation函數來建立字典的矩形。

上面這句話是蘋果的翻譯,太繞口了。我簡單說,就是我下面這幅圖。

整張圖被分割了,整體比例為1,如果想得到圖中陰影面積,就需要寫的CGRect(0.5,0.5,0.25,0.25),意思是,從(0.5,0.5)為原點,面積為(0.25,0.25),大家可以理解成,即下面的方法。

使用方法如下:

dict[UNNotificationAttachmentOptionsThumbnailClippingRectKey] = (__bridge id _Nullable)((CGRectCreateDictionaryRepresentation(CGRectMake(0.5, 0.5, 0.25 ,0.25))));;

使用上面的方法,可以得到一張圖的陰影部分的映像,這張映像會是通知的縮圖。比如我下面的這個圖,縮圖大家應該可以發現變了吧。

這裡為了理解,在給大家說幾個”座標點”:

(0,0,0.25,0.25)左上方的最小正方形

(0,0,0.5,0.5) 四分之一的正方形,左上方

(0.5,0.5,0.5,0.5)四分之一的正方形,右下角

(0.5,0,0.5,0.5)四分之一的正方形,左下角

(0.25,0.25,0.5,0.5)最中心的正方形

特別注意:

調試到這裡的時候,我感覺蘋果應該是有個bug,就是我在來回變化這個顯示縮圖的frame的時候,來回改,永遠顯示為第一次寫的frame。我在修改UNNotificationRequest的requestIdentifer屬性後,可以變換屬性。所以我猜測可能相同requestIdentifer的通知,算一個通知,所以只能調用更新的方法,來變化縮圖的吃不膩吧,或許也不是bug。

4UNNotificationAttachmentOptionsThumbnailTimeKey,一般影片附件會用到,指的是用影片中的某一秒來做這個縮圖;

使用方法如下:

dict[UNNotificationAttachmentOptionsThumbnailTimeKey] =@10;

這裡我們可以直接傳遞一個NSNumber的數值,比如使用影片第10s的畫面來做縮圖就按照上面的來寫。此外,要注意的是,這個秒數必須是這個影片長度範圍內的,不然報錯。

3.UNTimeIntervalNotificationTrigger (通知觸發模式)

這個我在!(這篇文章中已經初步介紹了,現在我在詳細介紹下)[www.baidu.com]這篇文章中已經初步介紹了,現在我在詳細介紹下。

1.UNPushNotificationTrigger (遠程通知觸發)一般我們不會使用的

2.UNTimeIntervalNotificationTrigger (本地通知) 一定時間之後,重複或者不重複推播通知。我們可以設定timeInterval(時間間隔)和repeats(是否重複)。

使用方法:

UNTimeIntervalNotificationTrigger *triggerOne = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];

解釋:上面的方法是指5秒鐘之後執行。repeats這個屬性,如果需要為重複執行的,則TimeInterval必須大於60s,否則會報* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'time interval must be at least 60 if repeating'的錯誤!**

3.UNCalendarNotificationTrigger(本地通知) 一定日期之後,重複或者不重複推播通知 例如,你每天8點推送一個通知,只需要dateComponents為8。如果你想每天8點都推送這個通知,只要repeats為YES就可以了。

// 周一早上 8:00 上班NSDateComponents *components = [[NSDateComponents alloc] init];// 注意,weekday是從周日開始的,如果想設定為從周一開始,大家可以自己想想~components.weekday = 2;components.hour = 8;UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];

4.UNLocationNotificationTrigger (本地通知)地理位置的一種通知,使用這個通知,你需要匯入

#import這個系統類別庫。範例程式碼如下://1、如果使用者進入或者走出某個地區會調用下面兩個方法- (void)locationManager:(CLLocationManager *)managerdidEnterRegion:(CLRegion *)region- (void)locationManager:(CLLocationManager *)managerdidExitRegion:(CLRegion *)region代理方法反饋相關資訊//2、一到某個經緯度就通知,判斷包含某一點麼// 不建議使用!!!!!!CLRegion *region = [[CLRegion alloc] init];// 不建議使用!!!!!!CLCircularRegion *circlarRegin = [[CLCircularRegion alloc] init];[circlarRegin containsCoordinate:(CLLocationCoordinate2D)];UNLocationNotificationTrigger *trigger4 = [UNLocationNotificationTrigger triggerWithRegion:circlarRegin repeats:NO];

注意,這裡建議使用CLCircularRegion這個繼承自CLRegion的類,因為我看到蘋果已經飛起了CLRegion裡面是否包含這一點的方法,並且推薦我們使用CLCircularRegion這個類型

以上所述是小編給大家介紹的iOS 10 推送高階篇(必看),希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.