Я только что добавил вложения MP4 / GIF в свои уведомления pu sh в своем приложении iOS. Все отлично работает в отношении воспроизведения. Проблема, с которой я сталкиваюсь, заключается в том, что при отправке видео в формате MP4 небольшая миниатюра, отправляемая в pu sh, выглядит прозрачной. Тем не менее, когда я расширяю его, он выглядит идеально, и я могу играть в него хорошо внутри pu sh. Когда я отправляю то же видео, преобразованное в 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
На стороне сервера используются устаревшие API FCM:
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 ( ссылка ). Я извлек информацию о кадре с помощью ffshow, и она не выглядит для меня неуместной (плюс она отлично воспроизводится).
Может кто-нибудь помочь мне понять, почему первоначальный маленький эскиз выглядит испорченным в iOS? (Если это поможет, я на iOS 13.x) Спасибо.