曹耘豪的博客

iMessage小游戏实现机制研究

  1. 基本的类
  2. 保存对局信息
  3. 保持对话框简洁
  4. 一些重要函数
  5. 关于调试
  6. 其他
  7. 参考

iMessage小游戏(Game Pigeon),当我第一次玩到它,就立即被它独特的机制吸引。游戏居然可以穿插在对话中,你一言我一语,就像写纸条一样,收到纸条,打开,写上我的对策,再折好传给你,全程竟无需经过游戏服务器,因为纸上写的就是全部游戏数据!并且由于其实现机制,你甚至可以同时和多个人玩相同或不同的游戏,没有任何限制。正因为此,我尝试深入研究一下这种小游戏背后的实现机制

网上关于iMessage扩展的文章不多,官网有一个很不错的Demo,在这个demo中我找到了答案,记录如下

基本的类

1
2
MSSession: 一条消息的标识
MSMessage: 一条消息

保存对局信息

没有游戏服务器,对局状态放在哪?

每次都发送对局的全部状态数据,所以直接保存在MSMessage

保持对话框简洁

一个对局的进行是来来回回相互发消息(游戏的状态),那对话会不会很乱?会有很多图片?答案是不会

一些重要函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 提交一个message,这个消息会添加到输入框内,未发送
conversation.insert(message)

// 发送一个message,这个消息会直接发送
conversation.send(message)

// 打开扩展,无论是从扩展栏点开还是点击消息,可通过presentationStyle判断
override func willBecomeActive(with conversation: MSConversation)

// 发送(手动点击发送或者使用上述代码发送)后触发,在 MSMessagesAppViewController
override func didStartSending(_ message: MSMessage, conversation: MSConversation)

// 在输入框里叉掉时触发
override func didCancelSending(_ message: MSMessage, conversation: MSConversation)

// 接收到该扩展的消息时且用户已经打开了这个扩展时,触发
override func didReceive(_ message: MSMessage, conversation: MSConversation)

关于调试

其他

参考