iOS_極光推送的UNNotificationServiceExtension實現富文字

weixin_33727510發表於2018-01-19

富文字

動態庫或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檔案 我現在直接改用手動匯入了
7015697-6cae6f42d3555470.png
手動整合.png

2、下載極光的SDK ,把裡面的lib檔案拷貝到工程中
7015697-c58807f3bfdaaaab.png
lib檔案.png

3.開啟推送
7015697-a198d8bfdfff6c24.png
開啟推送.png
  1. 全域性配置
<key>NSAppTransportSecurity</key>
  <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
  </dict>

5、target - build Phases 中不能存在jpush-extension-ios.a檔案(UNNotificationServiceExtension iOS 10才有的特性)
7015697-2787afaa6c68ee94.png
target.png

到這裡就整合成功了

UNNotificationServiceExtension 的配置

1.建立 UNNotificationServiceExtension 檔案
7015697-ec7e9ad69b62c296.png
service.png

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這樣的格式。如果不這麼做,你可能會遇到一個錯誤。

極光文件裡有介紹

  1. 然後再target中匯入如下庫檔案


    7015697-4373088afe6e0b96.png
    service Phases.png

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,他們是做別的推送測試,極光在這裡其實不用的),如果還顯示還是有問題,跟服務端老哥對接下,檢視一波 推送的payloadaps 裡面的格式。
對照一下下面的格式

{
    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。

相關文章