| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /*
- * Copyright 2019 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #import "FirebaseMessaging/Sources/Public/FirebaseMessaging/FIRMessagingExtensionHelper.h"
- #import "FirebaseMessaging/Sources/FIRMMessageCode.h"
- #import "FirebaseMessaging/Sources/FIRMessagingLogger.h"
- static NSString *const kPayloadOptionsName = @"fcm_options";
- static NSString *const kPayloadOptionsImageURLName = @"image";
- static NSString *const kNoExtension = @"";
- static NSString *const kImagePathPrefix = @"image/";
- @interface FIRMessagingExtensionHelper ()
- @property(nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
- @property(nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
- @end
- @implementation FIRMessagingExtensionHelper
- - (void)populateNotificationContent:(UNMutableNotificationContent *)content
- withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler {
- self.contentHandler = [contentHandler copy];
- self.bestAttemptContent = content;
- // The `userInfo` property isn't available on newer versions of tvOS.
- #if TARGET_OS_IOS || TARGET_OS_OSX || TARGET_OS_WATCH
- NSString *currentImageURL = content.userInfo[kPayloadOptionsName][kPayloadOptionsImageURLName];
- if (!currentImageURL) {
- [self deliverNotification];
- return;
- }
- NSURL *attachmentURL = [NSURL URLWithString:currentImageURL];
- if (attachmentURL) {
- [self loadAttachmentForURL:attachmentURL
- completionHandler:^(UNNotificationAttachment *attachment) {
- if (attachment != nil) {
- self.bestAttemptContent.attachments = @[ attachment ];
- }
- [self deliverNotification];
- }];
- } else {
- FIRMessagingLoggerError(kFIRMessagingServiceExtensionImageInvalidURL,
- @"The Image URL provided is invalid %@.", currentImageURL);
- [self deliverNotification];
- }
- #else
- [self deliverNotification];
- #endif
- }
- #if TARGET_OS_IOS || TARGET_OS_OSX || TARGET_OS_WATCH
- - (NSString *)fileExtensionForResponse:(NSURLResponse *)response {
- NSString *suggestedPathExtension = [response.suggestedFilename pathExtension];
- if (suggestedPathExtension.length > 0) {
- return [NSString stringWithFormat:@".%@", suggestedPathExtension];
- }
- if ([response.MIMEType containsString:kImagePathPrefix]) {
- return [response.MIMEType stringByReplacingOccurrencesOfString:kImagePathPrefix
- withString:@"."];
- }
- return kNoExtension;
- }
- - (void)loadAttachmentForURL:(NSURL *)attachmentURL
- completionHandler:(void (^)(UNNotificationAttachment *))completionHandler {
- __block UNNotificationAttachment *attachment = nil;
- NSURLSession *session = [NSURLSession
- sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
- [[session
- downloadTaskWithURL:attachmentURL
- completionHandler:^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) {
- if (error != nil) {
- FIRMessagingLoggerError(kFIRMessagingServiceExtensionImageNotDownloaded,
- @"Failed to download image given URL %@, error: %@\n",
- attachmentURL, error);
- completionHandler(attachment);
- return;
- }
- NSFileManager *fileManager = [NSFileManager defaultManager];
- NSString *fileExtension = [self fileExtensionForResponse:response];
- NSURL *localURL = [NSURL
- fileURLWithPath:[temporaryFileLocation.path stringByAppendingString:fileExtension]];
- [fileManager moveItemAtURL:temporaryFileLocation toURL:localURL error:&error];
- if (error) {
- FIRMessagingLoggerError(
- kFIRMessagingServiceExtensionLocalFileNotCreated,
- @"Failed to move the image file to local location: %@, error: %@\n", localURL,
- error);
- completionHandler(attachment);
- return;
- }
- attachment = [UNNotificationAttachment attachmentWithIdentifier:@""
- URL:localURL
- options:nil
- error:&error];
- if (error) {
- FIRMessagingLoggerError(kFIRMessagingServiceExtensionImageNotAttached,
- @"Failed to create attachment with URL %@, error: %@\n",
- localURL, error);
- completionHandler(attachment);
- return;
- }
- completionHandler(attachment);
- }] resume];
- }
- #endif
- - (void)deliverNotification {
- if (self.contentHandler) {
- self.contentHandler(self.bestAttemptContent);
- }
- }
- @end
|