From ebd483ee5880131d6602e63ca46cfa49caef2983 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Thu, 18 Oct 2018 23:09:39 +0300 Subject: Avatars in notifications --- JuickPush/Info.plist | 31 +++++++++++++++++++++++++++ JuickPush/NotificationService.h | 13 ++++++++++++ JuickPush/NotificationService.m | 46 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 JuickPush/Info.plist create mode 100644 JuickPush/NotificationService.h create mode 100644 JuickPush/NotificationService.m (limited to 'JuickPush') diff --git a/JuickPush/Info.plist b/JuickPush/Info.plist new file mode 100644 index 0000000..935f4fa --- /dev/null +++ b/JuickPush/Info.plist @@ -0,0 +1,31 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + JuickPush + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSExtension + + NSExtensionPointIdentifier + com.apple.usernotifications.service + NSExtensionPrincipalClass + NotificationService + + + diff --git a/JuickPush/NotificationService.h b/JuickPush/NotificationService.h new file mode 100644 index 0000000..91ca27a --- /dev/null +++ b/JuickPush/NotificationService.h @@ -0,0 +1,13 @@ +// +// NotificationService.h +// JuickPush +// +// Created by Vitaly Takmazov on 18/10/2018. +// Copyright © 2018 com.juick. All rights reserved. +// + +#import + +@interface NotificationService : UNNotificationServiceExtension + +@end diff --git a/JuickPush/NotificationService.m b/JuickPush/NotificationService.m new file mode 100644 index 0000000..82dead8 --- /dev/null +++ b/JuickPush/NotificationService.m @@ -0,0 +1,46 @@ +// +// NotificationService.m +// JuickPush +// +// Created by Vitaly Takmazov on 18/10/2018. +// Copyright © 2018 com.juick. All rights reserved. +// + +#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]; + + NSURL *avatarURL = [NSURL URLWithString:request.content.userInfo[@"avatarUrl"]]; + + NSURLSession * downloadSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; + + [[downloadSession downloadTaskWithURL:avatarURL completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { + if (!error) { + NSError *err = nil; + NSString *temporaryDirectory = [NSTemporaryDirectory() stringByAppendingPathComponent:[response suggestedFilename]]; + [[NSFileManager defaultManager] moveItemAtPath:location.path toPath:temporaryDirectory error:&err]; + UNNotificationAttachment *avatarAttachment = [UNNotificationAttachment attachmentWithIdentifier:avatarURL.lastPathComponent URL:[NSURL fileURLWithPath:temporaryDirectory] options:nil error:&err]; + self.bestAttemptContent.attachments = @[avatarAttachment]; + self.contentHandler(self.bestAttemptContent); + } + }] resume]; +} + +- (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); +} + +@end -- cgit v1.2.3