2016-09-06 14 views
0

私のアプリがバックグラウンドのときにGCM通知を表示する必要があります。 iOSデバイスにNotificaitonメッセージを送信するためにGCMがバックグラウンドで動作しない - スウィフト

C#サーバーコード:

public string SendNotification(string apiKey, string token, string _postData) 
    { 
     try 
     { 

     string tickerText = "Desert Vessel"; 

     string SERVER_API_KEY = apiKey; 
     var SENDER_ID = "0000...."; 
     string regIds = string.Join("\",\"", token); 

     NotificationMessage nm = new NotificationMessage(); 
     nm.Title = tickerText; 
     nm.Message = _postData; 
     nm.ItemId = 1; 

     var value = new JavaScriptSerializer().Serialize(nm); 

     WebRequest tRequest; 
     tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send"); 
     tRequest.Method = "post"; 
     tRequest.ContentType = "application/json"; 
     tRequest.Headers.Add(string.Format("Authorization: key={0}", SERVER_API_KEY)); 

     tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID)); 

     string postData = "{\"collapse_key\":\"score_update\",\"priority\" : \"high\" ,\"time_to_live\":108,\"delay_while_idle\":true,\"data\": { \"message\" : " + value + ",\"time\": " + "\"" + System.DateTime.Now.ToString() + "\"},\"registration_ids\":[\"" + regIds + "\"]}"; 

     Byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
     tRequest.ContentLength = byteArray.Length; 

     Stream dataStream = tRequest.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 

     WebResponse tResponse = tRequest.GetResponse(); 

     dataStream = tResponse.GetResponseStream(); 

     StreamReader tReader = new StreamReader(dataStream); 

     String sResponseFromServer = tReader.ReadToEnd(); 

     tReader.Close(); 
     dataStream.Close(); 
     tResponse.Close(); 
     return sResponseFromServer; 
     } 
     catch (Exception exp) 
     { 
      return "error"; 
     } 
    } 

とスウィフトコード:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, GGLInstanceIDDelegate, GCMReceiverDelegate { 

    var window: UIWindow? 
    let core = Settings() 
    var connectedToGCM = false 
    var subscribedToTopic = false 
    var gcmSenderID: String? 
    var registrationToken: String? 
    var registrationOptions = [String: AnyObject]() 

    let registrationKey = "onRegistrationCompleted" 
    let messageKey = "onMessageReceived" 
    let subscriptionTopic = "/topics/global" 

    // [START register_for_remote_notifications] 
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: 
     [NSObject: AnyObject]?) -> Bool { 
      // [START_EXCLUDE] 
      // Configure the Google context: parses the GoogleService-Info.plist, and initializes 
      // the services that have entries in the file 
      var configureError:NSError? 
      GGLContext.sharedInstance().configureWithError(&configureError) 
      assert(configureError == nil, "Error configuring Google services: \(configureError)") 
      gcmSenderID = GGLContext.sharedInstance().configuration.gcmSenderID 
      // [END_EXCLUDE] 
      // Register for remote notifications 

      let settings: UIUserNotificationSettings = 
      UIUserNotificationSettings(forTypes: [UIUserNotificationType.Alert, .Badge, .Sound], categories: nil) 
      application.registerUserNotificationSettings(settings) 
      application.registerForRemoteNotifications() 


      // [END register_for_remote_notifications] 
      // [START start_gcm_service] 
      let gcmConfig = GCMConfig.defaultConfig() 
      gcmConfig.receiverDelegate = self 
      GCMService.sharedInstance().startWithConfig(gcmConfig) 
      // [END start_gcm_service] 
      return true 
    } 

    func subscribeToTopic() { 
     // If the app has a registration token and is connected to GCM, proceed to subscribe to the 
     // topic 
     if(registrationToken != nil && connectedToGCM) { 
      GCMPubSub.sharedInstance().subscribeWithToken(self.registrationToken, topic: subscriptionTopic, 
       options: nil, handler: {(error:NSError?) -> Void in 
        if let error = error { 
         // Treat the "already subscribed" error more gently 
         if error.code == 3001 { 
          print("Already subscribed to \(self.subscriptionTopic)") 
         } else { 
          print("Subscription failed: \(error.localizedDescription)"); 
         } 
        } else { 
         self.subscribedToTopic = true; 
         NSLog("Subscribed to \(self.subscriptionTopic)"); 
        } 
      }) 
     } 
    } 

    // [START connect_gcm_service] 
    func applicationDidBecomeActive(application: UIApplication) { 
     // Connect to the GCM server to receive non-APNS notifications 
     GCMService.sharedInstance().connectWithHandler({(error:NSError?) -> Void in 
      if let error = error { 
       print("Could not connect to GCM: \(error.localizedDescription)") 
      } else { 
       self.connectedToGCM = true 
       print("Connected to GCM") 
       // [START_EXCLUDE] 
       self.subscribeToTopic() 
       // [END_EXCLUDE] 
      } 
     }) 
    } 
    // [END connect_gcm_service] 

    // [START disconnect_gcm_service] 
    func applicationDidEnterBackground(application: UIApplication) { 
     GCMService.sharedInstance().disconnect() 
     // [START_EXCLUDE] 
     self.connectedToGCM = false 
     // [END_EXCLUDE] 
    } 
    // [END disconnect_gcm_service] 

    // [START receive_apns_token] 
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken 
     deviceToken: NSData) { 
      // [END receive_apns_token] 
      // [START get_gcm_reg_token] 
      // Create a config and set a delegate that implements the GGLInstaceIDDelegate protocol. 
      let instanceIDConfig = GGLInstanceIDConfig.defaultConfig() 
      instanceIDConfig.delegate = self 
      // Start the GGLInstanceID shared instance with that config and request a registration 
      // token to enable reception of notifications 
      GGLInstanceID.sharedInstance().startWithConfig(instanceIDConfig) 
      registrationOptions = [kGGLInstanceIDRegisterAPNSOption:deviceToken, 
       kGGLInstanceIDAPNSServerTypeSandboxOption:true] 
      GGLInstanceID.sharedInstance().tokenWithAuthorizedEntity(gcmSenderID, 
       scope: kGGLInstanceIDScopeGCM, options: registrationOptions, handler: registrationHandler) 
      // [END get_gcm_reg_token] 
    } 

    // [START receive_apns_token_error] 
    func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError 
     error: NSError) { 
      print("Registration for remote notification failed with error: \(error.localizedDescription)") 

      // [END receive_apns_token_error] 
      let userInfo = ["error": error.localizedDescription] 
      NSNotificationCenter.defaultCenter().postNotificationName(
       registrationKey, object: nil, userInfo: userInfo) 
    } 

    // [START ack_message_reception] 
    func application(application: UIApplication, 
     didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 
      print("Notification received: \(userInfo)") 
      if let info = userInfo as? Dictionary<String,AnyObject> { 
       if let aps = info["aps"] as? Dictionary<String, String> { 
        var arr = aps["alert"]!.characters.split{$0 == "-"}.map(String.init) 
        core.setCookie("Trucking", value: arr[0]) 
        core.setCookie("Company", value: arr[1]) 
       } 
      } 

      // This works only if the app started the GCM service 
      GCMService.sharedInstance().appDidReceiveMessage(userInfo); 
      // Handle the received message 
      // [START_EXCLUDE] 
      NSNotificationCenter.defaultCenter().postNotificationName(messageKey, object: nil, 
       userInfo: userInfo) 
      // [END_EXCLUDE] 
    } 

    func application(application: UIApplication, 
     didReceiveRemoteNotification userInfo: [NSObject : AnyObject], 
     fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void) { 
      print("Notification received: \(userInfo)") 
      // This works only if the app started the GCM service 
      GCMService.sharedInstance().appDidReceiveMessage(userInfo); 
      // Handle the received message 
      // Invoke the completion handler passing the appropriate UIBackgroundFetchResult value 
      // [START_EXCLUDE] 
      NSNotificationCenter.defaultCenter().postNotificationName(messageKey, object: nil, 
       userInfo: userInfo) 
      handler(UIBackgroundFetchResult.NoData); 
      // [END_EXCLUDE] 
    } 
    // [END ack_message_reception] 

    func registrationHandler(registrationToken: String!, error: NSError!) { 
     if (registrationToken != nil) { 
      self.registrationToken = registrationToken 
      print("Registration Token: \(registrationToken)") 
      self.subscribeToTopic() 
      let userInfo = ["registrationToken": registrationToken] 
      NSNotificationCenter.defaultCenter().postNotificationName(
       self.registrationKey, object: nil, userInfo: userInfo) 
      core.setCookie("token",value: registrationToken) 
     } else { 
      print("Registration to GCM failed with error: \(error.localizedDescription)") 
      let userInfo = ["error": error.localizedDescription] 
      NSNotificationCenter.defaultCenter().postNotificationName(
       self.registrationKey, object: nil, userInfo: userInfo) 
      core.setCookie("token",value: "error") 
     } 
    } 

    // [START on_token_refresh] 
    func onTokenRefresh() { 
     // A rotation of the registration tokens is happening, so the app needs to request a new token. 
     print("The GCM registration token needs to be changed.") 
     GGLInstanceID.sharedInstance().tokenWithAuthorizedEntity(gcmSenderID, 
      scope: kGGLInstanceIDScopeGCM, options: registrationOptions, handler: registrationHandler) 
    } 
    // [END on_token_refresh] 

    // [START upstream_callbacks] 
    func willSendDataMessageWithID(messageID: String!, error: NSError!) { 
     if (error != nil) { 
      // Failed to send the message. 
     } else { 
      // Will send message, you can save the messageID to track the message 
     } 
    } 

    func didSendDataMessageWithID(messageID: String!) { 
     // Did successfully send message identified by messageID 
    } 
    // [END upstream_callbacks] 

    func didDeleteMessagesOnServer() { 
     // Some messages sent to this device were deleted on the GCM server before reception, likely 
     // because the TTL expired. The client should notify the app server of this, so that the app 
     // server can resend those messages. 
    } 

} 

問題とどのようにそれを修正するがどこにあるか、私は知りませんでした。

注:メッセージはiosデバイスに届きましたが、通知では表示されませんでした デバッグ画面で表示されました。 i 'はcontent_available:true' を追加すると、C#でのHTTP Postにサーバリターン "内部エラー" を

+0

デバッグ画面では正確に何を確認できましたか? – Michael

+0

私はアプリが動作しているときにWeb APIから送信したというメッセージを見ました。しかし、アプリはバックグラウンドで表示されませんでした。 –

答えて

0
I changed this line and everything was OK. 

文字列POSTDATA = "{\" 通知\ ":{\" ボディ\ ":" +値+ \ "badge \":\ "1 \"、\ "sound \":\ "default \"}、\ "to \":\ "" + regIds + "\"、content_available \ ":true 、\ "priority \":\ "high \"} ";

関連する問題