通过AWS SNS发送和接收推送通知

用户26830

我一直在尝试创建一个应用程序,以便通过AWS SNS发送和接收推送通知。我是该API的新手,找不到可靠的教程。这是我为了发送和接收通知而想出的功能:

func subscribe(deviceTokenString : String)
{
    let credentialsProvider : AWSStaticCredentialsProvider = AWSStaticCredentialsProvider(accessKey: AWSAccessKey, secretKey: AWSSecretKey)
    let defaultServiceConfiguration : AWSServiceConfiguration = AWSServiceConfiguration(region: DefaultServiceRegionType, credentialsProvider: credentialsProvider)
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration

    let sns = AWSSNS.defaultSNS()

    let subscribeInput = AWSSNSSubscribeInput()

    subscribeInput.topicArn = SNSTopicARN

    sns.subscribe(subscribeInput).continueWithBlock
    {
        (task) -> AnyObject! in
        if task.error != nil
        {
            print("Subscribed successfully")
            let confirmSubscription = AWSSNSConfirmSubscriptionInput()
            confirmSubscription.topicArn = SNSTopicARN
            confirmSubscription.token = deviceTokenString
            sns.confirmSubscription(confirmSubscription).continueWithBlock
            {
                (task) -> AnyObject! in
                if task.error != nil
                {
                    print("Confirmed subscription")
                    self.sendMessage()
                }
                else
                {
                    print("Subscription confirmation failed with error: \(task.error)")
                }
                return nil
            }
        }
        else
        {
            print("Error while subscribing: \(task.error)")
        }
        return nil
    }

}

func sendMessage()
{
    let sns = AWSSNS.defaultSNS()
    let request = AWSSNSPublishInput()
    request.messageStructure = "json"

    let dict = ["default": "Hello World!", "APNS_SANDBOX": "{\"aps\":{\"alert\": \"HELLO WORLD!\",\"sound\":\"default\", \"badge\":\"1\"} }"]

    do
    {
        let jsonData = try NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted)
        request.message = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as! String
        request.topicArn = SNSTopicARN
        sns.publish(request).continueWithBlock
        {
            (task) -> AnyObject! in
            if task.error != nil
            {
                print("Error sending mesage: \(task.error)")
            }
            else
            {
                print("Success sending message")
            }
            return nil
        }
    }
    catch
    {
        print("Error on json serialization: \(error)")
    }

}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)
{
    let deviceTokenString = "\(deviceToken)"
        .stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString:"<>"))
        .stringByReplacingOccurrencesOfString(" ", withString: "")
    print("deviceTokenString: \(deviceTokenString)")
    subscribe(deviceTokenString)
}

一切似乎都运行良好,我在控制台上获得了“成功订阅”,“已确认订阅”和“已发送消息”日志,但application:didReceiveRemoteNotificationuserInfo:从未调用过。我究竟做错了什么?

用户26830

我发现我遗漏了一些要点。这是一段完美的代码。

func subscribe(token : String, completionHandler : ((NSError?) -> ())? = nil)
{
    let credentialsProvider : AWSStaticCredentialsProvider = AWSStaticCredentialsProvider(accessKey: AWSAccessKeySend, secretKey: AWSSecretKeySend)
    let defaultServiceConfiguration : AWSServiceConfiguration = AWSServiceConfiguration(region: DefaultServiceRegionType, credentialsProvider: credentialsProvider)

    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration

    let sns = AWSSNS.defaultSNS()
    let createPlatformEndpointInput = AWSSNSCreatePlatformEndpointInput()
    createPlatformEndpointInput.token = token
    createPlatformEndpointInput.platformApplicationArn = SNSPlatformApplicationArn

    sns.createPlatformEndpoint(createPlatformEndpointInput).continueWithBlock
    {
        (task) -> AnyObject! in
        if task.error != nil
        {
            print("Error creating platform endpoint: \(task.error)")
            completionHandler?(task.error)
            return nil
        }
        let result = task.result as! AWSSNSCreateEndpointResponse
        let subscribeInput = AWSSNSSubscribeInput()
        subscribeInput.topicArn = SNSTopicARN
        subscribeInput.endpoint = result.endpointArn
        print("Endpoint arn: \(result.endpointArn)")
        subscribeInput.protocols = "application"
        sns.subscribe(subscribeInput).continueWithBlock
        {
            (task) -> AnyObject! in
            if task.error != nil
            {
                completionHandler?(task.error)
                print("Error subscribing: \(task.error)")
                return nil
            }
            print("Subscribed succesfully")
            let subscriptionConfirmInput = AWSSNSConfirmSubscriptionInput()
            subscriptionConfirmInput.token = token
            subscriptionConfirmInput.topicArn = SNSTopicARN
            sns.confirmSubscription(subscriptionConfirmInput).continueWithBlock
            {
                (task) -> AnyObject! in
                if task.error != nil
                {
                    print("Confirmed subscription")
                }
                completionHandler?(task.error)
                return nil
            }
            return nil
        }
        return nil
    }
}

func sendMessage(message : String, type : String = "alert", sound : String = "default", badges : Int = 1, completionHandler : ((NSError?) -> ())? = nil)
{
    let credentialsProvider : AWSStaticCredentialsProvider = AWSStaticCredentialsProvider(accessKey: AWSAccessKeySend, secretKey: AWSSecretKeySend)
    let defaultServiceConfiguration : AWSServiceConfiguration = AWSServiceConfiguration(region: DefaultServiceRegionType, credentialsProvider: credentialsProvider)
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration


    let sns = AWSSNS.defaultSNS()
    let request = AWSSNSPublishInput()
    request.messageStructure = "json"

    let dict = ["default": message, "APNS_SANDBOX": "{\"aps\":{\"\(type)\": \"\(message)\",\"sound\":\"\(sound)\", \"badge\":\"\(badges)\"} }"]

    do
    {
        let jsonData = try NSJSONSerialization.dataWithJSONObject(dict, options: NSJSONWritingOptions.PrettyPrinted)
        request.message = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as! String
        request.topicArn = SNSTopicARN

        sns.publish(request).continueWithBlock
        {
            (task) -> AnyObject! in
            if task.error != nil
            {
                print("Error sending mesage: \(task.error)")
            }
            else
            {
                print("Success sending message")
            }
            completionHandler?(task.error)
            return nil
        }
    }
    catch
    {
        print("Error on json serialization: \(error)")
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用lambda和aws sns发送推送通知给单个设备

通过AWS SES发送后,“传递”和“退回” SNS通知

通过Amazon SNS以JSON格式发送iOS推送通知

推送通知(iOS)未通过PHP代码接收/发送

如何在Laravel 5.1中使用AWS SNS将推送通知从Web发送到iOS和android设备?

如何使用AWS SNS在Laravel中使用Android和iOS设备中的默认声音发送推送通知?

未收到推送通知-AWS SNS和Expo

通过AWS Pinpoint向指定用户发送推送通知

如何通过Amazon SNS推送通知在有效负载中发送额外参数

您可以从Amazon AWS中的lambda函数发送SNS推送通知吗?

使用AWS SNS将推送通知发送到特定的APNS令牌

尝试使用Ionic App发送推送通知时,从AWS SNS返回的Endpoint Disabled异常

通过Rails App接收Amazon SNS通知

如何通过PHP将AWS SQS / SNS用作推送通知队列来执行繁重的处理任务?

使用 AWS Lambda 接收 youtube 推送通知

AWS SNS,向 slack 发送“连续”通知

如何从AWS SNS获取发送的通知记录?

无法让AWS Lambda通过AWS SNS发送短信

Firefox推送通知-通过curl发送数据

通过PHP发送iOS推送通知

通过FCM从PushSharp发送推送通知

使用AWS Pinpoint从iOS发送推送通知

如何使用C#接收AWS SNS通知?

审核AWS CloudWatch和SNS通知

AWS SNS通知未通过HTTPS到达服务器

如何使用AWS SNS通过ExAws发送短信

为什么SNS无法通过AWS CONSOLE发送短信?

如何通过 AWS Step Functions 在 AWS SNS 通知中传递 AWS Lambda 错误?

通过AWS Lambda发送文件