【发布时间】:2015-09-28 19:59:38
【问题描述】:
我一直在尝试创建一个应用程序,以便通过 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:。我做错了什么?
【问题讨论】:
-
我很惊讶
subscribe调用成功,因为缺少protocols(根据API 参考它是required)。您应该尝试SNS-MobileAnalytics-Sample,了解如何将 Amazon SNS 移动推送集成到您的应用程序中。作为单独的说明,您不应将 AWS 凭证嵌入您的应用程序中。此外,通常您应该从您的服务器发布推送通知以避免垃圾邮件。
标签: ios swift amazon-web-services push-notification amazon-sns