设备 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);
我正在使用的文档:
- Push.RegisterAsync:
https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.mobileservices.push.registerasync.aspx
- GcmRegistration:我找不到任何相关文档 class
- 注册(GcmRegistration 的基础 class):
https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.mobileservices.registration.aspx
- 注意:Registration参数不是deviceId而是channelUri
- Push.RegisterNativeAsync:
https://msdn.microsoft.com/en-us/library/dn643553.aspx
- 注意:RegisterNativeAsync的参数不是deviceId而是channelUri
我的问题很简单:
deviceId 应该是什么?我如何获得它?
以上所有文档均适用于 Winodws 通用应用程序,不适用于 Mono 上的 Xamarin 应用程序。
在写这个问题的过程中,我找到了关于"Get Started with Notification Hubs"的文章:
- Xamarin iOS - http://azure.microsoft.com/en-us/documentation/articles/partner-xamarin-notification-hubs-ios-get-started/
- Xamarin Android - http://azure.microsoft.com/en-us/documentation/articles/partner-xamarin-notification-hubs-android-get-started/
这些是我应该使用的示例吗?它们看起来很旧,而且 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();
}
我们正在使用 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);
我正在使用的文档:
- Push.RegisterAsync: https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.mobileservices.push.registerasync.aspx
- GcmRegistration:我找不到任何相关文档 class
- 注册(GcmRegistration 的基础 class):
https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.mobileservices.registration.aspx
- 注意:Registration参数不是deviceId而是channelUri
- Push.RegisterNativeAsync:
https://msdn.microsoft.com/en-us/library/dn643553.aspx
- 注意:RegisterNativeAsync的参数不是deviceId而是channelUri
我的问题很简单: deviceId 应该是什么?我如何获得它?
以上所有文档均适用于 Winodws 通用应用程序,不适用于 Mono 上的 Xamarin 应用程序。
在写这个问题的过程中,我找到了关于"Get Started with Notification Hubs"的文章:
- Xamarin iOS - http://azure.microsoft.com/en-us/documentation/articles/partner-xamarin-notification-hubs-ios-get-started/
- Xamarin Android - http://azure.microsoft.com/en-us/documentation/articles/partner-xamarin-notification-hubs-android-get-started/
这些是我应该使用的示例吗?它们看起来很旧,而且 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();
}