Как преобразовать NSString в строку в MonoTouch

Я пытаюсь внедрить push-уведомления для MonoTouch, но нигде не смог найти примеры этого. Моя проблема заключается в попытке прочитать идентификатор устройства в строку .NET.

Вывод ниже - это просто много вопросительных знаков, поэтому я делаю что-то не так.

Любая помощь будет принята с благодарностью!

    public override void RegisteredForRemoteNotifications (UIApplication application, NSData deviceToken)
    {
        Console.WriteLine("Converting device ID...");
        NSString s = NSString.FromData(deviceToken, NSStringEncoding.UTF8);
        Console.WriteLine("DEVICE ID IS: " + s);
        s = NSString.FromData(deviceToken, NSStringEncoding.ASCIIStringEncoding);
        Console.WriteLine("DEVICE ID IS: " + s);
         s = NSString.FromData(deviceToken, NSStringEncoding.Unicode);
        Console.WriteLine("DEVICE ID IS: " + s);


    }

person Christer Nordvik    schedule 12.12.2010    source источник


Ответы (3)



В MonoTouch есть оператор неявного преобразования.

Итак, вы просто делаете:

NSString s = NSString.FromData(deviceToken, NSStringEncoding.UTF8);
string csstring = s;
// done

В качестве альтернативы вы можете использовать метод ToString() NSString:

NSString s = NSString.FromData(deviceToken, NSStringEncoding.UTF8);
string csstring = s.ToString();

здесь соответствующая документация.

person Pablo Santa Cruz    schedule 12.12.2010
comment
Хм, все равно не дает мне идентификатор устройства. Я просто получаю DEVICE ID=????:?.v?I???????]??????›?l; если я использую кодировку ascii. UTF8 дает мне пустую строку. Так может быть, что-то не так с push-регистрацией? Это кажется странным, поскольку я получаю обратный вызов в RegisteredForRemoteNotifications. - person Christer Nordvik; 12.12.2010
comment
Это наверное другая проблема. Не проблема конвертации. В NSString вы получите значение, если напечатаете его? - person Pablo Santa Cruz; 12.12.2010
comment
Что вы получаете в качестве токена устройства? Это твоя проблема, я думаю. - person Pablo Santa Cruz; 12.12.2010
comment
Вот код, который я хотел написать в MonoTouch (посмотрите на первые 3-4 строки в методе didRegisterForRemoteNotificationsWithDeviceToken: bitbucket.org/urbanairship/push_sample/src/6a5ac0b371ef/APNS/ - person Christer Nordvik; 12.12.2010
comment
Извините, я разобрался! Спасибо за помощь! Мне просто нужно было base64 кодировать двоичные данные. Я думал, что они получили строку устройства непосредственно из двоичных данных, но они закодировали ее в base64. - person Christer Nordvik; 12.12.2010

Мне удалось реализовать это, и я использовал следующий код:

NSString newDeviceToken = new NSString(MonoTouch.ObjCRuntime.Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr(new MonoTouch.ObjCRuntime.Class("NSString").Handle, new MonoTouch.ObjCRuntime.Selector("stringWithFormat:").Handle, strFormat.Handle, deviceToken.Handle));
string token = newDeviceToken.ToString();

Это предоставит вам строку, которая читает

< 64characterlonghexstring >

Вы можете использовать регулярное выражение, чтобы избавиться от пробелов и символа «‹» «>» по мере необходимости.

Я нашел следующий проект очень полезным для обеспечения работы реализации push-уведомлений Monotouch: C# Служба push-уведомлений Apple. — предоставляет код на стороне клиента, а также код на стороне сервера.

person Luke    schedule 13.12.2010
comment
Спасибо, в точку! На самом деле я только что нашел то, что искал, и Кристиан Вейер написал статью на основе моего запроса. weblogs.thinktecture.com/cweyer/2010/12/ - person Christer Nordvik; 14.12.2010