Я использую xamarin android 4.10.1 и GooglePlayServices Rev. 12 из магазина компонентов xamarin. Это приложение mvvmcross, поэтому у меня есть проекты Core и Android. Мне нужна поддержка уведомлений о push в моем приложении. Поэтому я начинаю с компонента GooglePlayServices. Я пишу этот код:GCM xamarin: Регистрация
var gcm = GoogleCloudMessaging.GetInstance(this);
var key = gcm.Register(new[] { "senderId" });
и это не работает, я кладезь, что мне нужно, чтобы запустить его на асинхронном потоке, одно решение я нашел здесь: http://forums.xamarin.com/discussion/8420/error-calling-googlecloudmessaging-register
ThreadPool.QueueUserWorkItem(o =>
{
var gcm = GoogleCloudMessaging.GetInstance(this);
var key = gcm.Register(new[] { Settings.GmcSenderId });
});
Этот код работает, мой сообщение об обработке служебного дескриптора, но мне нужен этот регистрационный ключ в моей mvvmcross ViewModel. Поэтому я начинаю регистрироваться подход Task:
var task = Task.Factory.Startnew(() =>
{
var gcm = GoogleCloudMessaging.GetInstance(this);
return gcm.Register(new[] { Settings.GmcSenderId });
});
var key = task.Result; // wait for result
// key is needed to execute code here
// ViewModel.Key = key;
Но каждый раз, когда я получаю SERVICE_NOT_AVAILABLE Exception, и я пытаюсь синхронизировать с объектом ManualResetEvent, но все же есть исключения.
Возможно, какое-то известное решение, как довести регистрационный идентификатор до класса ViewModel из представления (активности). Или, может быть, у вас есть какой-то пример с mvvmcross и получения регистрации Id в модели представления ...
Мой код с Задача:
public string Register(string senderId)
{
var task = Task.Factory.StartNew(() =>
{
var context = Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity;
var gcm = GoogleCloudMessaging.GetInstance(context);
return gcm.Register(senderId);
});
return task.Result; // exception here!
}
Подробное исключение:
InnerException {Java.IO.IOException: Exception of type 'Java.IO.IOException' was thrown.
at Android.Runtime.JNIEnv.CallObjectMethod (IntPtr jobject, IntPtr jmethod, Android.Runtime.JValue[] parms) [0x00064] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:194
at Android.Gms.Gcm.GoogleCloudMessaging.Register (System.String[] p0) [0x00000] in <filename unknown>:0
at Fiocx.Android.Code.NotificationService+<>c__DisplayClass1.<Register>b__0() [0x00013] in d:\ASUS\Work\Programming\.NET\Fiocx.CloudApp\mobile_src\Fiocx.Mobile\Fiocx.Android\Code\NotificationService.cs:33
at System.Threading.Tasks.TaskActionInvoker+FuncInvoke`1[System.String].Invoke (System.Threading.Tasks.Task owner, System.Object state, System.Threading.Tasks.Task context) [0x00000] in <filename unknown>:0
at System.Threading.Tasks.Task.InnerInvoke() [0x00000] in <filename unknown>:0
at System.Threading.Tasks.Task.ThreadStart() [0x00000] in <filename unknown>:0
--- End of managed exception stack trace ---
java.io.IOException: SERVICE_NOT_AVAILABLE
at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source)
at dalvik.system.NativeStart.run(Native Method)
} Java.IO.IOException
PushSharp - сервер сбоку библиотека. Но я пытаюсь получить идентификатор регистрации устройства GCM на клиенте, а затем отправлю его на свой сервер и использовать в PushSharp :) –
Нет, у PushSharp есть сервер и клиентская сторона. Проверьте этот пример: https://github.com/Redth/PushSharp/tree/master/PushSharp.Android/Gcm – Roosevelt
Я не знаю раньше о кодах на стороне клиента. Спасибо! Я попробую его сегодня и опубликую мои результаты. –