instanceID.GetToken()给出异常

时间:2016-05-30 11:52:51

标签: c# google-cloud-messaging xamarin.android xamarin.forms

以下代码用于GCM get token ...给出了异常。

protected override void OnHandleIntent(Intent intent)
{
    try
    {
        Log.Info("RegistrationIntentService", "Calling InstanceID.GetToken");
        lock (locker)
        {
            var instanceID = InstanceID.GetInstance(Application.Context);


            var token =  instanceID.GetToken(
                "<Project number>", GoogleCloudMessaging.InstanceIdScope, null);// exception occurred at this line 

            Log.Info("RegistrationIntentService", "GCM Registration Token: " + token);
            SendRegistrationToAppServer(token);
            Subscribe(token);
        }
    }
    catch (Exception e)
    {
        Log.Debug("RegistrationIntentService", "Failed to get a registration token");
        return;
    }
}

例外

  

Java.IO.IOException:SERVICE_NOT_AVAILABLE at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()   [0x0000c]

完全例外

  

{Java.IO.IOException:SERVICE_NOT_AVAILABLE at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()   [0x0000c] in   /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143   在Android.Runtime.JNIEnv.CallObjectMethod(IntPtr jobject,IntPtr   jmethod,Android.Runtime.JValue * parms)[0x00064] in   /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:195   在Android.Gms.Gcm.Iid.InstanceID.GetToken(System.String   authorizedEntity,System.String范围,Android.OS.Bundle extras)   [0x00096] in:0 at   LeaveApplication.Droid.RegistrationIntentService.OnHandleIntent   (Android.Content.Intent intent)[0x0003a] in   d:\工作区\ TEMP \ LeaveApplication \ LeaveApplication \ LeaveApplication \ LeaveApplication.Droid \ RegistrationIntentService.cs:36   --- com.google.android.gms.iid.zzc.zzb上的托管异常堆栈跟踪结束--- java.io.IOException:SERVICE_NOT_AVAILABLE(未知   来源:com.google.android.gms.iid.zzc.zza(未知来源)at   com.google.android.gms.iid.InstanceID.zzc(未知来源)at   com.google.android.gms.iid.InstanceID.getToken(未知来源)at   md54d5d90974a2844b8ac95dbb0c513d773.RegistrationIntentService.n_onHandleIntent(母语   方法)at   md54d5d90974a2844b8ac95dbb0c513d773.RegistrationIntentService.onHandleIntent(RegistrationIntentService.java:36)     在   android.app.IntentService $ ServiceHandler.handleMessage(IntentService.java:65)     在android.os.Handler.dispatchMessage(Handler.java:102)at   android.os.Looper.loop(Looper.java:135)at   android.os.HandlerThread.run(HandlerThread.java:61)}

我的android manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yourcompany.LeaveApplication" android:installLocation="auto"
          android:versionCode="1"
    android:versionName="1.0">
  <uses-sdk android:minSdkVersion="15" />
  <application android:label="XamarinLeaveApp"></application>
  <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="com.yourcompany.LeaveApplication.permission.C2D_MESSAGE" />
  <permission android:name="com.yourcompany.LeaveApplication.permission.C2D_MESSAGE"
              android:protectionLevel="signature" />
  <receiver android:name="com.google.android.gms.gcm.GcmReceiver"
               android:exported="true"
               android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
      <action android:name="com.google.android.c2dm.intent.RECEIVE" />
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
      <category android:name="com.yourcompany.LeaveApplication" />
    </intent-filter>
  </receiver>
</manifest>

1 个答案:

答案 0 :(得分:1)

SERVICE_NOT_AVAILABLE是库的有效错误:

  

设备无法读取响应,或者出现服务器错误。   应用程序应稍后使用指数退避重试请求   并重试(在每次后续失败时,在重试之前增加延迟)。

请参阅:https://developers.google.com/android/reference/com/google/android/gms/iid/InstanceID.html

当库因设备条件(通常无法连接/无法访问谷歌服务器)或其他服务器问题而无法获取令牌时,会发生此错误。
在这种情况下,您有责任实施重试逻辑。

注意:在Google I / O 2016上,我们发布了Firebase云消息传递(FCM)。
见:https://firebase.google.com/docs/cloud-messaging

引用网站:

  

这是GCM的新版本。它继承了可靠和可扩展的特性   GCM基础架构,以及新功能。请参阅常见问题以了解更多信息如果   您正在将消息传递集成到新的应用程序中,从FCM开始。 GCM用户   强烈建议升级到FCM,以便从中受益   今天和未来的新FCM功能。

新库的一大好处是我们现在自动处理getToken()的自动重试,因此您不必编写该逻辑。