GCM xamarin:注册

时间:2013-11-18 12:35:25

标签: xamarin.android mvvmcross

我正在使用xamarin组件商店的xamarin android 4.10.1和GooglePlayServices Rev. 12。它是mvvmcross应用程序,所以我有Core和Android项目。我需要在我的应用中支持推送通知。所以我从GooglePlayServices组件开始。我写这段代码:

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中使用此注册密钥。所以我开始注册任务方法:

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异常时,我也尝试与ManualResetEvent对象同步,但仍然有异常。

也许有人知道解决方案,如何从View(活动)将注册ID引入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

1 个答案:

答案 0 :(得分:0)

解决方案的类似问题:GCM SERVICE_NOT_AVAILABLE on Android 2.2

你尝试过使用PushSharp吗? https://github.com/Redth/PushSharp