Токен устройства в push-уведомлении

Я хочу отправить push-уведомление только определенным пользователям.

Из того, что я прошел в документах Apple. Код для регистрации для push-уведомлений:

- (void)applicationDidFinishLaunching:(UIApplication *)app {
   // other setup tasks here....
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}

// Delegation methods
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    const void *devTokenBytes = [devToken bytes];
    self.registered = YES;
    [self sendProviderDeviceToken:devTokenBytes]; // custom method
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    NSLog(@"Error in registration. Error: %@", err);
}

В методе appdidRegisterForRemoteNotif.. я вижу только байты devToken, созданные и отправленные на сервер.. но как я могу определить, какой токен устройства принадлежит какому пользователю. Итак, если имя моего устройства — iPhone Шубханка. Как я могу отправить информацию о том, что это мой iPhone, а это токен моего устройства.


person Shubhank    schedule 04.02.2012    source источник


Ответы (3)


обычно вы не обновляете токен apns на сервере в самом методе делегата. вы сохраняете его и обновляете позже, когда идентифицируете пользователя.

Вы можете сделать это следующим образом:

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

const unsigned *tokenBytes = [deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                      ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                      ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                      ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
[[MyModel sharedModel] setApnsToken:hexToken];

}

при этом вы сохранили токен apns в объекте модели (MyModel). И позже, когда вы идентифицируете своего пользователя (путем входа/регистрации или любого другого метода)

вы можете вызвать этот метод

[self sendProvidedDeviceToken: [[MyModel sharedModel] apnsToken] forUserWithId: userId];  //Custom method

Таким образом, вы связали токен устройства с пользователем. Надеюсь это поможет!

person Manish Ahuja    schedule 04.02.2012
comment
хорошо, спасибо, что решили то, что я искал... но теперь у меня важный вопрос... меняются ли байты токена каждый раз, когда приложение запускается??.. - person Shubhank; 04.02.2012
comment
Хотя токен не всегда будет меняться, всегда рекомендуется обновлять токен каждый раз при запуске приложения. Пожалуйста, проголосуйте/примите ответ, если он вам помог. - person Manish Ahuja; 04.02.2012
comment
я буду .. но я хочу знать .это меня сейчас сбивает с толку .. скажем, токен устройства тот же .. тогда устройство будет повторно зарегистрировано на моем сервере .. поэтому мне нужно разработать механизм, который работает поверх? ..или если токен изменится..то что я буду делать со старым именем устройства?? - person Shubhank; 04.02.2012
comment
да, вам придется написать механизм перезаписи. потому что вы не можете гарантировать, что токен не изменится. Кроме того, пользователь может войти в систему с одного устройства, а затем с другого устройства, в этом случае вам обязательно нужно будет обновить токен apns для этого пользователя. - person Manish Ahuja; 04.02.2012
comment
Просто прочитайте комментарий @JohanKarlsson. Токены меняются, например. при изменении версии iOS или время от времени. Поэтому рекомендуется проверять, что токен остается одним и тем же при каждом запуске приложения. - person lnjuanj; 31.01.2014

Вам необходимо отправить имя устройства при регистрации в вашем пользовательском методе. Код должен выглядеть примерно так, как показано ниже. Вы можете отправить любую информацию, подходящую для вашего контекста, например, имя пользователя, если приложение использует какое-то имя пользователя. Вам решать, какую информацию отправлять на ваш сервер, который устанавливает соединение между токеном и устройством.

// Delegation methods
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    const void *devTokenBytes = [devToken bytes];
    self.registered = YES;
    [self sendProviderDeviceToken:devTokenBytes deviceName:[[UIDevice currentDevice] name]]; // custom method
}
person Johan Karlsson    schedule 04.02.2012
comment
скажем, я хочу, чтобы пользователь ввел определенное имя для своего устройства, поэтому я представляю текстовое поле, в котором он пишет ABC. но я полагаю, что приложение appdidRegisterForRemoteNotif уже будет вызвано, пока это не произойдет.. так что могу ли я снова зарегистрироваться для получения push-уведомлений? - person Shubhank; 04.02.2012
comment
Перед регистрацией устройства лучше подождать, пока пользователь введет имя. В моем текущем приложении я жду, чтобы выполнить регистрацию, пока пользователь не войдет в систему. Нет ничего, что требовало бы от вас регистрации при запуске. - person Johan Karlsson; 04.02.2012
comment
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; это вызывается при запуске приложения ... поэтому я считаю, что idRegisterForRemoteNotificati также будет вызываться до того, как я смогу показать своему пользователю текстовое поле .... поэтому я полагаю, что вы говорите, что я могу вызвать [self sendProvider: Userinput] позже ... но как сервер узнает, что это имя подходит для этого devTokenBytes - person Shubhank; 04.02.2012
comment
Вы отправляете свой токен и имя пользователя в одном и том же вызове на сервер. Вы помещаете их в базу данных. Всякий раз, когда вы хотите отправить сообщение определенному пользователю, вы ищете соответствующий токен. - person Johan Karlsson; 04.02.2012

Вы сами можете отправлять любую информацию, которая вам нужна, в вашу собственную службу push-уведомлений.

Но важный момент: push-токен не является токеном устройства (UDID). Push-токены уникальны для каждого приложения, которое их запрашивает, и могут меняться и меняются. Если вы хотите получить имя устройства в дополнение к этому, вы можете вызвать [[UIDevice currentDevice] name] и опубликовать его на том, что вы используете для хранения своих push-токенов.

person lxt    schedule 04.02.2012
comment
скажем, я хочу, чтобы пользователь ввел определенное имя для своего устройства, поэтому я представляю текстовое поле, в котором он пишет ABC. но я полагаю, что приложение appdidRegisterForRemoteNotif уже будет вызвано, пока это не произойдет.. так что могу ли я снова зарегистрироваться для получения push-уведомлений? - person Shubhank; 04.02.2012
comment
Нет — вам нужно будет сохранить свой push-токен, а затем отправить имя устройства в серверную службу позже, после того, как вы его получите. - person lxt; 04.02.2012
comment
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; это вызывается при запуске приложения ... поэтому я считаю, что idRegisterForRemoteNotificati также будет вызываться до того, как я смогу показать своему пользователю текстовое поле .... поэтому я полагаю, что вы говорите, что я могу вызвать [self sendProvider: Userinput] позже ... но как сервер узнает, что это имя подходит для этого devTokenBytes - person Shubhank; 04.02.2012