45

アプリが実行されていないときにプッシュ通知を受信した場合、その通知をクリックすると、アプリが起動しますが、設定したアラート ビューでユーザーにプロンプ​​トを表示せず、表示するかどうかを尋ねます。通知内容の有無。それはただ起動し、そこに座っています。

プッシュ通知は、アプリが実行中 (アクティブ アプリとして、またはバックグラウンドで実行中)に完全に機能しますが、アプリが実行されていないときは何も正​​しく機能しません。

launchOptionsNSDictionary をログアウトしapplication: didFinishLaunchingWithOptions:て負荷を確認しようとしましたが、「(null)」と表示されます。したがって、基本的には何も含まれていません-通知の負荷が含まれていないのは意味がありませんか?

アプリが実行されていないときにプッシュ通知が到着したときにプッシュ通知を機能させる方法を知っている人はいますか?

編集:application: didReceiveRemoteNotification何が何であるかを確認するために使用しているコードは次のとおりです。

if (UIApplicationStateBackground) {

    NSLog(@"===========================");
    NSLog(@"App was in BACKGROUND...");
}
else if (UIApplicationStateActive == TRUE) {
    NSLog(@"===========================");
    NSLog(@"App was ACTIVE");
}
else {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 99]; 
    UIAlertView *BOOM = [[UIAlertView alloc] initWithTitle:@"BOOM"
                                                   message:@"app was INACTIVE"
                                                  delegate:self
                                         cancelButtonTitle:@"a-ha!"
                                         otherButtonTitles:nil];
    [BOOM show];
    NSLog(@"App was NOT ACTIVE");
}

したがって、これはすべてのアプリケーションの状態を処理することになっていますが、そうではありません。プッシュ通知は、アプリがバックグラウンドまたはフォアグラウンドで実行されている場合にのみ機能します...

================================================

更新/編集#2:「@dianz」の提案(以下)application: didFinishLaunchingWithOptionsに従って、次を含めるように私のコードを変更しました:

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (localNotif) {
    NSString *json = [localNotif valueForKey:@"data"]; 

    UIAlertView *bam = [[UIAlertView alloc] initWithTitle:@"appDidFinishWithOptions"
                                                  message:json   
                                                 delegate:self
                                        cancelButtonTitle:@"cool"
                                        otherButtonTitles:nil];
    [bam show];

}

これにより、AlertViewボックスが表示されますが、ペイロードがないようです.AlertViewのタイトルが表示されます(「appDidFinishWithOptions」)が、json NSStringがEMPTYになります...微調整を続けます...

======================

編集 #3 - 現在はほぼ100%動作
していdidFinishLaunchingWithOptionsます。

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (localNotif) {
        // Grab the pushKey:
        pushKey = [localNotif valueForKey:@"pushKey"];
        // "pushKey" is an NSString declared globally
        // The "pushKey" in the "valueForKey" statement is part of my custom JSON Push Notification pay-load.
        // The value of pushKey will always be a String, which will be the name of the 
        // screen I want the App to navigate to. So when a Notification arrives, I go
        // through an IF statement and say "if pushKey='specials' then push the                                      
        // specialsViewController on, etc.

        // Here, I parse the "alert" portion of my JSON Push-Notification:
        NSDictionary *tempDict = [localNotif valueForKey:@"aps"];
        NSString *pushMessage = [tempDict valueForKey:@"alert"];


        // Finally, ask user if they wanna see the Push Notification or Cancel it:
        UIAlertView *bam = [[UIAlertView alloc] initWithTitle:@"(from appDidFinishWithOptions)"
                                                      message:pushMessage  
                                                     delegate:self
                                            cancelButtonTitle:@"Cancel"
                                            otherButtonTitles:@"View Info", nil];
        [bam show];

    }

alertView: clickedButtonAtIndex次に、ユーザーが AlertView で何を選択したかを確認するメソッドを実装し、それに応じて処理を進めます。

didReceiveRemoteNotificationこれは、ロジックとともに完全に機能します。

ただし...アプリが実行されていない場合、プッシュ通知アラートが到着したらすぐにクリックせず、代わりにフェードアウトするのを待つと、プッシュ通知を送信します(これは3-のように発生します- 4 秒)、次にアプリのアイコン (BADGE が 1 になっている) をクリックします。アプリは起動しますが、起動時にプッシュ通知アラートがまったく表示されません。そこに座っているだけです。

次にその順列を理解する必要があると思います...

4

8 に答える 8

37

アプリが実行されていない、または強制終了されていないときに、プッシュ通知をタップすると、この関数がトリガーされます。

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

このように処理する必要があるため、

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (localNotif) {
    NSString *json = [localNotif valueForKey:@"data"];
    // Parse your string to dictionary
}
于 2012-08-25T03:00:02.447 に答える
11

オーバーライドすればベターdidReceiveRemoteNotification どうぞ

NSDictionary * pushNotificationPayload = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(pushNotificationPayload) {
    [self application:application didReceiveRemoteNotification:pushNotificationPayload];
}

didReceiveRemoteNotificationこれにより、メソッドが再びpush notification起動され、アプリケーションの実行時に実行されるのと同じようにコードが実行されます。

于 2013-05-02T09:37:49.117 に答える
7

@dianzの回答を試しましたが、うまくいきませんでしたが、回答から助けを得ました。

私の場合;

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

NSDictionary *apnsBody = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (apnsBody) {
    // Do your code with apnsBody
}
于 2012-10-15T07:39:05.103 に答える
5

これは回答済みですが、提供された回答はどれも実際には正しく機能しませんでした。これが、私が機能することができた私の実装です。

このコードが入りますapplication:didFinishLaunchingWithOptions:

迅速:

if let options = launchOptions, notification = options[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject : AnyObject] {
    // NOTE: (Kyle Begeman) May 19, 2016 - There is an issue with iOS instantiating the UIWindow object. Making this call without
    // a delay will cause window to be nil, thus preventing us from constructing the application and assigning it to the window.
    Quark.runAfterDelay(seconds: 0.001, after: {
        self.application(application, didReceiveRemoteNotification: notification)
    })
}

目的 C:

if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
    [self application:application didReceiveRemoteNotification:launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]];
}

いくつかのメモ:

  • おそらく、iOS が割り当てをキューに入れる方法が原因でUIApplication.sharedApplication().window、アプリケーションが強制終了された後に起動すると、ルート オブジェクトは nil になります。1 ミリ秒の遅延を追加すると、この問題が修正されました。Objective-C でこれをテストしなかった

  • [NSObject: AnyObject] へのキャストは、型の競合を避けるために必要でしたが、私はこれをあまり試しませんでした。独自のプロジェクトに実装するときは、このことを念頭に置いてください。Objective-C ではこれは必要ありません。

  • Quark は、私がすべてのプロジェクトで使用する楽しい小さなライブラリであり、便利で一般的に使用される拡張機能とメソッドが含まれています。アプリケーションのニーズに合った任意の形式の遅延を使用するだけです。

于 2016-05-19T23:51:12.913 に答える
1

didReceiveRemoteNotificationメソッドに移動して、そこで処理してみてください。そこで、 の条件を実行することで、アプリケーションの状態を確認できapplicationStateますUIApplicationStateActive

于 2012-08-24T23:36:44.063 に答える
0

これを試して

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    //register notifications
    if([application respondsToSelector:@selector(registerUserNotificationSettings:)]) // ios 8
    {
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
        [application registerForRemoteNotifications];
    }
    else // ios 7
    {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge];
    }

    // open app from a notification
    NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    if (notification) 
    {
        //your alert should be here
    }

    // Set icon badge number to zero
    application.applicationIconBadgeNumber = 0;

    return YES;
}
于 2014-12-10T02:56:21.943 に答える