2015-09-28 72 views
1

我想在我的iOS應用中實現GCM。一切似乎工作正常,該應用程序連接到GCM並獲得註冊ID回來。如果我使用Postman向該regid發送通知,它會起作用,並且我會收到Google的成功響應。但是,無論我嘗試什麼,通知都不會顯示在設備上。iOS GCM通知發送,但不顯示

的後一封郵件我使用的GCM服務器是

{ 
    "to" : "RegID", 
    "content_available" : true, 
    "notification" : { 
     "body" : "Test Body", 
     "title" : "Test Title" 
    } 
} 

這給了我回應:

{ 
    "multicast_id": 6594175386712804014, 
    "success": 1, 
    "failure": 0, 
    "canonical_ids": 0, 
    "results": [ 
     { 
      "message_id": "0:1443445858075083%c4cfa24dc4cfa24d" 
     } 
    ] 
} 

這使我相信有一些錯誤的代碼在我的應用。下面我粘貼了所有相關的代碼。我已經編寫了3次代碼沒有成功,首先遵循教程並對其進行編輯以適合我的應用程序,第二次從教程中複製代碼,第三次從Github庫中獲取示例應用程序並複製所有內容與GCM相關。

的AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    var connectedToGCM = false 
    var gcmSenderID: String? 
    var registrationToken: String? 
    var registrationOptions = [String: AnyObject]() 
    let defaults = NSUserDefaults.standardUserDefaults() 

    let registrationKey = "onRegistrationCompleted" 
    let messageKey = "onMessageReceived" 
    let notification = "isNotificationEnabled" 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Google Cloud Messaging 
     var configureError:NSError? 
     GGLContext.sharedInstance().configureWithError(&configureError) 
     assert(configureError == nil, "Error configuring Google services: \(configureError)") 
     gcmSenderID = GGLContext.sharedInstance().configuration.gcmSenderID 

     var types: UIUserNotificationType = UIUserNotificationType.Badge | 
      UIUserNotificationType.Alert | 
      UIUserNotificationType.Sound 
     var settings: UIUserNotificationSettings = 
     UIUserNotificationSettings(forTypes: types, categories: nil) 
     application.registerUserNotificationSettings(settings) 
     application.registerForRemoteNotifications() 

     var gcmConfig = GCMConfig.defaultConfig() 
     GCMService.sharedInstance().startWithConfig(gcmConfig) 

     return true 
    } 

    func applicationDidBecomeActive(application: UIApplication) {    
     GCMService.sharedInstance().connectWithHandler({ 
      (NSError error) -> Void in 
      if error != nil { 
       println("Could not connect to GCM: \(error.localizedDescription)") 
      } else { 
       self.connectedToGCM = true 
       println("Connected to GCM") 
       // ... 
      } 
     }) 

    } 

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken 
     deviceToken: NSData) { 
      println(deviceToken) 
      // [END receice_apns_token] 
      // [START get_gcm_reg_token] 
      // Create a config and set a delegate that implements the GGLInstaceIDDelegate protocol. 
      var instanceIDConfig = GGLInstanceIDConfig.defaultConfig() 
      // 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] 
    } 

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

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


    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 
     println("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) 
    } 

如果有人問過類似的問題,讓我知道,我沒能找到一個適當的描述我的情況。

在此先感謝!

+0

您的HTTP請求看起來不錯。但是,您的實施與[Google示例項目](https://github.com/googlesamples/google-services/blob/master/ios/gcm/GcmExampleSwift/ViewController.swift)之間有幾處不同。您應該嘗試複製並粘貼該示例項目中的所有行,或者下載示例項目。 – ztan

+0

你的鏈接中究竟有什麼需要注意顯示通知?看起來主要是UI代碼。根據我從Google教程中瞭解的情況,Appdelegate中的代碼應該足以顯示簡單的通知? – Dan

+0

我從來沒有想過,蘋果會讓你使用IOS上不是APNS的推送通知。 – Nanoc

回答

3

您尚未實施適當的通知回調。您需要實現

func application(_ application: UIApplication, 
    didReceiveRemoteNotification userInfo: [NSObject : AnyObject], 
    fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 

    // Do something with userInfo 
    // call fetchCompletionHandler with the appropriate UIBackgroundFetchResult 
} 

無聲推送通知(即,那些與content-available標誌)致電上述UIApplicationDelegate方法,而不是application:didReceiveRemoteNotification:

此外,請確保您已將remote-notification值添加到您的Info.plist中的UIBackgroundModes

+0

你是上帝,這解決了我的問題。有沒有辦法使用fetchCompletionHandler來更新UITableView? – Dan

+0

在調用'fetchCompletionHandler'之前,你可以做任何你想要的更新。處理程序僅用於通知iOS您已完成您想要執行的任何更新。 – evanescent