deviceToken устройства IOS

Я использую Monotouch для Mac и выполнил шаги, чтобы получить сертификат профиля подготовки, позволяющий получать push-уведомления в процессе. У меня есть работающее приложение, и сейчас я экспериментирую с apns-sharp и moon-apns, но не могу понять, как получить токен моего устройства. Я надеюсь, что кто-то может предоставить мне подробные и простые шаги для достижения этой цели.


person John D    schedule 13.03.2012    source источник


Ответы (3)


В вашем методе FinishedLaunching зарегистрируйте приложение для удаленных уведомлений через объект UIApplication, который вы получаете в нем:

// Pass the UIRemoteNotificationType combinations you want
app.RegisterForRemoteNotificationTypes(UIRemoteNotificationType.Alert |
 UIRemoteNotificationType.Sound);

Затем в вашем классе AppDelegate переопределите метод RegisteredForRemoteNotifications:

public override void RegisteredForRemoteNotifications (UIApplication application, NSData deviceToken)
{
    // The device token
    byte[] token = deviceToken.ToArray();
}

Вы также должны переопределить метод FailedToRegisterForRemoteNotifications, чтобы обработать ошибку, если таковая имеется:

public override void FailedToRegisterForRemoteNotifications (UIApplication application, NSError error)
{
    // Do something with the error
}
person Dimitris Tavlikos    schedule 13.03.2012
comment
мне нужно пройти все эти шаги? ... Нет ли способа получить фактическое шестнадцатеричное значение идентификатора устройства? - person John D; 13.03.2012
comment
Нет, другого пути нет. Ваше приложение должно регистрироваться для получения удаленных уведомлений при каждом запуске. Если вы имеете в виду UDID, его получение на iOS 5+ приведет к отклонению вашего приложения. Кроме того, токен устройства для удаленных уведомлений отличается от UDID и зависит от вашего профиля подготовки, типов уведомлений и т. д. - person Dimitris Tavlikos; 13.03.2012

Начиная с iOS deviceToken изменился. Следующий код помог мне преобразовать deviceToken как NSData в строку.

string deviceTokenString;
if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
{
    deviceTokenString = BitConverter.ToString(deviceToken.ToArray()).Replace("-", string.Empty);
}
else
{
    deviceTokenString = Regex.Replace(deviceToken.ToString(), "[^0-9a-zA-Z]+", string.Empty);
}
person ProfNimrod    schedule 26.11.2019
comment
Это спасло меня от головной боли. Спасибо! - person JHawkZZ; 31.03.2020

Для меня это была только половина решения. Чтобы использовать DeviceToken с веб-сервера (в моем случае PHP), DeviceToken должен быть шестнадцатеричной строкой, используемой в коде PHP для запуска push-уведомлений (например, как показано здесь: [Использование PHP для отправки push-уведомлений iOS через APN

Однако объект NSdata не предлагает простого способа предоставления этой шестнадцатеричной строки.

Итак, мой обработчик успеха «RegisteredForRemoteNotifications» теперь:

        public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
    {
        // Get current device token
        var DeviceToken = Tools.ByteToHex(deviceToken.ToArray());
        string DeviceID = UIDevice.CurrentDevice.IdentifierForVendor.AsString();
        System.Console.WriteLine("### UserNotification Device Token = " + DeviceToken + ", DeviceID = " + DeviceID);

        // Get previous device token
        var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken");

        // Has the token changed?
        if (string.IsNullOrEmpty(oldDeviceToken) || !oldDeviceToken.Equals(DeviceToken))
        {
            //### todo: Populate POSTdata set
            //### todo: Send POSTdata to URL 

            // Save new device token
NSUserDefaults.StandardUserDefaults.SetString(DeviceToken, "PushDeviceToken");
            }
        }

И для преобразования байтов в шестнадцатеричные:

public static string ByteToHex(byte[] data)
{
    StringBuilder sb = new StringBuilder(data.Length * 2);
    foreach (byte b in data)
    {
        sb.AppendFormat("{0:x2}", b);
    }
    return sb.ToString();
}

Теперь вы можете использовать DeviceToken в PHP для создания отправки PushNotification.

person Kerry    schedule 22.10.2019