iOS丰富通知:发送MP4文件会产生透明的缩略图

iOS丰富通知:发送MP4文件会产生透明的缩略图,ios,objective-c,ionic-framework,apple-push-notifications,cordova-plugins,Ios,Objective C,Ionic Framework,Apple Push Notifications,Cordova Plugins,我刚刚在iOS应用程序中将MP4/GIF附件添加到推送通知中。播放方面一切正常。我面临的问题是,当发送MP4视频时,推送中发送的小缩略图看起来是透明的。然而,当我扩展它的时候,它看起来很完美,我也可以在推球过程中发挥得很好。当我发送相同的视频转换成GIF时,缩略图看起来也很完美 以下是一个例子: 上面的示例显示了两个不同的应用程序,只是为了显示MP4和GIF缩略图在同一事件中的显示方式。如果我将GIF发送到顶部的应用程序,缩略图的输出看起来与Pushover应用程序缩略图完全相同 下面是我滑动

我刚刚在iOS应用程序中将MP4/GIF附件添加到推送通知中。播放方面一切正常。我面临的问题是,当发送MP4视频时,推送中发送的小缩略图看起来是透明的。然而,当我扩展它的时候,它看起来很完美,我也可以在推球过程中发挥得很好。当我发送相同的视频转换成GIF时,缩略图看起来也很完美

以下是一个例子:

上面的示例显示了两个不同的应用程序,只是为了显示MP4和GIF缩略图在同一事件中的显示方式。如果我将GIF发送到顶部的应用程序,缩略图的输出看起来与Pushover应用程序缩略图完全相同

下面是我滑动并查看缩略图(透明缩略图)时发生的情况。这个特定的扩展缩略图用于不同的事件(我丢失了那个旧事件)。但我想说的是,扩展视图看起来很完美。而且玩得也很完美

总之,在IOS中,当我将MP4文件作为附件发送时,小缩略图看起来是透明的,但播放效果很好。扩展的缩略图看起来很完美

这是我的客户代码:

    //
//  NotificationService.m
//  NotificationService
//
//  
//
//
// Credit https://github.com/Leanplum/Leanplum-iOS-Samples/blob/master/iOS_basicSetup/basicSetup/richPushExtension/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];
    NSDictionary *userInfo = request.content.userInfo;


    // If there is no image in the payload than
    // the code will still show the push notification.
    if (userInfo == nil || userInfo[@"image_url_jpg"] == nil) {
        NSLog(@"zmNinja Notification: Did not get a payload or image");
        [self contentComplete];
        return;
    }

    NSString *mediaUrl = userInfo[@"image_url_jpg"];
   // if (mediaType == nil) {
   //   NSLog(@"zmNinja Notification: No media type specified, assuming .jpg");
  //    mediaType = @".jpg";
  //  }

    // load the attachment
    [self loadAttachmentForUrlString:mediaUrl

                   completionHandler:^(UNNotificationAttachment *attachment) {
                       if (attachment) {
                           self.bestAttemptContent.attachments = [NSArray arrayWithObject:attachment];
                       }
                       [self contentComplete];
                   }];

}

- (NSString*)determineType:(NSString *) fileType {
    // Determines the file type of the attachment to append to NSURL.
    //return @".gif";
      // Determines the file type of the attachment to append to NSURL.
    NSLog (@"zmNinja Notification: determineType got filetype=%@",fileType);
    if ([fileType isEqualToString:@"image/jpeg"]){
        NSLog (@"zmNinja Notification: returning JPG");
        return @".jpg";
    }
    if ([fileType isEqualToString:@"video/mp4"]){
        NSLog (@"zmNinja Notification: returning MP4");
        return @".mp4";
    }

    if ([fileType isEqualToString:@"image/gif"]) {
         NSLog (@"zmNinja Notification: returning GIF");
        return @".gif";
    }
    if ([fileType isEqualToString:@"image/png"]) {
         NSLog (@"zmNinja Notification: returning PNG");
        return @".png";

    }
     NSLog (@"zmNinja Notification: unrecognized filetype, returning JPG");
    return @".jpg";


}

- (void)loadAttachmentForUrlString:(NSString *)urlString 
                 completionHandler:(void(^)(UNNotificationAttachment *))completionHandler  {

    __block UNNotificationAttachment *attachment = nil;
    NSURL *attachmentURL = [NSURL URLWithString:urlString];

    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    [[session downloadTaskWithURL:attachmentURL
                completionHandler:^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) {
                    if (error != nil) {

                        NSLog(@"unable to add attachment: %@", error.localizedDescription);

                    } else {
                        NSString *fileType = [self determineType: [response MIMEType]];
                        NSFileManager *fileManager = [NSFileManager defaultManager];
                        NSURL *localURL = [NSURL fileURLWithPath:[temporaryFileLocation.path stringByAppendingString:fileType]];
                        [fileManager moveItemAtURL:temporaryFileLocation toURL:localURL error:&error];

                        NSError *attachmentError = nil;
                        attachment = [UNNotificationAttachment attachmentWithIdentifier:@"" URL:localURL options:nil error:&attachmentError];
                        if (attachmentError) {

                            NSLog(@"unable to add attchment: %@", attachmentError.localizedDescription);

                        }
                    }
                    completionHandler(attachment);
                }] resume];
}

- (void)contentComplete {
    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.
    NSLog (@"zmNinja Notification: Time about to expire, handing off to best attempt");
    self.contentHandler(self.bestAttemptContent);
}

@end
服务器端使用FCM遗留API:

my $ios_message = {
    to           => $obj->{token},
    notification => {
      title => $title,
      body  => $body,
      sound => "default",
      badge => $badge,
    },
    data => {
      myMessageId => $notId,
      mid         => $mid,
      eid         => $eid,
      summaryText => $eid
    }
  };
  $ios_message->{data}->{image_url_jpg} = $pic; # $pic is a URL for the mp4
  # image_url_jpg is just a field name. It was originally meant for static images
  # haven't changed it yet, as you see in client code above, it uses that field.
  $json = encode_json($ios_message);
  my $req = HTTP::Request->new( 'POST', $uri );
  $req->header(
    'Content-Type'  => 'application/json',
    'Authorization' => $key
  );
  $req->content($json);
  my $lwp = LWP::UserAgent->new(%ssl_push_opts);
  my $res = $lwp->request($req);
最后,如果您想查看示例MP4以排除任何格式问题,下面是我上传到google drive()的一个示例。我用ffshow提取了帧信息,对我来说它看起来并不不合适(而且它播放得很完美)

有人能帮我理解为什么最初的小缩略图在iOS中看起来乱七八糟吗?(如果有帮助,我使用的是iOS 13.x)
谢谢。

也有同样的问题。解决这个问题的方法是创建一个缩略图,并将其与视频URL一起发送

在服务扩展中,我添加了视频和缩略图作为附件,缩略图作为第一个元素,iOS将在通知预览中显示:

// mediaAttachment and thumbnailAttachment are UNNotificationAttachments 
// that have just been downloaded
if let mediaAttachment = mediaAttachment {
    mutableContent.attachments = [mediaAttachment]
}
if let thumbnailAttachment = thumbnailAttachment {
    mutableContent.attachments.insert(thumbnailAttachment, at: 0)
}
contentHandler(mutableContent)

扩展的通知用户界面由内容扩展处理,它取代了默认用户界面,在那里我忽略了缩略图,只显示视频,这将是最后一个附件。

谢谢David,我不太确定我是否理解。我的应用程序是爱奥尼亚/科尔多瓦应用程序。我使用phone gap插件推送来获取通知。这个“.m”文件几乎是我为处理富通知而添加的唯一代码。与Android不同,我知道Android需要编写视图来处理视频,而iOS则使用丰富的通知扩展来播放视频文件。我的应用程序源代码在-不确定我是否误解了你的评论。我也有同样的问题。你解决问题了吗?不,不幸的是,我还没有解决。