2015-09-21 2 views
0

Я реализую синтаксический анализ в быстром проекте. Я использую objectid устройства как уникальный идентификатор для отправки уведомлений. Я беру это значение и сохраняю его в своем db для каждого пользователя.object id nil first time every time swift parse

меня реализованы следующие методы:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
     println("get in here every time?") 
     let installation = PFInstallation.currentInstallation() 
     installation.setDeviceTokenFromData(deviceToken) 

     installation.saveInBackground() 

     if installation.objectId != nil { 
      installation.setObject(installation.objectId!, forKey: "userName") 
      updateNotificationIDWebServiceCall(installation.objectId!) 
     } 
     else{ 
      println("object id was nil. Device token was: \(deviceToken).") 
      //JLToast.makeText("object id was nil. Device token was: \(deviceToken).").show() 
     } 
     installation.saveInBackground() 
    } 

Я успешно попасть в этот метод запуска приложений, но мой идентификатор объекта всегда ноль, то первое время после установки приложения.

Если пользователь убил приложение и перезапустил его, объект-объект больше не равен нулю, и я могу обновить свой сервер с правильным идентификатором для каждого пользователя, но проблема связана с людьми, которые помещают приложение в фоновом режиме и даже не знаю, как убить приложение.

Как я могу обойти это? Могу ли я добавить код в файл didBecomeActive? Я не мог найти обратный вызов для метода saveInBackground.

Также здесь мои didFinishLaunchingWithOptions:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     Prefs.notificationToShow = true 

     // Override point for customization after application launch. 
     //UIApplication.sharedApplication().applicationIconBadgeNumber = 0 

     if (PFInstallation.currentInstallation().badge != 0) { 
      PFInstallation.currentInstallation().badge = 0 
      PFInstallation.currentInstallation().saveInBackground() 
     } 
     Parse.setApplicationId("xxx", 
      clientKey: "yyy") 

     // Register for Push Notitications 
     if application.applicationState != UIApplicationState.Background { 
      // Track an app open here if we launch with a push, unless 
      // "content_available" was used to trigger a background push (introduced in iOS 7). 
      // In that case, we skip tracking here to avoid double counting the app-open. 

      let preBackgroundPush = !application.respondsToSelector("backgroundRefreshStatus") 
      let oldPushHandlerOnly = !self.respondsToSelector("application:didReceiveRemoteNotification:fetchCompletionHandler:") 
      var pushPayload = false 
      if let options = launchOptions { 
       pushPayload = options[UIApplicationLaunchOptionsRemoteNotificationKey] != nil 
      } 
      if (preBackgroundPush || oldPushHandlerOnly || pushPayload) { 
       PFAnalytics.trackAppOpenedWithLaunchOptions(launchOptions) 
      } 
     } 
     if application.respondsToSelector("registerUserNotificationSettings:") { 
      let userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound 
      let settings = UIUserNotificationSettings(forTypes: userNotificationTypes, categories: nil) 
      application.registerUserNotificationSettings(settings) 
      application.registerForRemoteNotifications() 
     } else { 
      let types = UIUserNotificationType.Badge | UIUserNotificationType.Alert | UIUserNotificationType.Sound 
      application.registerForRemoteNotifications() 
     } 

     NSThread.sleepForTimeInterval(1); 
     UIApplication.sharedApplication().statusBarHidden = true 
     self.window?.makeKeyAndVisible() 
     Fabric.with([Twitter(), Crashlytics()]) 

     return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) 
} 

ответ

1

Я не знаю, почему ObjectId объекта установки равна нулю, однако у меня есть альтернативный метод, который может представлять интерес для Вас.

Вместо того, чтобы сохранять объектInd установки пользователю для уникального идентификатора, подумайте о сохранении указателя на текущего пользователя в каждой установке. Каждое устройство получит свой собственный объект установки, и возможно, что у одного пользователя может быть много устройств.

Вам необходимо будет отправить push-уведомления всем своим устройствам, но в соответствии с вашим текущим дизайном каждый пользователь ограничен одним устройством.

Добавляя указатель пользователя к каждому объекту установки, вы сможете запрашивать и создавать наборы пользователей для отправки уведомлений.

Возможно, также стоит добавить код отладки, чтобы убедиться, что Parse сохраняет установки без ошибок. Меняйте didRegisterForRemoteNotificationsWithDeviceToken иметь следующее:

installation.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in 
    if (success) { 
     println("success - didRegisterForRemoteNotificationsWithDeviceToken") 
    } else { 
     // Log details of the failure 
     println("failure - didRegisterForRemoteNotificationsWithDeviceToken") 
     println("Error: \(error!) \(error!.userInfo!)") 
    } 
} 
+0

Я обновление notificationID на запуск приложения, так что если пользователь входит в систему на втором устройстве, их идентификатор будет обновляться и уведомление было отправлено на новое устройство. Мы не поддерживаем отправку уведомлений нескольким устройствам на каждого пользователя. Любые предложения по поводу того, почему objectID равен нулю в первый раз или работать над тем, как захватить его в didbecomeactive или в другом месте? Мой клиент хочет этого, так как демографическое приложение - это пользователи, которые, вероятно, не будут активно убивать приложения, и поэтому идентификатор уведомления на моем бэкэнд остается нулевым. Есть ли обратный вызов при его получении? – user2363025

+0

Просто обновил ответ, чтобы иметь блок завершения для сохранения/отладки ошибок. Я думаю, проблема заключается в том, что вы используете два разных сэйва в 'didRegisterForRemoteNotificationsWithDeviceToken'. Я уверен, что проблема в том, что objectId будет равен нулю, пока он не будет сохранен в Parse. Поскольку сохранение выполняется асинхронно в фоновом режиме, вы в настоящее время пытаетесь получить доступ к объектуInd установки, когда он еще не завершил сохранение – Russell

+0

, это было мое мнение. Попробуй другой метод выше и отчитайся – user2363025