2

WKInterfaceController の didAppear 関数が起動したら、sendMessageData コールバック関数を使用して空の NSData を WCSession のデフォルト セッションに送信します。

// WKInterfaceController

NSData *emptyData = [[NSData alloc] init];
[[WCSession defaultSession] sendMessageData:emptyData replyHandler:^(NSData *replyMessageData) {
    NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:replyMessageData];
} errorHandler:^(NSError *error) {
    NSLog(@"WATCH: Error from replyData %@", error);
}];

sendMessageData: は非 null 引数であるため、emptyData NSData オブジェクトが送信されます。私は、iOS アプリで WCSession の Delegate メソッド didReceiveMessageData を起動できるようにするためにのみ使用します。次に、まさにその関数内の replyHandler が、適切なデータを replyHandler の WKInterfaceController に送り返します。

// UITableViewController

- (void)session:(WCSession *)session didReceiveMessageData:(NSData *)messageData replyHandler:(void (^)(NSData * _Nonnull))replyHandler
{
    [self loadData:nil onSuccess:^(NSArray *tips) {
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:tips];
        replyHandler(data);
    }];
}

私が抱えている問題は、WKInterfaceController の次の行でクラッシュすることです

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:replyMessageData];

エラーは次のとおりです。

* キャッチされていない例外 'NSInvalidUnarchiveOperationException' が原因でアプリを終了して います。クラスは、リンクされていないソース コードまたはライブラリで定義されている可能性があります。

私がこれまでに見つけたもの:

長い投稿で申し訳ありませんが、この問題の解決策を見つけるためにあらゆることを試みましたが、成功しませんでした。これが、WatchConnectivity Framework で問題を抱えているより多くの人々に役立つことを願っています。

4

2 に答える 2