手表上未收到使用PebbleKit iOS发送的消息

时间:2014-01-15 20:52:46

标签: ios pebble-watch

在我的iOS应用程序中,我想向手表发送一条消息:

NSMutableDictionary *message = @{@(1): @(1),
                                 @(2): @"The String"}
[_watch appMessagesPushUpdate:message onSent:^(PBWatch *watch, NSDictionary *update, NSError *error) {
  if (error != nil)
    NSLog(@"Error sending message: %@", error);
}];

如果我这样发送它就有效。但是如果我的字符串更长或者我向字典添加了3或4个以上的密钥,则不会传递消息。错误是“应用程序未及时确认消息”。

在我的卵石App中,我执行以下操作:

static void message_handler(DictionaryIterator *iter, void *context) {
  APP_LOG(APP_LOG_LEVEL_DEBUG, "Received message.");
  Tuple *msg_type_tuple = dict_find(iter, PebbleMessageKeyType);
  Tuple *msg_value_tuple = dict_find(iter, PebbleMessageKeyValue);
  write_line_on_screen(msg_value_tuple->value->cstring);
}
...
// Set sniff interval.
app_comm_set_sniff_interval(SNIFF_INTERVAL_NORMAL); 

// Register message handlers
app_message_register_inbox_received(message_handler);
app_message_register_inbox_dropped(message_dropped);

// Init buffers
app_message_open(app_message_inbox_size_maximum(), app_message_outbox_size_maximum());
APP_LOG(APP_LOG_LEVEL_DEBUG, "App Message set up.");

我的想法是它与邮件大小有关。但我无法想象消息只能这么小? 在ToDo list example我看到他们使用了app_message_open,其中收件箱的值为64,而outbox参数的值为16。这个单位是什么意思? 64个字符?我怎么知道在iOS上,当它到达鹅卵石时我的信息有多大?

1 个答案:

答案 0 :(得分:1)

调试此类问题时,首先要做的是添加一个message_dropped处理程序并打印失败原因:

void init() {
   // ...
   app_message_register_inbox_dropped(appmsg_in_dropped);
   app_message_open(...);
   // ... 
}

static void appmsg_in_dropped(AppMessageResult reason, void *context) {
  APP_LOG(APP_LOG_LEVEL_DEBUG, "In dropped: %i", reason);
}

您会找到原因代码in the documentation的列表。

两个最常见的问题是:

  1. APP_MSG_BUFFER_OVERFLOW:信息太大(见下文)
  2. APP_MSG_BUSY:您发送的邮件太快了。在确认上一个消息之前,您无法发送新消息。
  3. 消息的大小等于字典的大小。 dict_calc_buffer_size()的文档解释了如何计算它:

    1 byte + 7 bytes for each key + the sum of the sizes of the values
    

    最后,传递给app_message_open()的值是缓冲区大小(以字节为单位)。