2013-11-18 3 views
2

Я использую 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 

ответ

0

Аналогичная проблема с решением: GCM SERVICE_NOT_AVAILABLE on Android 2.2

Btw вы пытались использовать PushSharp? https://github.com/Redth/PushSharp

+0

PushSharp - сервер сбоку библиотека. Но я пытаюсь получить идентификатор регистрации устройства GCM на клиенте, а затем отправлю его на свой сервер и использовать в PushSharp :) –

+0

Нет, у PushSharp есть сервер и клиентская сторона. Проверьте этот пример: https://github.com/Redth/PushSharp/tree/master/PushSharp.Android/Gcm – Roosevelt

+0

Я не знаю раньше о кодах на стороне клиента. Спасибо! Я попробую его сегодня и опубликую мои результаты. –

Смежные вопросы