Decoding Error when starting a Live Activity via Push Notification

Hi,

I'm a bit stuck when it comes to implementing live activities.

I'm trying to start one by sending a push.

my activity attributes looks like:

import Foundation
import ActivityKit

public struct NeoPrototypeActivity: ActivityAttributes {
    public let classId: String
    public let name: String
    public let room: String
    public let startTime: Date

    public init(classId: String, name: String, room: String, startTime: Date) {
        self.classId = classId
        self.name = name
        self.room = room
        self.startTime = startTime
    }

    public struct ContentState: Codable & Hashable {
        public let participationState: ParticipationState

        public init(participationState: ParticipationState) {
            self.participationState = participationState
        }
    }
}

public enum ParticipationState: String, Codable, Hashable, Equatable {
    case upcoming
    case upcomingOnWaitingList
    case checkedIn
    case waitingList
    case lostSpot
    case lostSpotFromWaitingList
    case classCompleted

    public var description: String {
        switch self {
        case .upcoming: return "Upcoming"
        case .upcomingOnWaitingList: return "Upcoming on Waiting List"
        case .checkedIn: return "Checked In"
        case .waitingList: return "Waiting List"
        case .lostSpot: return "Lost Spot"
        case .lostSpotFromWaitingList: return "Lost Spot from Waiting List"
        case .classCompleted: return "Class completed"
        }
    }
}

which I have in a SPM package that is imported by my widget and iOS targets.

Then I am sending a push notification (to my simulator in this case) with the following payload

{
    "aps": {
        "timestamp": 1728419211,
        "event": "start",
        "content-state": {
            "participationState": "upcoming"
        },
        "attributes-type": "NeoPrototypeActivity",
        "attributes": {
            "classId": "1234",
            "name": "Indoor Running",
            "room": "room 2",
            "startTime": "2024-10-19T13:22:59+02:00"
        },
        "alert": {
            "title": "Hola Mundo",
            "body": "Todo Bien"
        }
    }
  }

I am using the right values for the deviceID when sending the push.

I get a 200 ok from the CloudKit console.

yet my live activity doesn't start.

I'm trying to look at the errors in the Console app and the only relevant thing is see is:

[NeoPrototypeActivity] Error creating activity: NSCocoaErrorDomain (4864) The data couldn’t be read because it isn’t in the correct format.

It seems like a decoding error, but I don't know what exactly failed

I wrote some test to try the decoding like:

import Testing
import Foundation
@testable import PrototypeActivities

@Test func decoding() async throws {
    struct StateContainer: Codable {
        let participationState: ParticipationState
    }

    let jsonString = """
    {
        "participationState": "upcoming"
    }
    """
    let json = try #require(jsonString.data(using: .utf8))
    let result = try JSONDecoder().decode(StateContainer.self, from: json)

    #expect(result.participationState == .upcoming)
}

@Test func decodingActivity() throws {
//    let jsonString = """
//    {
//        "classId": "1234",
//        "name": "Indoor Running",
//        "room": "room 2",
//        "startTime": "2024-10-19T11:22:59Z"
//    }
//    """
    let jsonString = """
    {
        "classId": "1234",
        "name": "Indoor Running",
        "room": "room 2",
        "startTime": 1729337784
    }
    """
    let json = try #require(jsonString.data(using: .utf8))

    let jsonDecoder = JSONDecoder()
//    jsonDecoder.dateDecodingStrategy = .iso8601
    let activity = try jsonDecoder.decode(NeoPrototypeActivity.self, from: json)

    #expect(activity.classId == "1234")
    #expect(activity.name == "Indoor Running")
}```

but even with using the default JSON decoder date format, I still get the same error.

Not sure how to fix this or to get more details.
Decoding Error when starting a Live Activity via Push Notification
 
 
Q