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' が原因でアプリを終了して います。クラスは、リンクされていないソース コードまたはライブラリで定義されている可能性があります。
私がこれまでに見つけたもの:
- 渡そうとしている NSArray は、カスタム オブジェクト (Tip.m) で構成されています。私は、NSArray 内のすべてのオブジェクトが NSCoding プロトコル ( NSArray を NSData に変換する方法は? ) に準拠している必要があることを知っています。initWithCoder と encodeWithCoder を使用して、オブジェクト内のすべての変数とオブジェクトをエンコードおよびデコードしました。
- Tip.m オブジェクトを WatchKit 拡張機能に追加する必要があります ( NSInvalidUnarchiveOperationException は、Apple Watch 拡張機能でオブジェクト エラーをデコードできません)。Tip.m ファイルを追加すると、他のオブジェクトから「アーキテクチャ i386 の未定義シンボル」のみが表示されます。
長い投稿で申し訳ありませんが、この問題の解決策を見つけるためにあらゆることを試みましたが、成功しませんでした。これが、WatchConnectivity Framework で問題を抱えているより多くの人々に役立つことを願っています。