设备 ID 在 Xamarin Android 中的 Azure 推送通知是什么意思?如何获得?

What does Device Id mean Azure Push Notifications in Xamarin Android? How to get it?

我们正在使用 Azure 移动服务将通知推送到 Xamarin Android 和 Xamarin iOS 以及 Windows 通用应用程序。 Windows Universal App 有大量关于我们需要的文档,尽管我们还没有机会实现它。但是,Xamarin Android 和 iOS 都缺少有关推送通知的所有文档。如果你去 http://azure.microsoft.com/en-us/documentation/services/mobile-services/ and select Xamarin Android or Xamarin iOS and .NET Backend there are zero links for documentation around these APIs. After digging around a ton yesterday I found this: http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-xamarin-android-get-started-push/ and http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-xamarin-ios-get-started-push/ 两者最后一次更新是在去年九月。文档承诺会在 5 个多月前更新。

当我将 Microsoft 的 Xamarin 组件用于 Azure 移动服务时:http://components.xamarin.com/view/azure-mobile-services/ 我能够启动 MobileServiceClient 和 运行,但不能启动推送通知。

API:

Push pushManager = MobileService.GetPush();
string deviceId = "what is this???";
//Option 1:
pushManager.RegisterNativeAsync(deviceId);
//Option 2:
GcmRegistration googleNotificationRegistration = new GcmRegistration(deviceId);
pushManager.RegisterAsync(googleNotificationRegistration);

我正在使用的文档:

我的问题很简单: deviceId 应该是什么?我如何获得它?

以上所有文档均适用于 Winodws 通用应用程序,不适用于 Mono 上的 Xamarin 应用程序。

在写这个问题的过程中,我找到了关于"Get Started with Notification Hubs"的文章:

这些是我应该使用的示例吗?它们看起来很旧,而且 Android 只字未提 Azure 移动服务。我什至不应该为 Android 使用 Azure 移动服务 Xamarin 组件吗?

tl;dr

deviceId 应该只是 GCMRegistrationId.


我查看了组件 DLL 和 Android SDK 实现的源代码。

首先,让我们看看你的选项1选项2后面场景。基本上两者最终都完成了创建 GcmRegistration 并将其传递给内部 RegistrationManager.

的相同工作
    public Task RegisterAsync (Registration registration)
    {
        if (registration == null) {
            throw new ArgumentNullException ("registration");
        }
        if (string.IsNullOrWhiteSpace (registration.PushHandle)) {
            throw new ArgumentNullException ("registration.deviceId");
        }
        return this.RegistrationManager.RegisterAsync (registration);
    }

    public Task RegisterNativeAsync (string deviceId, IEnumerable<string> tags)
    {
        if (string.IsNullOrWhiteSpace (deviceId)) {
            throw new ArgumentNullException ("deviceId");
        }
        GcmRegistration registration = new GcmRegistration (deviceId, tags);
        return this.RegistrationManager.RegisterAsync (registration);
    }

Then,我能找到的涉及 Registration.PushHandle(即你传递的 deviceId)的 API 调用之一是如下

    public async Task<IEnumerable<Registration>> ListRegistrationsAsync (string deviceId)
    {
        MobileServiceHttpResponse mobileServiceHttpResponse = await this.client.HttpClient.RequestAsync (HttpMethod.Get, string.Format ("/push/registrations?deviceId={0}&platform={1}", new object[] {
            Uri.EscapeUriString (deviceId),
            Uri.EscapeUriString (Platform.Instance.PushUtility.GetPlatform ())
        }), this.client.CurrentUser, null, true, null, MobileServiceFeatures.None);
        return JsonConvert.DeserializeObject<IEnumerable<Registration>> (mobileServiceHttpResponse.Content, new JsonConverter[] {
            new RegistrationConverter ()
        });
    }

然后我切换到 Android 移动服务 SDK 来寻找类似的代码以找到一些提示。遗憾的是,它在 android 中被发现名为 pnsHandle,但仍然没有提示它是什么。

    /**
     * Registers the client for native notifications with the specified tags
     * @param pnsHandle PNS specific identifier
     * @param tags  Tags to use in the registration
     * @return  The created registration
     * @throws Exception
     */
    public Registration register(String pnsHandle, String... tags) throws Exception {
        if (isNullOrWhiteSpace(pnsHandle)) {
            throw new IllegalArgumentException("pnsHandle");
        }

        Registration registration = PnsSpecificRegistrationFactory.getInstance().createNativeRegistration(mNotificationHubPath);
        registration.setPNSHandle(pnsHandle);
        registration.setName(Registration.DEFAULT_REGISTRATION_NAME);
        registration.addTags(tags);

        return registerInternal(registration);
    }

最后,我猜下面来自 http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-android-get-started-push/#update-app 的示例代码应该调用相同的 API 现在解释一切,即 deviceId只是 GCMRegistrationId.

    @Override
    public void onRegistered(Context context,  final String gcmRegistrationId) {
        super.onRegistered(context, gcmRegistrationId);

        new AsyncTask<Void, Void, Void>() {

            protected Void doInBackground(Void... params) {
                try {
                    ToDoActivity.mClient.getPush().register(gcmRegistrationId, null);
                    return null;
                }
                catch(Exception e) { 
                    // handle error             
                }
                return null;            
            }
        }.execute();
    }