在iOS 10中使用远程通知(富媒体推送通知)在通知栏中显示图像

我已经整合了APNS,并希望像下面那样在远程通知中显示图像;

在这里输入图像说明

我用下面的代码引用链接 ;

AppDelegate.h

#import <UserNotifications/UserNotifications.h> @interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate> 

AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self registerForRemoteNotification]; UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc1 = [storyboard instantiateViewControllerWithIdentifier:@"mainscreen"]; self.window.rootViewController = vc1; return YES; } - (void)registerForRemoteNotification { if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")) { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){ [[UIApplication sharedApplication] registerForRemoteNotifications]; }]; } else { [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ DeviceToken = [[NSString alloc]initWithFormat:@"%@",[[[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""]]; NSLog(@"Device Token = %@",DeviceToken); } 

然后,我使用UNNotificationServiceExtension创build了新的目标,并创build了新的捆绑ID“com.RichPush.app.Service-Extension”,我还为UNNotificationServiceExtension创build了具有上述捆绑的新证书和configuration文件。

NotificationService.h

 #import <UserNotifications/UserNotifications.h> @interface NotificationService : UNNotificationServiceExtension @end 

NotificationService.m

 #import "NotificationService.h" @interface NotificationService () @property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver); @property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent; @end @implementation NotificationService - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; // Modify the notification content here... //self.bestAttemptContent.body = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.body]; // check for media attachment, example here uses custom payload keys mediaUrl and mediaType NSDictionary *userInfo = request.content.userInfo; if (userInfo == nil) { [self contentComplete]; return; } NSString *mediaUrl = userInfo[@"mediaUrl"]; NSString *mediaType = userInfo[@"mediaType"]; if (mediaUrl == nil || mediaType == nil) { [self contentComplete]; return; } // load the attachment [self loadAttachmentForUrlString:mediaUrl withType:mediaType completionHandler:^(UNNotificationAttachment *attachment) { if (attachment) { self.bestAttemptContent.attachments = [NSArray arrayWithObject:attachment]; } [self contentComplete]; }]; } - (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 contentComplete]; } - (void)contentComplete { self.contentHandler(self.bestAttemptContent); } - (NSString *)fileExtensionForMediaType:(NSString *)type { NSString *ext = type; if ([type isEqualToString:@"image"]) { ext = @"jpg"; } return [@"." stringByAppendingString:ext]; } - (void)loadAttachmentForUrlString:(NSString *)urlString withType:(NSString *)type completionHandler:(void(^)(UNNotificationAttachment *))completionHandler { __block UNNotificationAttachment *attachment = nil; NSURL *attachmentURL = [NSURL URLWithString:urlString]; NSString *fileExt = [self fileExtensionForMediaType:type]; NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; [[session downloadTaskWithURL:attachmentURL completionHandler:^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) { if (error != nil) { NSLog(@"%@", error.localizedDescription); } else { NSFileManager *fileManager = [NSFileManager defaultManager]; NSURL *localURL = [NSURL fileURLWithPath:[temporaryFileLocation.path stringByAppendingString:fileExt]]; [fileManager moveItemAtURL:temporaryFileLocation toURL:localURL error:&error]; NSError *attachmentError = nil; attachment = [UNNotificationAttachment attachmentWithIdentifier:@"" URL:localURL options:nil error:&attachmentError]; if (attachmentError) { NSLog(@"%@", attachmentError.localizedDescription); } } completionHandler(attachment); }] resume]; } @end 

我使用下面的plist进行服务扩展:

在这里输入图像说明

我的Playload是;

  { "aps": { "alert": { "title": "title", "body": "Your message Here", "mutable-content": "1", "category": "myNotificationCategory" } }, "mediaUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/FloorGoban.JPG/1024px-FloorGoban.jpg", "mediaType": "image" } 

请让我知道我错了。

提前致谢。

你需要把“可变内容”:“1”,标志外的“警报” – 对象的有效载荷。

你这里有一个错误:

然后,我使用UNNotificationServiceExtension创build了新的目标,并创build了新的捆绑ID“com.RichPush.app.Service-Extension”,我还为UNNotificationServiceExtension创build了具有上述捆绑的新证书和configuration文件。

使用UNNotificationContentExtension而不是UNNotificationServiceExtension

创build新目标之后,xcode将创buildswift(obj-c)文件和storyboard界面

我有一个关于swift代码的简单例子,它载入图像并在大的推送通知视图上显示

 class NotificationViewController: UIViewController, UNNotificationContentExtension { //image provided from storyboard @IBOutlet weak var image: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any required interface initialization here. } func didReceive(_ notification: UNNotification) { let userInfo = notification.request.content.userInfo // get image url // and load image here } } 

来自Apple文档:

UNNotificationServiceExtension在传递给用户之前,修改远程通知的内容。

UNNotificationContentExtension为交付的本地或远程通知提供自定义界面。

你的通知载荷应该是这样的:

  aps = { alert = { body = Testing; title = Dining; }; badge = 1; "content-available" = 1; "mutable-content" = 1; sound = "Bleep-Sound.wav"; }; } 

内容可用和可变内容应该在警报之外,并且也应该添加徽章数量….