0

ローカル通知の表示に関して、かなり理解できる問題があります。私が他のスレッドを読んでいた限り、最初にアプリケーションでローカル通知を作成してスケジュールしました。

その通知を表示するには、デリゲート didFinishLaunchingWithOptions: (アプリがバックグラウンド操作の場合) と didReceiveLocalNotification: (アプリがフォアグラウンド操作の場合) を使用する必要があります。

didFinishLaunchingWithOptions: メソッドを変更していなくても、アプリがバックグラウンドにあるときに通知が既に表示されています。

didFinishLaunchingWithOptions: が少なくとも指定したときに使用されていれば、それほど大きな問題にはなりません。しかし、そうではありません。

したがって、私の問題は、 didFinishLaunchingWithOptions: メソッドを使用していなくても、通知が表示されることです。ユーザーが通知をクリックすると、アプリがフォアグラウンドになり、didReceiveLocalNotification: メソッドがトリガーされ、通知が再び表示されます。

私が最初にやりたかったのは、didFinishLaunchingWithOptions: の実行時に cancelAllLocalNotifications を実行することですが、実行されていないため、ここで立ち往生しています。

わかりました、applicationWillEnterForeground: で回避策があるかもしれませんが、正直なところ、didFinishLaunchingWithOptions: で指定していなくても通知が表示される理由を理解したいと思います。

あなたのすべての助けは本当に感謝しています!! ありがとう!!

//
//  myNotificationsClass.m
//


#import "myNotificationsClass.h"

@implementation myNotificationsClass

//Sets up a Local Notification with Message, TimeFromNow, BadgeNumber and UserInfo

//no Class Instance for calling this method needed!!

+ (void)setupLocalNotificationsWithMessage: (NSString *) message andTimeFromNow: (NSTimeInterval) seconds andAlertAction: (NSString *) alertAction andBadgeNumber: (NSInteger) badgeNumber andUserInfo: (NSDictionary *) infoDict {

//[[UIApplication sharedApplication] cancelAllLocalNotifications];

UILocalNotification *localNotification = [[UILocalNotification alloc] init];

// create date/time information
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:seconds];
localNotification.timeZone = [NSTimeZone defaultTimeZone];

//setup Appearence and Message
localNotification.alertBody = message; //@"Time to get up!";
localNotification.alertAction = alertAction;
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.applicationIconBadgeNumber = badgeNumber;

localNotification.userInfo = infoDict;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}

@end


//overwrites the viewWillAppear: Method from the primary Class to display a Test Notification

@implementation UIViewController (localNotification)
- (void)viewWillAppear:(BOOL)animated {

    [myNotificationsClass setupLocalNotificationsWithMessage:@"First Test after 2 Seconds" andTimeFromNow:2 andAlertAction:@"GoTo iSnah" andBadgeNumber:7 andUserInfo:nil];

}
@end

//receive Local Notifications even if the App is in Foreground
//overwrites the primery method
@implementation UIResponder (localNotificationForeground)

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[[[NSBundle mainBundle] infoDictionary]   objectForKey:@"CFBundleName"]
                                                        message:notification.alertBody
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];

        [alertView show];

    //reset Badge
    application.applicationIconBadgeNumber = 0;

}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    


    //Because I don't want the Notification to be displayed twice 
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    if (notification) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[[[NSBundle mainBundle] infoDictionary]   objectForKey:@"CFBundleName"]
                                                            message:notification.alertBody
                                                            delegate:nil
                                                    cancelButtonTitle:@"OK"
                                                    otherButtonTitles:nil];


        [alertView show];

        //reset Badge
        application.applicationIconBadgeNumber = 0;

    }


    return YES;
}

@end
4

1 に答える 1

1

あなたはとても近くにいます。アプリがバックグラウンドで実行されている場合、ユーザーが通知に応答しても、アプリが「起動」することはありません。「起動」とは、アプリがまったく実行されていないことを意味します (フォアグラウンドまたはバックグラウンド)。そのため、ユーザーがローカル通知に応答した結果としてアプリが起動または開始されたときに実行するコードのみをそこに入れます。

したがって、didReceiveLocalNotification メソッドに必要なのは、アプリケーションの状態をチェックして、ユーザーがローカル通知に応答したときにアプリケーションがフォアグラウンドにあったかバックグラウンドにあったかを確認することです。

ロジックをフォアグラウンドとバックグラウンドで区別するには、次のようにします。

- (void)application:(UIApplication *)application didReceiveLocalNotification:    (UILocalNotification *)notification
if ( application.applicationState == UIApplicationStateActive ){
    NSLog(@"Was already in the foreground");
}
else{
    NSLog(@"Was in the background");
}

}

ただし、マイナーポイント。ドキュメントには、didReceiveLocalNotification メソッドが application:didFinishLaunchingWithOptions: の後に呼び出されると記載されています (そのメソッドが実装されている場合)。したがって、両方の方法を実装している場合は、「起動」状況で 2 つの組み合わせが正しく機能することを確認する必要があります。

于 2012-08-14T22:28:13.773 に答える