2017-01-04 15 views
1

私のアプリケーションにUNUserNotificationを実装しようとしています。一般に、それは動作しますが、私は(と後でそれを受け取る)のUserInfoと私のオブジェクトを渡すために必要な:userInfoのカスタムオブジェクトを持つUNMutableNotificationContentがアプリケーションをクラッシュさせます

static func showNotification(_ serverNotification: ServerNotification){ 
    print("showNotification called") 
    let content = UNMutableNotificationContent() 
    content.title = serverNotification.title 
    content.body = serverNotification.notificationDescription 
    content.sound = UNNotificationSound.default() 
    content.categoryIdentifier = "pl.tropicalapps.TryOnNotification" 
    content.userInfo = ["serverNotification" : serverNotification] 
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false) 
    let request = UNNotificationRequest(identifier: "Request", content: content, trigger: trigger) 
    let center = UNUserNotificationCenter.current() 
    center.add(request) { (error:Error?) in 
     if let err = error { 
      print(err) 
     } 
     else{ 
      print("notification sent!") 
     } 
    } 
} 

私はのUserInfoを追加したり、[「foo」という:「バー」]合格しない場合、それは動作します。しかし、オブジェクト(serverNotification)を追加すると、リクエストを送信した後にクラッシュします。私はこのエラーをキャッチすることはできませんが、それは ` - [NSXPCEncoder _checkObject:] :(残りはアセンブラにあります)。

class ServerNotification : NSCoder { 

    var id:Int 
    var type:String 
    var brandId:Int 
    var title:String 
    var notificationDescription:String = "" 
    var discountId:String 
    var discountPercent:Double 
    var discountDescription:String 
    var discountCode:String 
    var discountType:String 
    var discountExpireDate:Date 
    var date:Date 

    override init(){ 
     id = 0 
     type = "" 
     brandId = 0 
     title = "" 
     notificationDescription = "" 
     discountId = "" 
     discountPercent = 0.0 
     discountDescription = "" 
     discountCode = "" 
     discountType = "" 
     discountExpireDate = Date() 
     date = Date() 
    } 

    required init(coder aDecoder: NSCoder) { 
     id = aDecoder.decodeInteger(forKey: "id") 
     type = aDecoder.decodeObject(forKey: "type") as! String 
     brandId = aDecoder.decodeInteger(forKey: "brandId") 
     title = aDecoder.decodeObject(forKey: "title") as! String 
     notificationDescription = aDecoder.decodeObject(forKey: "notificationDescription") as! String 
     discountId = aDecoder.decodeObject(forKey: "discountId") as! String 
     discountPercent = aDecoder.decodeDouble(forKey: "discountPercent") 
     discountDescription = aDecoder.decodeObject(forKey: "discountDescription") as! String 
     discountCode = aDecoder.decodeObject(forKey: "discountCode") as! String 
     discountType = aDecoder.decodeObject(forKey: "discountType") as! String 
     discountExpireDate = aDecoder.decodeObject(forKey: "discountExpireDate") as! Date 
     date = aDecoder.decodeObject(forKey: "date") as! Date 
     super.init() 
    } 

    func encodeWithCoder(_ aCoder: NSCoder){ 
     aCoder.encode(id, forKey: "id") 
     aCoder.encode(type, forKey: "type") 
     aCoder.encode(brandId, forKey: "brandId") 
     aCoder.encode(title, forKey: "title") 
     aCoder.encode(notificationDescription, forKey: "notificationDescription") 
     aCoder.encode(discountId, forKey: "discountId") 
     aCoder.encode(discountPercent, forKey: "discountPercent") 
     aCoder.encode(discountDescription, forKey: "discountDescription") 
     aCoder.encode(discountCode, forKey: "discountCode") 
     aCoder.encode(discountType, forKey: "discountType") 
     aCoder.encode(discountExpireDate, forKey: "discountExpireDate") 
     aCoder.encode(date, forKey: "date") 
    } 
} 

問題があります:

はここServerNotificationクラスですか?これをどうすれば解決できますか? 私はあなたが私の知る限り、シミュレータを使用してコードをテストして、もう少し-[NSXPCEncoder _checkObject:]:

This coder only encodes objects that adopt NSSecureCoding (object is of class 'TestProjectName.ServerNotification').

を追ったiOSの10.2

答えて

1

で、デバイス上のアプリケーションをも実行していますよServerNotificationのヘッダーを次のように変更する必要があります。

class ServerNotification : NSObject, NSSecureCoding { 

「Fix-it」でいくつかの提案が表示されます。

通常、サブクラス化は役に立たず、独自のアーカイバ/アンアーカイバを作成する場合は、NSCoderをサブクラス化します。

+0

私は自分のアーカイバ/アンアーカイバを使用しています。 – Makalele

+0

@Makalele、archiver/unarchiverはアーカイブされたオブジェクトと異なるはずです。アーカイブされたオブジェクトのクラスは 'NSCoding'(** NSCoderではない)または' NSSecureCoding'に従う必要があり、archiver/unarchiverは 'NSCoder'を継承します。あなたは本当に 'NSKeyedArchiver' /' NSKeyedUnarchiver'の代わりを作りたいですか? – OOPer

関連する問題