シンプル体重管理のiOS版の新規リリースが2ヵ月ほど遅れております。

問題点の一つが、iOSにおいてcordova-plugin-local-notificationプラグインによって表示された通知をタップした場合、アプリが起動していないと「click」イベントが発火しません。

今回は、その対策について説明します。


*今回の問題は、iOS版に限ります。

プラグインのZIPファイルを解凍し、「ios」フォルダの「APPLocalNotification.m」ファイルを以下のように追加・変更します。
変更したプラグインをアプリに追加します。

通知からアプリを起動した場合、launchDetailsプロパティに、idaction(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対応とそれ以外でそれぞれ派生したプラグインがあるので、最終的にはそれらプラグインを使うユーザー側が問題点をカスタマイズして使うことになります。

Recommended Posts