好的,我正在构建一个iMessage应用程序,为了来回传输数据,我必须使用URLQueryItem
s。我正在使用SKScene
并需要传输Int
s、CGPoint
s、图像等。阅读苹果的文档和我自己的尝试,似乎你只能在URLQueryItem
s中存储字符串。
因为这是我们来回传递数据的唯一方法,是否有(更好的)方法来存储其他类型的数据?目前我一直在做:
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
s执行此操作将效率低下。一个人如何通过一个像CGPoint
中的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!
}
}
最佳答案
正如您所发现的,要通过URLQueryItem
传递数据,您必须将所有内容都转换为String
s,因为信息毕竟应该表示为一个url:)对于CGPoint
信息,您可以将x和y值分开,并将它们作为两个单独的Int
s发送到转换为字符串。或者,您可以以“10,5”的形式将其作为单个字符串发送,其中10是x,5是y,但在另一端,您需要先将该值拆分为逗号,然后将结果值转换回Int
s,如下所示(在另一端):
let arr = cgPointValue.components(separatedBy:",")
let x = Int(arr[0])
let y = Int(arr[1])
对于其他类型的数据,您必须遵循类似的策略,以某种方式将值转换为
String
。对于图像,如果您的资源中有图像,那么您应该能够只传递名称或标识号。对于外部图像,应该有一个url(如果所有图像都来自同一服务器,则为其中的一部分)。否则,如果您使用URLQueryItem
的话,您可能需要查看base64编码图像数据或其他东西,但是如果您到了这一步,您可能需要查看您正在尝试实现的目标,以及是否有更好的方法来实现这一目标,因为大图像可能会导致发送大量数据,我不确定imessage应用程序是否支持这一点。因此,您可能还需要研究imessage应用程序数据传递中的限制。希望这有帮助:)
关于swift - 您可以在URL QueryItems中发送字符串以外的对象吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43334841/