Я реализую синтаксический анализ в быстром проекте. Я использую 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)
}
Я обновление notificationID на запуск приложения, так что если пользователь входит в систему на втором устройстве, их идентификатор будет обновляться и уведомление было отправлено на новое устройство. Мы не поддерживаем отправку уведомлений нескольким устройствам на каждого пользователя. Любые предложения по поводу того, почему objectID равен нулю в первый раз или работать над тем, как захватить его в didbecomeactive или в другом месте? Мой клиент хочет этого, так как демографическое приложение - это пользователи, которые, вероятно, не будут активно убивать приложения, и поэтому идентификатор уведомления на моем бэкэнд остается нулевым. Есть ли обратный вызов при его получении? – user2363025
Просто обновил ответ, чтобы иметь блок завершения для сохранения/отладки ошибок. Я думаю, проблема заключается в том, что вы используете два разных сэйва в 'didRegisterForRemoteNotificationsWithDeviceToken'. Я уверен, что проблема в том, что objectId будет равен нулю, пока он не будет сохранен в Parse. Поскольку сохранение выполняется асинхронно в фоновом режиме, вы в настоящее время пытаетесь получить доступ к объектуInd установки, когда он еще не завершил сохранение – Russell
, это было мое мнение. Попробуй другой метод выше и отчитайся – user2363025