-1

ユーザーにプッシュ通知を許可するよう求める iOS アプリを開発しているときに、この疑問が頭に浮かびました。ユーザーが「はい」と答えると、そのデバイスの「プッシュ ID」が Web サーバーに送信され、データベース テーブルに保存されます。彼にメッセージを送信するたびに、この ID を使用して Apple サービスと通信し、実際に彼のデバイスにメッセージを送信します。停止する場合は、iOS 設定ページからアプリの通知のみを選択的に無効にすることができます。

この操作が完了しても何も受信しないため、サーバーには通知されません。メッセージが配信されたと考えて、Apple にメッセージを送信し続けます。

私の質問:ユーザーが設定から特定のアプリの通知を無効にしたときに、デバイスはAppleに何かを伝えますか(この場合:「プッシュ」されたくないユーザーをスキップして帯域幅を節約するために、それについて知ることができますかそれともiOSは、ユーザーが受け入れてから無効にしたアプリのプッシュ通知を単に拒否(非表示?)しますか?

最後のシナリオが当てはまる場合、デバイスの寿命の間にユーザーが多くのアプリをインストールすると、リモートで受信されてローカルで無視されるプッシュ通知の数が増えるため、バッテリーの寿命が短くなると考えられます (...古いアプリをアンインストールしても??)

4

2 に答える 2

-2

次のような条件付きで実行できます。

AppDelegate.m 内

#pragma mark PUSH NOTIFICATION

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)token
{
    NSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
    // Set the defaults to disabled unless we find otherwise...
    NSString *pushBadge = @"disabled";
    NSString *pushAlert = @"disabled";
    NSString *pushSound = @"disabled";

    if(rntypes == UIRemoteNotificationTypeBadge)
    {
        pushBadge = @"enabled";
    }
    else if(rntypes == UIRemoteNotificationTypeAlert)
    {
        pushAlert = @"enabled";
    }
    else if(rntypes == UIRemoteNotificationTypeSound)
    {
        pushSound = @"enabled";
    }
    else if(rntypes == ( UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert))
    {
        pushBadge = @"enabled";
        pushAlert = @"enabled";
    }
    else if(rntypes == ( UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound))
    {
        pushBadge = @"enabled";
        pushSound = @"enabled";
    }
    else if(rntypes == ( UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound))
    {
        pushAlert = @"enabled";
        pushSound = @"enabled";
    }
    else if(rntypes == ( UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound))
    {
        pushBadge = @"enabled";
        pushAlert = @"enabled";
        pushSound = @"enabled";
    }

    NSLog(@"PUSH SOUND %@",pushBadge);
    NSLog(@"PUSH ALERT %@",pushAlert);
    NSLog(@"PUSH SOUND %@",pushSound);

    NSString *deviceToken = [[[[token description]
                               stringByReplacingOccurrencesOfString:@"<"withString:@""]
                              stringByReplacingOccurrencesOfString:@">" withString:@""]
                             stringByReplacingOccurrencesOfString: @" " withString: @""];

    NSLog(@"%d bytes", [token length]);
    NSLog(@"device token = %@", deviceToken);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    NSString *str1 = [NSString stringWithFormat: @"Error: %@", err];
    NSLog(@"%@",str1);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    for (id key in userInfo)
    {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }

    NSLog(@"remote notification: %@",[userInfo description]);
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];

    NSString *alert = [apsInfo objectForKey:@"alert"];
    NSLog(@"Received Push Alert: %@", alert);

    NSString *sound = [apsInfo objectForKey:@"sound"];
    NSLog(@"Received Push Sound: %@", sound);

    NSString *badge = [apsInfo objectForKey:@"badge"];
    NSLog(@"Received Push Badge: %@", badge);
    application.applicationIconBadgeNumber = [[apsInfo objectForKey:@"badge"] integerValue];

    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Notification" message:alert delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
    [alertView release];
}

そして、これを didFinishLaunchingWithOptions に入れます:

 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

そして、あなたの通知と一緒に音を送らないでください!!!

于 2013-07-19T07:25:53.867 に答える