Я добавил токен устройства в качестве тегов.Токены Android требуют двух тегов, потому что их длина превышает максимальную длину тега.
public static string FormatDeviceTokenTag(int index, string token) => $"DEVICE_TOKEN{index}:{token}";
public static IList<string> GetDeviceTokenTags(string token)
{
const int MaxTagLength = 120;
var tag0 = FormatDeviceTokenTag(0, token);
var tag0Clipped = tag0.Substring(0, Math.Min(tag0.Length, MaxTagLength));
var tags = new List<string> { tag0Clipped };
if (tag0.Length > MaxTagLength)
{
var tag1 = FormatDeviceTokenTag(1, tag0.Substring(MaxTagLength));
if (tag1.Length > MaxTagLength)
{
throw new ArgumentException("Token too long");
}
tags.Add(tag1);
}
return tags;
}
Затем, чтобы найти совпадающие токены ...
async Task<IList<RegistrationDescription>> GetExistingRegistrations(string token, EnumMobileDeviceType deviceType)
{
var tags = GetDeviceTokenTags(token);
var registrations = await CreateClient().GetRegistrationsByTagAsync(tags.First(), 10000);
var registrations2 = registrations.Where(r => tags.Count > 1 ?
r.Tags.Contains(tags[1]) :
!r.Tags.Any(t =>
t.StartsWith(FormatDeviceTokenTag(1, string.Empty), StringComparison.Ordinal)));
registrations2 = registrations2.Where(r =>
(deviceType == EnumMobileDeviceType.Apple && r is AppleTemplateRegistrationDescription) ||
(deviceType == EnumMobileDeviceType.Droid && r is GcmTemplateRegistrationDescription));
return registrations2.ToList();
}
Какая громоздкая работа.Я что-то упустил в API?