您可以在 URL QueryItems 中发送字符串以外的对象吗?

Can you send objects other than strings in URLQueryItems?

好的,我正在构建一个 iMessage 应用程序并来回传输数据,我必须使用 URLQueryItems。我正在使用 SKScene 并需要传输 Ints、CGPoints、图像等。阅读 Apple 的文档和我自己的尝试,您似乎只能将字符串存储在 URLQueryItem秒。

由于这是我们来回传递数据的唯一方式,是否有(更好的)方式来存储其他类型的数据?目前我一直在这样做:

 func composeMessage(theScene: GameScene) {
        let conversation = activeConversation
        let session = conversation?.selectedMessage?.session ?? MSSession()

        let layout = MSMessageTemplateLayout()
        layout.caption = "Hello world!"

        let message = MSMessage(session: session)
        message.layout = layout
        message.summaryText = "Sent Hello World message"

        var components = URLComponents()
        let queryItem = URLQueryItem(name: "score",value: theScene.score.description)
       components.queryItems = [queryItem] //array of queryitems
        message.url = components.url!

        print("SENT:",message.url?.query)

        conversation?.insert(message, completionHandler: nil)
    }

然后在另一方面,我必须再次将此字符串转换回 Int。使用 CGPoints 这样做效率低下.. 如何在 URLQueryItem 中传递 CGPoint 之类的东西?除了将 x 和 y 值存储为字符串之外,还有其他方法吗?

编辑:这就是我从其他人那里接收数据并将其放入他们的场景的方式:

override func willBecomeActive(with conversation: MSConversation) {
        // Called when the extension is about to move from the inactive to active state.
        // This will happen when the extension is about to present UI.

        // Use this method to configure the extension and restore previously stored state.

        let val = conversation.selectedMessage?.url?.query?.description
         print("GOT IT ", val)

        if(val != nil)
        {
            scene.testTxt = val!
        }
    }

如您所见,要通过 URLQueryItem 传递数据,您必须将所有内容转换为 String,因为毕竟信息应该表示为 URL: ) 对于 CGPoint 信息,您可以将 x 和 y 值分开并将它们作为两个单独的 Int 发送,转换为字符串。或者,您可以将其作为“10,5”形式的单个字符串值发送,其中 10 是 x,5 是 y 值,但在另一端,您需要先用逗号分隔值,然后再转换结果值回到 Ints,像这样(在另一端):

let arr = cgPointValue.components(separatedBy:",")
let x = Int(arr[0])
let y = Int(arr[1])

对于其他类型的数据,您必须遵循类似的策略,即以某种方式将值转换为 String。对于图像,如果您的资源中有图像,您应该能够只传递名称或标识号。对于外部图像,URL(如果图像都来自同一服务器,则为其中的一部分)应该可以工作。否则,如果使用 URLQueryItem,您可能需要查看对图像数据进行 base64 编码或其他内容,但如果到了这一点,您可能需要查看您正在尝试实现的目标,以及是否有更好的方法这样做的方法,因为大图像可能会导致发送大量数据,我不确定 iMessage 应用程序是否支持它。因此,您可能还想查看 iMessage 应用程序数据传递的限制。

希望这对您有所帮助:)

您可以使用 iMessageDataKit 库在 MSMessage 对象中存储键值对。它使设置和获取数据变得非常简单直接,例如:

let message: MSMessage = MSMessage()

message.md.set(value: 7, forKey: "moveCount")
message.md.set(value: "john", forKey: "username")
message.md.set(values: [15.2, 70.1], forKey: "startPoint")
message.md.set(values: [20, 20], forKey: "boxSize")

if let moveCount = message.md.integer(forKey: "moveCount") {
    print(moveCount)
}
if let username = message.md.string(forKey: "username") {
    print(username)
}
if let startPoint = message.md.values(forKey: "startPoint") {
    print("x: \(startPoint[0])")
    print("y: \(startPoint[1])")
}
if let boxSize = message.md.values(forKey: "boxSize") {
  let size = CGSize(width: CGFloat(boxSize[0] as? Float ?? 0),
                    height: CGFloat(boxSize[1] as? Float ?? 0))
  print("box size: \(size)")
}

(免责声明:我是 iMessageDataKit 的作者)