iOS 使用 Azure 通知中心推送通知
iOS Push Notifications with Azure Notification Hub
我完全没有运气让推送通知在 Xamarin Forms 项目的 iOS 中工作。
在 AppDelegate.cs 中,我在 FinishedLaunching 覆盖中调用以下内容:
MSNotificationHub.Start("Endpoint=sb://[redacted].servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=[redacted]",
"[redacted]");
用户在应用生命周期中进一步登录后,我也用他们的用户标签注册用户如下:
public async Task UpdateTags(string token)
{
await Task.Run(() =>
{
try
{
// No point registering tags until the user has signed in and we have a device token
if (CurrentAccount == null)
{
Console.WriteLine($"UpdateTags cancelled: Account is null");
return;
}
var tag = $"user:{CurrentAccount.UserName}";
Console.WriteLine($"Registering tag: {tag}");
MSNotificationHub.AddTag(tag);
}
catch (Exception e)
{
Console.WriteLine($"Error registering tag: {e.ToString()}");
}
});
}
我已经正确配置了通知中心的苹果(APNS)设置,使用的是Token认证模式(对这四个字段进行了多次验证)。证书(签名身份)是“iOS Distribution”,标识符包与我在配置中的完全匹配(不使用通配符),密钥启用了 Apple Push Notifications 服务(APN),配置文件具有平台:iOS 和类型:App Store。
我将应用程序推送到 TestFlight,因为我无法访问物理 Mac(我们使用云 mac 进行开发)。当我在安装了应用程序的情况下从个人 iPhone 查看设备日志时,我 运行 看到以下内容:
<Notice>: Registered for push notifications with token: [redacted]
<Notice>: Registering tag: user:[redacted]
日志中根本没有“Error registering tag”或“UpdateTags cancelled”的实例,这告诉我方法调用 成功 无一例外。但是,当我尝试向 blank/empty 标签或我的测试用户的特定标签发送测试通知时,没有收到任何通知,消息仅显示“消息已成功发送,但没有匹配的目标."
此外,当我使用 var registrations = await hub.GetAllRegistrationsAsync(0);
提取所有注册时,我只看到我在 Android 方面成功测试的 FCM (Firebase/Android) 注册。
我完全不知所措并且碰壁了,因为没有抛出异常,而且似乎没有办法解决幕后发生的问题。
这也是我的第二次尝试 - 我使用了更复杂的 SBNotificationHub 实现并得到了相同的结果 - 没有例外,一切看起来都很好。
您可以尝试实现 MSInstallationLifecycleDelegate
接口,这将允许您检查并查看安装是否成功或失败地保存在后端。
// Set a listener for lifecycle management
MSNotificationHub.SetLifecycleDelegate(new InstallationLifecycleDelegate());
// Implementation of the lifecycle listener.
public class InstallationLifecycleDelegate : MSInstallationLifecycleDelegate
{
public InstallationLifecycleDelegate()
{
}
public override void DidFailToSaveInstallation(MSNotificationHub notificationHub, MSInstallation installation, NSError error)
{
Console.WriteLine($"Save installation failed with exception: {error.LocalizedDescription}");
}
public override void DidSaveInstallation(MSNotificationHub notificationHub, MSInstallation installation)
{
Console.WriteLine($"Installation successfully saved with Installation ID: {installation.InstallationId}");
}
}
感谢指向另一个问题的评论,我确定我需要做的就是确保我的标签注册 运行 在主 UI 线程上。我下面更新的代码正在运行:
public async Task UpdateTags(string token)
{
await Task.Run(() =>
{
Device.BeginInvokeOnMainThread(() =>
{
try
{
// No point registering tags until the user has signed in and we have a device token
if (CurrentAccount == null)
{
Console.WriteLine($"UpdateTags cancelled: Account: {Trico.OrbitalApp.App.CurrentAccount};");
return;
}
var tag = $"user:{CurrentAccount.UserName}";
Console.WriteLine($"Registering tag: {tag}");
MSNotificationHub.AddTag(tag);
}
catch (Exception e)
{
Console.WriteLine($"Error registering device: {e.ToString()}");
}
});
});
}
我完全没有运气让推送通知在 Xamarin Forms 项目的 iOS 中工作。
在 AppDelegate.cs 中,我在 FinishedLaunching 覆盖中调用以下内容:
MSNotificationHub.Start("Endpoint=sb://[redacted].servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=[redacted]",
"[redacted]");
用户在应用生命周期中进一步登录后,我也用他们的用户标签注册用户如下:
public async Task UpdateTags(string token)
{
await Task.Run(() =>
{
try
{
// No point registering tags until the user has signed in and we have a device token
if (CurrentAccount == null)
{
Console.WriteLine($"UpdateTags cancelled: Account is null");
return;
}
var tag = $"user:{CurrentAccount.UserName}";
Console.WriteLine($"Registering tag: {tag}");
MSNotificationHub.AddTag(tag);
}
catch (Exception e)
{
Console.WriteLine($"Error registering tag: {e.ToString()}");
}
});
}
我已经正确配置了通知中心的苹果(APNS)设置,使用的是Token认证模式(对这四个字段进行了多次验证)。证书(签名身份)是“iOS Distribution”,标识符包与我在配置中的完全匹配(不使用通配符),密钥启用了 Apple Push Notifications 服务(APN),配置文件具有平台:iOS 和类型:App Store。
我将应用程序推送到 TestFlight,因为我无法访问物理 Mac(我们使用云 mac 进行开发)。当我在安装了应用程序的情况下从个人 iPhone 查看设备日志时,我 运行 看到以下内容:
<Notice>: Registered for push notifications with token: [redacted]
<Notice>: Registering tag: user:[redacted]
日志中根本没有“Error registering tag”或“UpdateTags cancelled”的实例,这告诉我方法调用 成功 无一例外。但是,当我尝试向 blank/empty 标签或我的测试用户的特定标签发送测试通知时,没有收到任何通知,消息仅显示“消息已成功发送,但没有匹配的目标."
此外,当我使用 var registrations = await hub.GetAllRegistrationsAsync(0);
提取所有注册时,我只看到我在 Android 方面成功测试的 FCM (Firebase/Android) 注册。
我完全不知所措并且碰壁了,因为没有抛出异常,而且似乎没有办法解决幕后发生的问题。
这也是我的第二次尝试 - 我使用了更复杂的 SBNotificationHub 实现并得到了相同的结果 - 没有例外,一切看起来都很好。
您可以尝试实现 MSInstallationLifecycleDelegate
接口,这将允许您检查并查看安装是否成功或失败地保存在后端。
// Set a listener for lifecycle management
MSNotificationHub.SetLifecycleDelegate(new InstallationLifecycleDelegate());
// Implementation of the lifecycle listener.
public class InstallationLifecycleDelegate : MSInstallationLifecycleDelegate
{
public InstallationLifecycleDelegate()
{
}
public override void DidFailToSaveInstallation(MSNotificationHub notificationHub, MSInstallation installation, NSError error)
{
Console.WriteLine($"Save installation failed with exception: {error.LocalizedDescription}");
}
public override void DidSaveInstallation(MSNotificationHub notificationHub, MSInstallation installation)
{
Console.WriteLine($"Installation successfully saved with Installation ID: {installation.InstallationId}");
}
}
感谢指向另一个问题的评论,我确定我需要做的就是确保我的标签注册 运行 在主 UI 线程上。我下面更新的代码正在运行:
public async Task UpdateTags(string token)
{
await Task.Run(() =>
{
Device.BeginInvokeOnMainThread(() =>
{
try
{
// No point registering tags until the user has signed in and we have a device token
if (CurrentAccount == null)
{
Console.WriteLine($"UpdateTags cancelled: Account: {Trico.OrbitalApp.App.CurrentAccount};");
return;
}
var tag = $"user:{CurrentAccount.UserName}";
Console.WriteLine($"Registering tag: {tag}");
MSNotificationHub.AddTag(tag);
}
catch (Exception e)
{
Console.WriteLine($"Error registering device: {e.ToString()}");
}
});
});
}