12

以下のコードを使用して、時計シミュレーターから iPhone アプリを起動しようとしています。

WKInterfaceController サブクラス

[WKInterfaceController openParentApplication:[NSDictionary dictionaryWithObject:@"red" forKey:@"color"] reply:^(NSDictionary *replyInfo, NSError *error) {
NSLog(@"replyInfo %@",replyInfo);
NSLog(@"Error: %@",error);
}];

AppDelegate.m

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply
{
NSLog(@"appdelegate handleWatchKitExtensionRequest");
NSLog(@"NSDictionary: %@",userInfo);
NSLog(@"replyInfo: %@",replyInfo);
}

私が得ているエラーは次のとおりです。

エラー: エラー Domain=com.apple.watchkit.errors Code=2 "iPhone アプリの UIApplicationDelegate は -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:] で reply() を呼び出しませんでした" UserInfo=0x7f8603227730 {NSLocalizedDescription=iPhone の UIApplicationDelegate -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]} でアプリが reply() を呼び出したことがない

4

3 に答える 3

14

応答ブロックを呼び出さないだけでなく、これは少なくともいくつかの理由で発生する可能性があります。

  1. 要求の処理中に iPhone アプリがクラッシュしたため、応答ブロックを呼び出すことができませんでした。クラッシュの原因となるため、誤って NSMutableDictionary に nil を入れていないことを確認してください。
  2. plistファイルにシリアル化できないものをreplyInfo辞書に入れようとしています(@ duncan-babbageへのヒント)。NSAttributedString またはカスタム オブジェクトを渡す必要がある場合は、NSCoding に準拠していることを確認してから、次のようにします。

電話側で、返信辞書を作成します。

NSMutableDictionary *reply = [NSMutableDictionary new];
MyCustomObject *myObject = <something you need to send>;
reply[@"myKey"] = [NSKeyedArchiver archivedDataWithRootObject: myObject];
NSAttributedString *myString = <some attributed string>;
reply[@"otherKey"] = [NSKeyedArchiver archivedDataWithRootObject: myString];

そして、時計側でそれを解凍します。

NSData *objectData = replyInfo[@"myKey"];
MyCustomObject *myObject = [NSKeyedUnarchiver unarchiveObjectWithData: objectData];
NSData *stringData = replyInfo[@"otherKey"];
NSAttributedString *myString = [NSKeyedUnarchiver unarchiveObjectWithData: stringData];
于 2015-03-17T15:19:56.873 に答える