Xamarin.ios通过Azure推送通知推送通知

applepushoverview.

让我们看一下我们如何启用Xamarin.ios i.e. xamarin.forms应用程序以接收推送通知。我正在使用这件事 蔚蓝的通知枢纽 在后端,简化了后端的推送服务集成。

要求

要在iOS上实现推送通知,您需要有:

  1. Apple开发人员帐户
  2. iOS设备
  3. 您可以访问的Apple计算机
  4. 有效的Azure帐户

您需要一个iOS设备,因为推送通知无法在模拟器中进行测试。

此外,此博客帖子将假设您使用Visual Studio作为开发环境。

建立后端

在后端,我们必须执行以下步骤:

  1. 生成证书
  2. 注册您的应用程序的推送通知
  3. 在Azure上配置通知门户

##

生成证书

要使用Apple设备发送推送通知,我们需要进行推送证书。证书是用的 钥匙扣访问 tool.

在OSX上,您可以使用您可以在右上方找到的Finder搜索所有程序,并具有放大镜的符号。

generateCertificate.

选择 Keychain访问,证书助手**,然后**请求证书颁发机构的证书

证书

输入您的用户电子邮件和通用名称。并确保您选择保存到磁盘。选择继续后,请使您的CERT是一个好名称并将其保存到桌面。

注册您的应用程序的推送通知

##

登录到 Apple Developer Portal.,去 应用程序ID,选择您的应用程序,然后单击 编辑.创建证书

选择 创建证书...... (现在让我们选择 开发SSL证书,点击到 继续 而且 选择文件… 选择并上载先前生成的证书。

configurepushnotificaiton.

最后一步下载生成证书并双击将其导入钥匙扣。对于Azure,我们需要将证书导出到P12文件中。开放 钥匙扣访问。在下面 钥匙扣**选择**登录,然后是 类别 选择 钥匙,现在找到PushCertifiaccte(展开它并导出私钥)右键单击 出口,**选择一个好名字,选择**。P12 格式化,最后单击“保存”。

确保将要用于测试推送通知的IOS设备被添加到应用程序中。

在Azure上配置通知门户

现在让我们首先设置后端,以便我们可以发送推送通知消息,这需要有效 Azure.帐户。登录到 Azure. 并执行以下步骤:

  1. 点击 +新
  2. 点击 应用服务, 然后 服务巴士 然后选择 通知枢纽
  3. 输入名称,选择该区域,如果您尚未完成此选项已输入您的命名空间(如果您已创建名称空间,则不会出现此选项)。

Azure.messagehub.

创建通知中心后,我们必须配置它与Windows Phone Silverlight一起使用。选择您的通知中心(命名空间),您将在此处找到 服务巴士 选项卡,然后选择刚刚创建的通知中心。

在下面 Apple通知设置 选择上传。根据导出时输入的内容上传P12文件和密码。在下面 模式 选择 沙箱 对于开发证书或 生产 用于生产证书。这取决于您上传使用的证书。

设置客户端

设置后端后我们现在可以将我们的应用连接到推送服务,因为我们将使用Azure进行推送服务,我们需要添加 Azure. Messaging 您可以通过右键单击iOS项目来下载的组件然后选择 获取更多组件, 搜索 Azure. Messaging 并将组件添加到项目中。

注册Notificaitons.

现在让我们开始将我们的应用程序接线到推送服务,这一切都完成了 appdelegate.cs..

首先更新 填写() method as follows:

public override bool FinishedLaunching(UIApplication app, NSDictionary options){    Forms.Init();    //Register for remote notifications iOS 8 and higher    if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))    {        var settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Sound |                                   UIUserNotificationType.Alert | UIUserNotificationType.Badge, null);        UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);        UIApplication.SharedApplication.RegisterForRemoteNotifications();    }    //Register for remote notifications iOS 7 and bellow    else    {        const UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert                                                           | UIRemoteNotificationType.Badge                                                           | UIRemoteNotificationType.Sound;        UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);    }    LoadApplication(new App());    return base.FinishedLaunching(app, options);}

请注意,注册已更改为iOS 8,具体取决于您计划的IOS版本,您可能只需要上面的注册之一。如果您不使用Xamarin.Forms应用程序,它应该如下所示:

public override bool FinishedLaunching(UIApplication app, NSDictionary options){    //Register for remote notifications iOS 8 and higher    if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))    {        var settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Sound |                                   UIUserNotificationType.Alert | UIUserNotificationType.Badge, null);        UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);        UIApplication.SharedApplication.RegisterForRemoteNotifications();    }    //Register for remote notifications iOS 7 and lower    else    {        const UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert                                                           | UIRemoteNotificationType.Badge                                                           | UIRemoteNotificationType.Sound;        UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);    }    return true;}

要完成注册,我们在内部添加以下成员变量 appdelegate.cs.

private SBNotificationHub Hub { get; set; }

并覆盖 注册了疑问() method as follows:

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken){    const string notificationHubConnectionString = "Endpoint=sb://mallibone.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;[email protected]";    const string notificationHubName = "mallibone";    Hub = new SBNotificationHub(notificationHubConnectionString, notificationHubName);    Hub.UnregisterAllAsync(deviceToken, (error) =>    {        if (error != null)        {            Console.WriteLine("Error calling Unregister: {0}", error.ToString());            return;        }        var deviceId = Convert.ToBase64String(deviceToken.ToArray());        var tag = Guid.NewGuid().ToString();        var tags = new List<string> { tag };        Hub.RegisterNativeAsync(deviceToken, new NSSet(tags.ToArray()), (errorCallback) =>        {            if (errorCallback != null)            {                Console.WriteLine("RegisterNativeAsync error: " + errorCallback.ToString());                return;            }        });    });}

接收推送通知

现在让我们的设备首次收到消息时振动。因此,我们覆盖了 recaptRemotenotification. 在(如您可能已经猜到的那样) appdelegate.cs.:

public override void recaptRemotenotification.(UIApplication application, NSDictionary notificationData){    SystemSound.Vibrate.PlaySystemSound();}

发送消息

在Server Explorer中,双击您的通知中心,将打开一个窗口,允许您发送推送通知并检查您的设备注册并检查VS :))。现在在类型选择 Apple(APNS)**然后**默认值。因为现在我们不必改变邮件,因此您的应用程序是否成功启动并且在您旁边嗡嗡作响,只需点击 发送.

接收背景中的通知

在许多应用中,您要以不同的方式处理从推送通知唤醒,然后当用户使用该应用时通知到达时。当从推送通知中唤醒时,我们希望直接导航到行动源自来自的位置,当应用程序运行时,我们可能只是想通知用户通过振动设备发生的事情。

为了从推送通知中唤醒我们必须添加的 反射释放 method as follows:

public override void recaptRemotenotification.(UIApplication application, NSDictionary notificationData){    if (application.ApplicationState == UIApplicationState.Inactive        || application.ApplicationState == UIApplicationState.Background)    {        // Handle notification on wake        return;    }    SystemSound.Vibrate.PlaySystemSound();}

在通知中启动应用程序

为了使事情有趣的唤醒和启动必须在iOS上以不同的方式处理,以确保唤醒和启动之间的一致行为我们必须修改 填写 method as follows:

public override bool FinishedLaunching(UIApplication app, NSDictionary options){    global::Xamarin.Forms.Forms.Init();    if (options != null && options.ContainsKey(UIApplication.LaunchOptionsRemoteNotificationKey))    {        var notificationData = options[UIApplication.LaunchOptionsRemoteNotificationKey] as NSDictionary;        // process notification data    }    LoadApplication(new App());    return base.FinishedLaunching(app, options);}

如果您使用的是Xamarin表格,请确保您致电 LoadApplication. 处理通知后。

向通知添加参数

添加参数是将应用程序特定信息传递给不适用于用户的应用程序的好方法。可以轻松地将参数添加到消息中,以此示例中所示扩展消息:

{"aps":{"alert":"Notification Hub test notification"},"parameterOne":"SomeIdentifier","parameterTwo":"1234"}

解析的参数 recaptRemotenotification:

public override void recaptRemotenotification.(UIApplication application, NSDictionary notificationData){    if (application.ApplicationState == UIApplicationState.Inactive        || application.ApplicationState == UIApplicationState.Background)    {        // Handle notification on wake        return;    }    var parameeterOne = notificationData["parameterOne"].ToString();    var parameterTwo = Convert.ToInt32(notificationData["parameterOne"].ToString());    // Send message i.e. process push notification    SystemSound.Vibrate.PlaySystemSound();}

和在 填写 method:

public override bool FinishedLaunching(UIApplication app, NSDictionary options){    global::Xamarin.Forms.Forms.Init();    if (options != null && options.ContainsKey(UIApplication.LaunchOptionsRemoteNotificationKey))    {        var notificationData = options[UIApplication.LaunchOptionsRemoteNotificationKey] as NSDictionary;        var parameeterOne = notificationData["parameterOne"].ToString();        var parameterTwo = Convert.ToInt32(notificationData["parameterOne"].ToString());    // Send message i.e. process push notification        // process notification data    }    LoadApplication(new App());    return base.FinishedLaunching(app, options);}

结论

添加Xamarin.ios或Xamarin.forms应用程序的推送通知是可能的,并且使用Azure,因为后端将允许您为其他平台简化集成,如 Windows Phone or Android.

Technorati标签: Xamarin.ios.,xamarin.forms。蔚蓝的通知枢纽,Xamarin.ios通知,Xamarin.Forms Notificaitons.

Updated: