Ank*_*han 5 objective-c apple-push-notifications ios ios10 usernotifications
我已经集成了APNS,并希望在远程通知中显示图像,如下所示;
我已经在下面的代码中使用了参考链接;
AppDelegate.h
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate>
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
然后,我使用UNNotificationServiceExtension创建了新目标, 并创建了新的捆绑包ID“ com.RichPush.app.Service-Extension”,并且还为UNNotificationServiceExtension创建了带有上述捆绑包的新证书和配置文件。
NotificationService.h
#import <UserNotifications/UserNotifications.h>
@interface NotificationService : UNNotificationServiceExtension
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我在plist下面使用了服务扩展:
我的播放量是;
{
"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"
}
Run Code Online (Sandbox Code Playgroud)
请让我知道我错了。
提前致谢。
小智 0
你这里有一个错误:
然后,我使用 UNNotificationServiceExtension 创建了新目标,并创建了新的捆绑包 id "com.RichPush.app.Service-Extension" ,我还使用上述捆绑包为 UNNotificationServiceExtension 创建了新的证书和配置文件。
使用UNNotificationContentExtension而不是UNNotificationServiceExtension
创建新目标后,xcode将创建swift(obj-c)文件和故事板界面
我有一个关于 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
}
}
Run Code Online (Sandbox Code Playgroud)
来自苹果文档:
UNNotificationServiceExtension 在将远程通知传递给用户之前修改远程通知的内容。
和
UNNotificationContentExtension 为交付的本地或远程通知提供自定义界面。
| 归档时间: |
|
| 查看次数: |
3596 次 |
| 最近记录: |