2016-05-22 8 views
1

は私のコードです:SWIFT:CloudKitアプリから通知が届きませんか?ここ

@IBAction func sendSweet(sender: AnyObject) { 

    //delegate method 

    let newSweet = CKRecord(recordType: "Extra1") 
    newSweet["content"] = textField.text 

    let publicData = CKContainer.defaultContainer().publicCloudDatabase 
    publicData.saveRecord(newSweet, completionHandler: { (record:CKRecord?, error:NSError?) -> Void in 
     if error == nil { 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       self.tableView.beginUpdates() 
       self.sweets.insert(newSweet, atIndex: 0) 
       let indexPath = NSIndexPath(forRow: 0, inSection: 0) 
       self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Top) 
       self.tableView.endUpdates() 
       self.textField.text = "" 
       self.textField.resignFirstResponder() 



      }) 


     }}) 
    // Put the CloudKit private database in a constants 
    let privateDatabase = CKContainer.defaultContainer().publicCloudDatabase 

    // Create subscription and set three of its properties (an id, a predicate, and options) 
    let friendsSubscription = CKSubscription(recordType: "Extra1", 
     predicate: NSPredicate(format: "TRUEPREDICATE"), 
     subscriptionID: "Extra1", 
     options: .FiresOnRecordCreation) 

    // Create a notification and set two of its properties (alertBody and shouldBadge) 
    let notificationInfo = CKNotificationInfo() 
    notificationInfo.alertBody = "New message in Lms Chat" 
    notificationInfo.shouldBadge = false 

    // Attach the notification to the subscription 
    friendsSubscription.notificationInfo = notificationInfo 

    // Save the subscription in the private database 
    privateDatabase.saveSubscription(friendsSubscription) {recordReturned, error in 
     // On the main thread, display an error/success message in the textView 
     if error != nil { 
      NSOperationQueue.mainQueue().addOperationWithBlock { 
       self.textField.text = "Cloud error\n\(error!.localizedDescription)" 
      } 
     } else { 
      NSOperationQueue.mainQueue().addOperationWithBlock { 
       self.textField.text = "" 
      } 
     } 
    } 

} 
func textFieldShouldEndEditing(textField: UITextField!) -> Bool { //delegate method 
    return false 
} 

func textFieldShouldReturn(textField: UITextField!) -> Bool { //delegate method 
    textField.resignFirstResponder() 

    return true 

} 

人々がメッセージお互いことができますが、私はまた、彼らは通知を受け取るしたいので、それは、メッセージングアプリです。これは、通知のためのコードであり、私はまた、アプリケーションのデリゲートで通知のためのいくつかのコードを持っている:

import UIKit 
    import CloudKit 

    @UIApplicationMain 
    class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 

    UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings) 

    UIApplication.sharedApplication().registerForRemoteNotifications() 

    return true 
} 


func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 
    let cloudKitNotification = CKNotification(fromRemoteNotificationDictionary: userInfo as! [String:NSObject]) 

    if cloudKitNotification.notificationType == CKNotificationType.Query { 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      NSNotificationCenter.defaultCenter().postNotificationName("performReload", object: nil) 
     }) 

    } 

} 

func resetBadge() { 
    let badgeReset = CKModifyBadgeOperation(badgeValue: 0) 
    badgeReset.modifyBadgeCompletionBlock = { (error) -> Void in 
     if error == nil { 
      UIApplication.sharedApplication().applicationIconBadgeNumber = 0 
     } 

    } 

    CKContainer.defaultContainer().addOperation(badgeReset) 
} 


func applicationWillResignActive(application: UIApplication) { 
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
} 

func applicationDidEnterBackground(application: UIApplication) { 
    resetBadge() 

} 

func applicationWillEnterForeground(application: UIApplication) { 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     NSNotificationCenter.defaultCenter().postNotificationName("performReload", object: nil) 
    }) 
} 

func applicationDidBecomeActive(application: UIApplication) { 
    resetBadge() 
} 

func applicationWillTerminate(application: UIApplication) { 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
} 

} 

しかし、私は毎回誰かがメッセージを送信し、通知を行うために必要なコードのすべてを持っているにもかかわらず通知はでてきません。何か不足していますか?ありがとう!

あなたは公共のデータベースにデータを追加しているが、あなたはプライベートデータベース上のサブスクリプションを作成している:

誰かが言って前に私に答えました。これら2つのうちの1つは、他のものと一致するように変更する必要があります。

だから私はあなたのアプリケーションのデリゲートではlet privateDatabase = CKContainer.defaultContainer().privateCloudDatabaselet privateDatabase = CKContainer.defaultContainer().publicCloudDatabase

+0

あまりにも多くのコード!私たちがデバッグするのが簡単なので、無関係な情報を削除してください。 – penatheboss

+0

@penatheboss私のコードが表示されている可能性があります。 –

+0

コードは問題ありません。それはあまりにも多くあるということだけです。あなたの問題に関連するものだけを表示してください – penatheboss

答えて

0

を変更し、あなたがこの方法を欠けているが:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 

    print(deviceToken)  // This is the device token 
    var token: String = "\(deviceToken)" /// formatted token. 

    let rawtoken = token.stringByReplacingOccurrencesOfString(">", withString: "") 
    let cleantoken = rawtoken.stringByReplacingOccurrencesOfString("<", withString: "") 
    var finaltoken = cleantoken.stringByReplacingOccurrencesOfString(" ", withString: "") 
    // Send device token to server 

      } 
     } 
    } 

私は何を意味することは、プッシュ通知のユーザーを登録し、通知を送信することです。ケースについてレジスタが成功した場合は、上記の方法を実装する必要があります。 登録が失敗した場合は、これを実装する必要があります。

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { 
    print(error) 

} 
+0

それはうまくいくでしょうか? –

+0

他に何か問題はありませんでしたか? –

+0

ここであなたはこの質問で私を助けてくれますか? http://stackoverflow.com/questions/37495254/swift-i-dont-get-notifications-from-my-cloudkit-app –

関連する問題