私のアプリケーションに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
私は自分のアーカイバ/アンアーカイバを使用しています。 – Makalele
@Makalele、archiver/unarchiverはアーカイブされたオブジェクトと異なるはずです。アーカイブされたオブジェクトのクラスは 'NSCoding'(** NSCoderではない)または' NSSecureCoding'に従う必要があり、archiver/unarchiverは 'NSCoder'を継承します。あなたは本当に 'NSKeyedArchiver' /' NSKeyedUnarchiver'の代わりを作りたいですか? – OOPer