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()}");
                }
            });
        });
    }