3

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

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

 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再次将此字符串转换回。用 s 做这件事CGPoint效率低下..如何通过 a CGPointin a之类的东西URLQueryItem?除了将 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!
        }
    }
4

2 回答 2

3

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

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

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

希望这可以帮助 :)

于 2017-04-11T00:58:06.367 回答
0

您可以使用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

于 2017-10-14T18:23:48.610 回答