iOS_極光推送的UNNotificationServiceExtension實現富文字
富文字
動態庫或iWarch的應用的BundleID必須要跟主應用程式的bundleid一致,比如你的應用的id是com.mycop.hello,那麼內嵌的id必須是com.mycop.hello.xxx
注意:mutable-content這個鍵值為1,這意味著此條推送可以被 Service Extension 進行更改,也就是說要用Service Extension需要加上這個鍵值為1.
inplist App Transport Security Settings
前言:
建議你去極光推送下載最新的demo看一下,也許就不用再參考我寫的了。
實現的時候遇到的問題:
1.使用cocopods管理的時候少了個jpush-extension-ios.a檔案
2.UNNotificationServiceExtension 中的方法打斷點,沒反應。不知道到底走了沒有,整合成功了沒有。(到現在我還不知道怎麼讓它有反應)
3.實現了之後通知欄的圖片不見了。
開始了看好咯:
整合 jpush (檢視極光文件)
1 、之前用的cocopods匯入的時候 缺少了jpush-extension-ios.a檔案 我現在直接改用手動匯入了- 全域性配置
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
5、target - build Phases 中不能存在jpush-extension-ios.a檔案(UNNotificationServiceExtension iOS 10才有的特性)到這裡就整合成功了
UNNotificationServiceExtension 的配置
1.建立 UNNotificationServiceExtension 檔案Service Extension的Bundle Identifier不能和Main Target(也就是你自己的App Target)的Bundle Identifier相同,否則會報BundeID重複的錯誤。
Service Extension的Bundle Identifier需要在Main Target的名稱空間下,比如說Main Target的BundleID為io.jpush.xxx,那麼Service Extension的BundleID應該類似與io.jpush.xxx.yyy這樣的格式。如果不這麼做,你可能會遇到一個錯誤。
-
然後再target中匯入如下庫檔案
3.ServiceExtension 裡面的.plist檔案加入全域性配置
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
UNNotificationServiceExtension 的程式碼實現
1.在標頭檔案中匯入
#import "JPushNotificationExtensionService.h"
並程式碼實現顯示資料
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@", self.bestAttemptContent.title]; //標題
self.bestAttemptContent.subtitle = [NSString stringWithFormat:@"%@", self.bestAttemptContent.subtitle];//副標題
self.bestAttemptContent.body = [NSString stringWithFormat:@"%@", self.bestAttemptContent.body];
NSURLSession * session = [NSURLSession sharedSession];
//圖片連結字串
NSString * attachmentPath = self.bestAttemptContent.userInfo[@"image_annex"][0];
NSLog(@"attachmentPath 1, %@",attachmentPath);
//if exist
if (attachmentPath && [attachmentPath hasSuffix:@"png"]) {
//download
NSURLSessionTask * task = [session dataTaskWithURL:[NSURL URLWithString:attachmentPath] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data) {
NSString * localPath = [NSString stringWithFormat:@"%@/myAttachment.png", NSTemporaryDirectory()];
if ([data writeToFile:localPath atomically:YES]) {
UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"myAttachment" URL:[NSURL fileURLWithPath:localPath] options:nil error:nil];
self.bestAttemptContent.attachments = @[attachment];
}
}
[self apnsDeliverWith:request];
}];
[task resume];
}else{
[self apnsDeliverWith:request];
}
}
- (void)apnsDeliverWith:(UNNotificationRequest *)request {
//please invoke this func on release version
//[JPushNotificationExtensionService setLogOff];
//service extension sdk
//upload to calculate delivery rate
//please set the same AppKey as your JPush
NSLog(@"attachmentPath 3");
[JPushNotificationExtensionService jpushSetAppkey:@"AppKey copied from JiGuang Portal application"];
[JPushNotificationExtensionService jpushReceiveNotificationRequest:request with:^ {
NSLog(@"apns upload success");
self.contentHandler(self.bestAttemptContent);
}];
}
- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
self.contentHandler(self.bestAttemptContent);
}
到這裡基本上已經差不多可以了,直接執行(網上很多說需要選擇target,他們是做別的推送測試,極光在這裡其實不用的),如果還顯示還是有問題,跟服務端老哥對接下,檢視一波 推送的payload
的aps
裡面的格式。
對照一下下面的格式
{
aps = {
alert = {
'title' => "xxxxx",
'subtitle' => "xxx",
'body' => "none-body",
};
badge = 10;
"mutable-content" = 1;
sound = sound;
};
"image_annex" = (
"http://p1b05siky.bkt.clouddn.com/o_1c46hne9017pn1a1g1vth86hnnra.png"
);
}
//alert 必須有
//"mutable-content" = 1;這個必須有,使你的推送通知是動態可變的
//而且alert 欄位與 mutable-content欄位必須平級。
附:之前跟後臺老哥交流時他把"mutable-content" = 1;放進alert中 導致圖片一致出不來,還好我機智把userInfo列印出來看到的問題點,不然就炸了 ,照都找不到問題。
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
// Required
NSDictionary * userInfo = notification.request.content.userInfo;
//列印userInfo
service Extension 斷點除錯問題
還沒搞懂!!!!! 網上的說法是切換serviceExtension 選擇目標APP執行,但還是不行 。
有大佬看見請Carry 我,thx。
相關文章
- iOS —— 極光推送和極光IMiOS
- 極光推送總結
- 極光推送-java工具類Java
- 極光推送—java快速接入Java
- 極光推送證書篇
- iOS極光推送封裝iOS封裝
- 使用極光推送實現分組傳送和服務端整合服務端
- iOS 極光推送遇到的問題iOS
- 在ionic專案中使用極光推送實現推送 & 伺服器端程式碼伺服器
- 極光筆記|極光推送在APICloud平臺的使用教程筆記APICloud
- Flutter應用整合極光推送Flutter
- 在 Laravel 中使用 極光推送Laravel
- 極光推送 tag alias 設定
- Swift3.0整合極光推送Swift
- Laravel 極光推送驅動,使用極光不再那麼麻煩!Laravel
- APP訊息推送 極光推送 示例程式碼APP
- iOS 極光推送整合與開發iOS
- Android開發之極光推送的整合Android
- iOS-極光推送開發小結iOS
- 利用 javascript 實現富文字編輯器JavaScript
- iOS使用UITableView實現的富文字編輯器iOSUIView
- 極光筆記丨iOS 15推送新特性筆記iOS
- 極光推送-服務端端智慧人社訊息推送方式服務端
- Amazing!!CSS 也能實現極光?CSS
- 極光筆記 | 極光服務的信創改造實踐筆記
- iOS_三種簡單動畫的實現iOS動畫
- Flutter 封裝:富文字 RichText 極簡封裝Flutter封裝
- 手把手實現富文字編輯器
- 極光推送申請iOS推送證書p12及配置教程iOS
- 極光推送申請iOS推送證書p12及配置流程iOS
- [外掛擴充套件]APP極光推送外掛!套件APP
- JPush極光推送Java伺服器端例項Java伺服器
- 極光筆記丨Spark SQL 在極光的建設實踐筆記SparkSQL
- iOS使用NSMutableAttributedString實現富文字小結iOS
- iOS .a庫打包成.framework(將極光推送的.a庫打包進framework)iOSFramework
- 快捷地整合極光推送(JPush)到 Laravel 專案中Laravel
- 極光筆記|百億級KV儲存在極光的運維實踐之路筆記運維
- CSS3實現的文字框陰影發光效果CSSS3