Я использую Monotouch для Mac и выполнил шаги, чтобы получить сертификат профиля подготовки, позволяющий получать push-уведомления в процессе. У меня есть работающее приложение, и сейчас я экспериментирую с apns-sharp и moon-apns, но не могу понять, как получить токен моего устройства. Я надеюсь, что кто-то может предоставить мне подробные и простые шаги для достижения этой цели.
deviceToken устройства IOS
Ответы (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
}
Начиная с 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);
}
Для меня это была только половина решения. Чтобы использовать 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.