シンプル体重管理のiOS版の新規リリースが2ヵ月ほど遅れております。
問題点の一つが、iOSにおいてcordova-plugin-local-notificationプラグインによって表示された通知をタップした場合、アプリが起動していないと「click」イベントが発火しません。
今回は、その対策について説明します。
*今回の問題は、iOS版に限ります。
プラグインのZIPファイルを解凍し、「ios」フォルダの「APPLocalNotification.m」ファイルを以下のように追加・変更します。
変更したプラグインをアプリに追加します。
通知からアプリを起動した場合、launchDetailsプロパティに、idとaction(click)が設定されます。
変更前
/**
* Registers obervers after plugin was initialized.
*/
- (void) pluginInitialize
{
eventQueue = [[NSMutableArray alloc] init];
_center = [UNUserNotificationCenter currentNotificationCenter];
_delegate = _center.delegate;
_center.delegate = self;
[_center registerGeneralNotificationCategory];
[self monitorAppStateChanges];
}
変更後
/**
* Registers obervers after plugin was initialized.
*/
- (void)pluginInitialize
{
eventQueue = [[NSMutableArray alloc] init];
_center = [UNUserNotificationCenter currentNotificationCenter];
_delegate = _center.delegate;
_center.delegate = self;
[_center registerGeneralNotificationCategory];
[self monitorAppStateChanges];
// アプリが通知から起動された場合の処理
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleApplicationDidFinishLaunching:)
name:UIApplicationDidFinishLaunchingNotification
object:nil];
}
- (void)handleApplicationDidFinishLaunching:(NSNotification *)notification
{
NSDictionary *launchOptions = [notification userInfo];
NSDictionary *notificationDict = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (notificationDict) {
// 通知からの起動時の処理
[self handleNotificationLaunch:notificationDict];
}
}
- (void)handleNotificationLaunch:(NSDictionary *)notificationDict
{
// Extract necessary information from the notification dictionary
NSString *notificationId = [notificationDict objectForKey:@"your_notification_id_key"];
// Handle the notification launch as needed
NSString *js = [NSString stringWithFormat:@"cordova.plugins.notification.local.launchDetails = {id:%@, action:'click'}", notificationId];
[self.commandDelegate evalJs:js];
}
JavaScript
document.addEventListener("deviceready", function () {
cordova.plugins.notification.local.on("click", function (notification, state) {
//
}, this);
// iOS:通知から起動した場合、clickイベントが発火しない対策
if (device.platform == "iOS") {
if (cordova.plugins.notification.local.launchDetails) {
var launchDetails = cordova.plugins.notification.local.launchDetails;
if (launchDetails.hasOwnProperty("id")) {
// 起動
}
}
}
}, false);
現在、cordova-plugin-local-notificationプラグインは、Android12対応とそれ以外でそれぞれ派生したプラグインがあるので、最終的にはそれらプラグインを使うユーザー側が問題点をカスタマイズして使うことになります。
まるごと分かるSwiftプログラミング: 「コーディングの基礎」から「アプリ開発の学習法」まで徹底解説 (I/O BOOKS) 新品価格 |