15

アプリが実行されていないときにニューススタンドの通知を受信して​​いません。これが私が行ったことです。

アプリには、適切な plist キー 'UINewsstandApp = YES' および 'UIBackgroundModes = newsstand-content' があります。

アプリデリゲートですべての通知タイプに登録し、APNS からトークンを受け取り、サーバー側から (私は Grocer という gem を使用しています)、開発証明書を設定し、通常のプッシュを送信すると動作します。

ニューススタンドのプッシュを送信すると、アプリが「didReceiveRemoteNotification」で実行されている場合は受信しますが、アプリが実行されていない場合、通知センターには何も表示されません。これは主に、「Grocer」に次のペイロード {"aps" があるためです。 {"content-available":1}} であり、他のキー (アラート、バッジなど) を追加することはできません

そのため、通知センターで何も取得しないでください。起動オプションで「UIApplicationLaunchOptionsRemoteNotificationKey」を探し、アプリがバックグラウンドで実行されていることを確認するためにファイルを書き込みます。ファイルはそのように書き込まれることはありません

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(remoteNotif)
    {
        NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *filePath = [cachePath stringByAppendingPathExtension:@"pushreceived.txt"];
        [@"testing" writeToFile:filePath atomically:YES encoding:NSASCIIStringEncoding error:nil];
    }

ユーザーのデフォルトで NKDontThrottleNewsstandContentNotifications を true に設定してから、同期して確認します。

アプリが実行されているとき、プッシュを何度送信しても、適切な「コンテンツ利用可能」で常に「 didReceiveRemoteNotification 」でコールバックを取得します

アプリが閉じているかバックグラウンドにある場合、何も起こりません。

アップデート:

通知ペイロードを送信するgemを変更できました。これが送信する辞書です

{"aps"=>
   {
     "alert"=>"Hello iPhone!!",
     "content-available"=>1,
     "badge"=>1,
     "sound"=>"default"
   }
}

ここで、アプリで受け取ったユーザー情報辞書(実行中)

{
    aps =     {
        alert = "Hello iPhone!!";
        badge = 1;
        "content-available" = 1;
        sound = default;
    };
}

content-available を囲む引用符に注意してください。これは、APNS がそれをカスタム キーとして解析したことを意味しますか?

4

2 に答える 2

3

アプリケーションがバックグラウンドで実行されているときに通知を受け取るにはapplicationDidEnterBackgroud、メイン クラスにメソッドを追加する必要があります。Appleのドキュメントから:

アプリケーションは、バックグラウンドで実行され、ユーザーが関心を持つ可能性のあるメッセージ、データ、またはその他のアイテムが到着したときにも、ローカル通知が役立つ場合があります。この場合、UIApplication メソッド presentLocalNotificationNow: を使用して、通知をすぐに表示する必要があります (iOS では、アプリケーションをバックグラウンドで実行する時間を制限しています)。リスト 2-2は、これを行う方法を示しています。


- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"Application entered background state.");
    // bgTask is instance variable
    NSAssert(self->bgTask == UIInvalidBackgroundTask, nil);

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [application endBackgroundTask:self->bgTask];
            self->bgTask = UIInvalidBackgroundTask;
        });
    }];

    dispatch_async(dispatch_get_main_queue(), ^{
        while ([application backgroundTimeRemaining] > 1.0) {

            // Replace this code with your notification handling process

            NSString *friend = [self checkForIncomingChat];
            if (friend) {
                UILocalNotification *localNotif = [[UILocalNotification alloc] init];
                if (localNotif) {
                    localNotif.alertBody = [NSString stringWithFormat:
                        NSLocalizedString(@"%@ has a message for you.", nil), friend];
                    localNotif.alertAction = NSLocalizedString(@"Read Message", nil);
                    localNotif.soundName = @"alarmsound.caf";
                    localNotif.applicationIconBadgeNumber = 1;
                    [application presentLocalNotificationNow:localNotif];
                    [localNotif release];
                    friend = nil;
                    break;
                }
            }
        }
        [application endBackgroundTask:self->bgTask];
        self->bgTask = UIInvalidBackgroundTask;
    });

}

また、注意してください

実行されていないアプリケーションに対してサポートされている唯一の通知タイプはアイコン バッジであるため、単に NSRemoteNotificationTypeBadge を registerForRemoteNotificationTypes: のパラメーターとして渡します。

于 2013-03-06T19:23:16.493 に答える
2

サニティチェックとしてこれらを試してください:

  • [設定] -> [ニューススタンド] で、アプリの自動コンテンツ ダウンロードがオンになっています。
  • [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability]アプリで何かを使用していることを確認してください。
  • plist で「newsstand-content」としてバックグラウンド モードが必要であることを確認してください。
  • シミュレーターではなく、デバイスでアプリを実行します。

これらを正しく行っていればdidReceiveRemoteNotification、アプリが実行されていないときでも通知を受け取るはずです。

于 2013-03-11T04:37:22.597 に答える