使用Parse在某些里程内发送推送通知

时间:2014-09-01 12:36:04

标签: ios ios7 push-notification parse-platform

我已使用Parse发送和接收推送通知。我已经仔细地按照教程并成功实现了它。 现在,我需要在用户选择的特定里程内向用户发送通知。

例如:如果用户选择 100 ,则应将通知发送给已安装我的应用的所有用户,并且距离用户100英里(用户是广播通知)当前位置。

我在Parse的网站上找到了相同的代码片段,但如果我使用下面代码中注释的第二个查询,我没有收到任何通知 如果我使用第二个查询,则不会调用方法didReceiveRemoteNotification只有当我使用第一个查询时,我才能成功收到通知。

我对Push通知和Parse更新。让我知道,如果我错过了一些愚蠢的东西,以便我可以解决它。我已经在很长一段时间内解决这个问题所以请各位帮忙。

PFGeoPoint *myLoc = [PFGeoPoint geoPointWithLatitude:myLatitude longitude:myLongitude];

        PFQuery *userQuery = [PFUser query];
        [userQuery whereKey:@"location"
               nearGeoPoint:myLoc
                withinMiles:100];

        PFQuery *myQuery = [PFInstallation query];
        [myQuery whereKey:@"deviceType" equalTo:@"ios"];
        //[myQuery whereKey:@"user" matchesQuery:userQuery];


        NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:
                              txt.text, @"alert",
                              @"1", @"badge",
                              @"sound.caf", @"sound",
                              nil];


        PFPush *push = [[PFPush alloc] init];
        [push setQuery:myQuery];
        [push setData:data];
        [push sendPushInBackground];

1 个答案:

答案 0 :(得分:5)

我在其中一个项目中做过同样的事情,希望以下代码和步骤对您有所帮助。

首先在您的Appdelgate's方法didRegisterForRemoteNotificationsWithDeviceToken中填写以下代码段

[PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) {
        if (!error) {
            NSLog(@"User is currently at %f, %f", geoPoint.latitude, geoPoint.longitude);
            PFInstallation *currentInstallation = [PFInstallation currentInstallation];
            [currentInstallation setDeviceTokenFromData:deviceToken];
            currentInstallation[@"location"] = geoPoint;
            [currentInstallation saveInBackground];
        } else { 
            NSLog(@"%@", error); 
            return; 
        } 
    }];

并将以下代码段放在您要向其他人发送通知的位置

PFInstallation *installation = [PFInstallation currentInstallation];
    NSLog(@"%@",installation);
    [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error)
     {
         if (!error)
         {
             PFQuery *userQuery = [PFInstallation query];
             [userQuery whereKey:@"location"
                    nearGeoPoint:geoPoint
                     withinMiles:100.00];
             NSString *str_CurrentDeviceToken = [NSString stringWithFormat:@"%@",[installation objectForKey:@"deviceToken"]];
             [userQuery whereKey:@"deviceToken" notEqualTo:str_CurrentDeviceToken];
             NSLog(@"%@",userQuery);


             NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:
                                   @"Hello", @"alert",
                                   @"1", @"badge",
                                   @"", @"sound",
                                   nil];


             PFPush *push = [[PFPush alloc] init];
             [push setQuery:userQuery];
             [push setData:data];
             [push sendPushInBackground];
         }
         else
         {
             NSLog(@"%@", error);
             return;
         }
     }];