好的,我正在构建一个iMessage应用程序并来回传输数据我必须使用URLQueryItem
s。我正在使用SKScene
并需要转移Int
,CGPoint
,图片等。阅读Apple的文档和我自己的尝试似乎只能存储{{{ 1}}秒。
由于这是我们来回传递数据的唯一方法,是否有(更好的)方法来存储其他类型的数据?目前我一直这样做:
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
执行此操作效率不高..如何在CGPoint
中传递CGPoint
之类的内容?除了将x和y值存储为字符串之外的其他任何方式?
编辑:这就是我从其他人那里接收数据并进入他们的场景的方式:
URLQueryItem
答案 0 :(得分:3)
正如您所发现的,要通过URLQueryItem
传递数据,您必须将所有内容转换为String
,因为信息应该在所有内容后表示为URL :) {{1} }信息,您可以将x和y值分开并将它们作为两个单独的CGPoint
转换为String发送。或者,您可以将其作为单个字符串值以“10,5”的形式发送,其中10是x,5是y值,但在另一端,您需要先在逗号上拆分值然后转换结果值返回Int
s,类似这样(在另一端):
Int
对于其他类型的数据,您必须遵循类似的策略,以某种方式将值转换为let arr = cgPointValue.components(separatedBy:",")
let x = Int(arr[0])
let y = Int(arr[1])
。对于图像,如果您的资源中包含图像,则应该能够通过仅传递名称或标识号来逃避。对于外部图像,URL(或图像全部来自同一服务器的一部分)应该起作用。否则,如果使用String
,您可能必须查看base64对图像数据的编码,但是如果你到了那一点,你可能想看一下你想要实现的目标,如果有更好的话这样做的方法,因为大图像可能导致大量数据被发送,我不确定iMessage应用程序是否支持这一点。因此,您可能希望了解iMessage应用程序数据传递中的限制。
希望这会有所帮助:)
答案 1 :(得分: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
的作者)