2015-07-10 266 views
4

我一直在嘗試創建應用程序,以便通過AWS SNS發送和接收推送通知。我是新手,無法找到可靠的教程。下面是我,以便想出的功能來發送和接收通知:通過AWS SNS發送和接收推送通知

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:永遠不會被調用。我究竟做錯了什麼?

+0

我很驚訝的是,'subscribe'調用成功,因爲'protocols'丟失(這是[要求](http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSSNSSubscribeInput.html )根據API參考)。您應該試試[SNS-MobileAnalytics-Sample](https://github.com/awslabs/aws-sdk-ios-samples/tree/master/SNS-MobileAnalytics-Sample/Swift),以瞭解如何整合Amazon SNS移動推送在您的應用程序。作爲單獨的說明,您不應將您的AWS憑證嵌入到您的應用程序中。另外,一般而言,您應該從服務器發佈推送通知以避免垃圾郵件。 –

回答

5

我發現我錯過了一些觀點。這是一段完美的代碼。

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

}