Objective-Cによって実装される単純なクロスプラットフォームのC++レイヤー(dylib)をプログラミングしています。プラットフォーム固有の部分は、プラットフォームマクロを介して含まれています。ARC C++抽象レイヤーを介したObjective-C委譲
NSUserNotificationCenterでは、通知をクリックするなど、特定の操作を処理するための委任パターンが必要です。私が直面している問題は、send
を実行するとすぐに通知が送信されますが、インスタンスはその直後にアンロードされるということです。したがって、onclick通知アクションは呼び出されない(didActivateNotification)代わりに、悪いポインタのためにクラッシュします。どうすればこの作品を作れますか?
注: SomeObjectiveC.mm
は、私のアプリケーションにあるクラスです。 AppleUserNotificationManager.m
はNotificationManager+apple.mm
で初期化され、両方とも私のDylibに配置されています。
SomeObjectiveC.mm
Notification *notification = new Notification;
notification->setTitle("Foo bar notification");
notification->setMessage("Hello world!");
NotificationManager *notificationManager = new NotificationManager;
notificationManager->send(notification);
NotificationManager + apple.mm
#include "notificationManager+apple.hpp"
bool NotificationManager::send(Notification *notification)
{
AppleUserNotificationManager *notificationManager = [[AppleUserNotificationManager alloc] init];
NSString *title = [NSString stringWithUTF8String:notification->getTitle().c_str()];
NSString *message = [NSString stringWithUTF8String:notification->getMessage().c_str()];
if (notification->getSoundName().empty()) {
[notificationManager sendWithTitle:title andMessage:message];
}
NSString *soundName = [NSString stringWithUTF8String:notification->getSoundName().c_str()];
[notificationManager sendWithTitle:title andMessage:message andSound: soundName];
return true;
}
AppleUserNotificationManager.m
#import "AppleUserNotificationManager.h"
@implementation AppleUserNotificationManager
@synthesize userNotification;
- (id)init
{
[[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate: self];
userNotification = [[NSUserNotification alloc] init];
self = [super init];
return self;
}
/**
* @param NSUserNotificationCenter center
* @param NSUserNotification notification
*
* @return bool
*/
- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification{
return YES;
}
/**
* @param NSUserNotificationCenter center
* @param NSUserNotification notification
*/
- (void) userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification
{
NSString *notificationText = [notification informativeText];
NSString *urlRegEx = @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
if ([urlTest evaluateWithObject:notificationText]) {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:notificationText]];
}
}
/**
* @param NSString title
* @param NSString message
* @param NSString soundName
*/
- (void)sendWithTitle:(NSString *)title andMessage:(NSString *)message andSound:(NSString *)soundName{
userNotification.title = title;
userNotification.informativeText = message;
userNotification.soundName = soundName;
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification: userNotification];
}
@end