0

アプリケーションでプッシュ通知を受信するために APNS を使用しています。

問題は、すべてのデバイスではなく、一部のデバイスで同じ通知を受け取ることです。この問題を解決するために約 15 日間試みましたが、成功しなかったため、ここに何が問題である可能性がありますか。デバイス トークンは正常に更新されています。そうでなければ、どのデバイスでも通知を受け取ることはなかったでしょう。しかし、奇妙なことに、私は半分のデバイスでそれを取得しています. 助けてください!!

通知を登録して受信するためのコードを次に示します。サーバー側のコードはありません。しかし、私が言ったように、通知は一部のデバイスで機能しています。アンドロイドでも彼らは働いています。

ここには 3 台のデバイスがあり、そのうちの 2 台で動作しています。iPad2:5.0.1 iPodTouch:4.3.3

バージョン5.1の別のiPod touchでは動作しません

また、すべてのデバイスで APNS に正常に登録されたことを示しています。ただし、通知を送信しないものもあります。問題は何ですか?私が見逃しているものはありますか?

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken 
{

    deviceToken = [devToken retain];

    NSLog(@"Registered for APNS %@", deviceToken);

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

    NSMutableString *dev = [[NSMutableString alloc] init];

    NSRange r;
    r.length = 1;
    unsigned char c;

    for (int i = 0; i < [deviceToken length]; i++)
    {
        r.location = i;
        [deviceToken getBytes:&c range:r];

        if (c < 10) {
            [dev appendFormat:@"0%x", c];
        }
        else {
            [dev appendFormat:@"%x", c];
        }

    }

    [ud setObject:dev forKey:@"DeviceToken"];
    [ud synchronize];

}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 
{

    NSLog(@"Failed to register %@", [error localizedDescription]);

    deviceToken = nil;

}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
for(int i=0;i<[viewControllers count];i++)
        {
            if([[viewControllers objectAtIndex:i] isKindOfClass:[Confirmation class]])
            {
                Confirmation *map = (Confirmation*)[[self.navigationController viewControllers] objectAtIndex:i];
                [map setFinalInfo];
                [self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:i] animated:YES];
            }
        }
}
4

3 に答える 3

2

1 ) APNS サーバーがプッシュ通知を受け入れたとしても、プッシュ通知が実際に配信されるという保証はありません。

2) サーバーに関する限り、プッシュ通知は起動して忘れます。APNS に送信した後、通知のステータスを確認する方法はありません。配達時間も、数秒から 30 分までさまざまです。

3)また、ユーザーのiPhoneは常にプッシュ通知を受信できない場合があります。必要なポートがブロックされているため、APNS への接続を許可しない WiFi ネットワーク上にある可能性がありますまたは、電話がオフになっている可能性があります。

4 ) APNS は、そのデバイスがオンラインに戻ったときに最後に受信した通知を配信しようとしますが、限られた時間しか試行しません。タイムアウトになると、プッシュ通知は永久に失われます!

于 2012-06-26T19:32:48.613 に答える
1
  1. APN メッセージで「有効期限」を 0 に設定していますか? これを 0 に設定すると、プッシュ メッセージは 1 回だけ試行されます。それ以外の場合、Apple は指定された時間までそれらを配信しようとする場合があります。

  2. もう 1 つの確認事項は、実際に本番環境でプッシュ メッセージを送信しようとしているデバイス ID のリストに、開発テストの実行からのデバイス ID が含まれていないことを完全に確認することです。1 つのデバイス ID に問題があると、Apple は SSL 接続を停止し、それ以上 APN メッセージを処理しません。

于 2012-06-29T14:48:29.280 に答える
1

次のコードを置き換えました。

deviceToken = [devToken retain];

    NSLog(@"Registered for APNS %@", deviceToken);

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

    NSMutableString *dev = [[NSMutableString alloc] init];

    NSRange r;
    r.length = 1;
    unsigned char c;

    for (int i = 0; i < [deviceToken length]; i++)
    {
        r.location = i;
        [deviceToken getBytes:&c range:r];

        if (c < 10) {
            [dev appendFormat:@"0%x", c];
        }
        else {
            [dev appendFormat:@"%x", c];
        }

    }

    [ud setObject:dev forKey:@"DeviceToken"];
    [ud synchronize];

これで:

[devToken retain];
    NSLog(@"~~~~devToken=%@",devToken); 
    NSString *dt = [[devToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
    dt = [dt stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    //     //DeviceToken = dt;
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    [def setObject:dt forKey:@"DeviceToken"];
    [def synchronize];

そして今はうまくいっています!!

問題は、一部のデバイスではデバイス トークンが正しく更新されなかったことでした。

みんなありがとう!!

于 2012-07-02T20:26:28.650 に答える