1. 程式人生 > >iOS10推送必看

iOS10推送必看

雖然這篇文章比較長,也不好理解,但是還是建議大家收藏,以後用到的時候,可以看看,有耐心的還是讀一讀。

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

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

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

註冊通知中心。如果使用極光推送的小夥伴,寫看一下我的基礎篇,辛苦大家啦

建立一個UNNotificationRequest類的例項,一定要為它設定identifier, 在後面的查詢,更新, 刪除通知,這個標識是可以用來區分這個通知與其他通知
把request加到UNUserNotificationCenter, 並設定觸發器,等待觸發
如果另一個request具有和之前request相同的標識,不同的內容, 可以達到更新通知的目的

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

// 1.建立一個UNNotificationRequest
    NSString *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:@"[email protected]" 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 = @"[email protected]";
    // 2.設定聲音
    UNNotificationSound *sound = [UNNotificationSound defaultSound];
    content.sound = sound;

    // 3.觸發模式
    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];

    // 4.設定UNNotificationRequest
    NSString *requestIdentifer = @"TestRequest";
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger1];

    //5.把通知加到UNUserNotificationCenter, 到指定觸發點會被觸發
    [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
    }];

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


[email protected]

下拉放大content.launchImageName = @"[email protected]";顯示的圖片是這行程式碼的效果,如圖


IMG_0123.PNG

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

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

通知內容分為可變的以及不可變的兩種型別,類似於可變陣列跟不可變陣列。後續我們通過某一特定識別符號更新通知,便是用可變通知了。
不管是可變通知還是不可變通知,都有以下的幾個屬性:

// 1.附件陣列,存放UNNotificationAttachment類
@property (NS_NONATOMIC_IOSONLY, copy) NSArray <UNNotificationAttachment *> *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 <UNNotificationAttachment *> *attachments ;

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

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


QQ20160918-3.png-45.5kB

下面是建立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<MobileCoreServices/MobileCoreServices.h>

使用方法如下:

dict[UNNotificationAttachmentOptionsTypeHintKey] = (__bridge id _Nullable)(kUTTypeImage);
  • 2UNNotificationAttachmentOptionsThumbnailHiddenKey,是一個BOOL值,為YES時候,縮圖將隱藏,預設為YES。如圖:


    IMG_0124.PNG-67.2kB


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

    使用方法如下:

      dict[UNNotificationAttachmentOptionsThumbnailHiddenKey] =  @YES;
  • 3UNNotificationAttachmentOptionsThumbnailClippingRectKey剪貼矩形的縮圖。這個金鑰的值是包含一個歸一化的CGRect - 也就是說,一個單元的矩形,其值是在以1.0〜 0.0 ,表示要顯示的原始影象的所述部分的字典。例如,指定的(0.25 , 0.25)的原點和大小(0.5 ,0.5 )定義了剪輯矩形,只顯示影象的中心部分。使用CGRectCreateDictionaryRepresentation函式來建立字典的矩形。

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


QQ20160919.png-728.4kB


整張圖被分割了,整體比例為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))));;

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


QQ20160919-10.png-49.2kB

這裡為了理解,在給大家說幾個"座標點":
(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 (通知觸發模式)

  • 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<CoreLocation/CoreLocation.h>這個系統類庫。示例程式碼如下:
//1、如果使用者進入或者走出某個區域會呼叫下面兩個方法
- (void)locationManager:(CLLocationManager *)manager
    didEnterRegion:(CLRegion *)region
- (void)locationManager:(CLLocationManager *)manager
    didExitRegion:(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這個型別

如果你喜歡我的文章,不要忘記關注我,謝謝大家了~
另外如果你要轉載,希望可以註明出處,我會寫出更多更好的文章,來回饋大家~



原文連結:http://www.jianshu.com/p/3d602a60ca4f

相關推薦

iOS開發 iOS10(基礎篇)

轉自: http://www.jianshu.com/p/f5337e8f336d iOS開發 iOS10推送必看(基礎篇) 字數1380  閱讀2685  評論52  喜歡80 iOS10更新之

iOS開發 iOS10

iOS10更新之後,推送也是做了一些小小的修改,下面我就給大家仔細說說。希望看完我的這篇文章,對大家有所幫助。 一、簡單入門篇---看完就可以簡單適配完了 相對簡單的推送證書以及環境的問題,我就不在這裡講啦,我在這裡說的,是指原有工程的適配。 1.首先我們需

iOS10

雖然這篇文章比較長,也不好理解,但是還是建議大家收藏,以後用到的時候,可以看看,有耐心的還是讀一讀。 這篇文章開始,我會跟大家好好講講,蘋果新發布的iOS10的所有通知類。 一、建立本地通知事例詳解: 注意啊,小夥伴們,本地通知也必須在appdelegate中註冊中心,通知的開關打不開啟無所謂的,畢竟是

iOS10富文字--UIMutableUserNotificationAction

AppDelagate檔案 新增action 根據以下ContentExtension Info.plist檔案中的配置決定category的設定,兩者必須一致 巨集定義採用下列程式碼: //推送相關設定 #define Action_Category_Identif

iOS10富文字--NotificationContentExtension

NotificationContentExtension檔案 根據以下ContentExtension Info.plist檔案中的配置決定category的設定,兩者必須一致 巨集定義採用下列程式碼: //推送相關設定 #define Action_Category_I

iOS10富文字--NotificationServiceExtension

新增http協議支援,沒錯,這裡是支援http協議的,不像其他文章說的不支援,配置在另外基礎篇文章裡面有,info.plist檔案裡修改一下就行了 NotificationService檔案 額外添加了一個檔案管理器的欄位,用來儲存資料 @interface Notif

統一Android-

根據統一推送聯盟官方微博的訊息,“推必達”現已經開啟眾測,測試業務支援中國移動,中國聯通大陸區域,中國電信上海、廣東區域。 官方稱,業務由中國資訊通訊研究院,中國聯通,中國移動,中國電信聯合釋出。其利用信令級通道高可靠能力,提供一種基於底層信令通道的推送方式,實現更加可靠的、更加省電

從入門到進階,51本Python精品書籍免費

Python是一種多功能語言。它經常用作Web應用程式的指令碼語言,嵌入到軟體產品中,以及人工智慧和系統任務管理。它既簡單又強大,非常適合初學者和專業程式設計師。 小編精選了51本高質量的Python書籍。裡面涵蓋各種各樣的書籍,其中包含適用於初學者,中級和高階程式設計師的,也有針對特別領域的,

iOS8以前、iOS8-iOS10iOS10以及以上的簡單實現

一、準備工作 1、專案中要整合推送,首先要了解推送的原理,雖然3個版本中的推送實現方式不一樣,但是原理還是一樣的。安卓總是因為推送出問題,由於蘋果有自己的推送服務(APNS),所以我覺得蘋果的推送比安卓好實現很多。推送分為遠端推送和本地推送。遠端推送可以看成是客戶端,APNS,後臺伺服器相互關聯形成的一個服

IOS10 Notification通知(二)

多媒體的推送,對一些媒體大小有些限制,看下蘋果官方的截圖 本地附件推送通知,只需給content.attachments設定UNNotificationAttachment附件物件 1、實現本地音樂推送的效果先看下效果圖 //建立音樂本地推送 -

了張鴻洋大神那篇公眾號的文章才是促使我來寫部落格

看了鴻洋的文章,他說的一句話我感覺非常不錯:選擇做正確的一件事,並且堅持下去。剛剛寫部落格,因為我是一個菜鳥,所以也不知從何寫起,所以先寫寫自己做android的經歷和感想吧。 從事android這個

了極光技術原理的幾點思考

移動網際網路應用現狀 因為手機平臺本身、電量、網路流量的限制,移動網際網路應用在設計上跟傳統 PC 上的應用很大不一樣,需要根據手機本身的特點,儘量的節省電量和流量,同時又要儘可能的保證資料能及時到達客戶端。 為了解決資料同步的問題,在手機平臺上,常用的方法有2種。一種是定時去伺服器上查詢資料,也叫Poll

iOS10 遠端和本地

遠端推送 新增新的框架 UserNotifications.framework #import <UserNotifications/UserNotifications.h> #pragma mark 註冊推送 -(void)regis

swift3.0 整合極光(v2.2)iOS10.0最新寫法

// // AppDelegate.swift // 1120-jiguang // // Created by targetcloud on 2016/11/20. // Copyright © 2016年 targetcloud. All rights rese

iOS10本地和遠端的原理

使用遠端推送首先要在capacity中開啟後推送服務開關,有兩個地方要開啟。 參考:http://www.jianshu.com/p/bb89d636f989 http://www.jianshu.com/p/f6701763f8f2 http:

友盟分享和這一篇就夠了

前段時間寫了一篇關於友盟推送的文章,從閱讀量來看,大家在這方面踩了很多坑,所以我覺得有必要來個全面的總結,給大家更好的過坑意見; 先從分享開始說吧 第一步整合SDK:官方文件說的很詳細了,整合大家就看文件吧,我就總結一下要注意的地方: 微信,qq,簡訊等友盟的api都有了

SwiftUI - iOS10本地通知教程UserNotifications在Swift中的實現方式

## 簡介 訊息推送相信在很多人的眼裡都不陌生了吧?像即時聊天微信,好友發信息給你時會在頂部彈下小視窗提醒你。也像是在影院APP預訂了電影票,在開場前一小時你也會收到提醒。這類推送是需要經過後端傳送請求的,需要伺服器傳送推送請求,又或者使用如極光推送等第三方渠道。 那麼如果我們的APP不需要連網呢?這是不

C# 模板

doc -1 ges cnblogs images title src target 個推 C#推送模板、安卓個推、消息推送 http://docs.getui.com/server/csharp/template/ C# 推送模板

消息二 之webSocket

還需 由於 else har 頁面 try window class logs 友情提示: 消息推送的介紹可以參考http://www.cnblogs.com/dahuandan/p/6816173.html 什麽是webSocket webSocket是為解決客

數據庫------>求職

light 並發 image 解決 技術 pan disabled 常見 clas 關系數據庫在數據管理方面的優勢和意義, 熟悉關系數據庫的建立、修改、優化和維護, 熟練掌握使用 SQL 語句進行數據的增刪改查。 熟悉事務、並發控制、死鎖、視圖、觸發器的基本概念及應用,