2015-01-08 16 views
12

呼び出されることはありません:私は以下のコード使用して時計のシミュレータから私のiPhoneのアプリを起動しようとしていますiPhoneアプリでUIApplicationDelegate返信

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); 
} 

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

Error: Error Domain=com.apple.watchkit.errors Code=2 "The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]" UserInfo=0x7f8603227730 {NSLocalizedDescription=The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]}

+0

私は全然WatchKitを知りませんが、エラーがhandleWatchKitExtensionRequest 'であなたのコードがあることを示すようだ:'そのメソッドに引数として提供さリプライ()ブロックを呼び出す必要があります。そのメソッドに 'reply(@ {@" data ":@"テストデータ "});を追加してみてください。これはちょっとした辞書をテストとして使用しています。 WatchKitのドキュメントは、その辞書の内容を正確に教えてくれると思います。 – pbasdf

+0

はいi [InterfaceController openParentApplication:dict reply:^(NSDictionary * replyInfo、NSError * error){ NSLog(@ "%@"、[replyInfo objectForKey:@ "Key"])でエラーが表示される; NSLog(@ "error: - %@"、[error description]); pleseは、このメソッドからwatchkitアプリケーションのデータを取得する方法を提案します。私は私のアプリからのキットアプリケーションを見て文字列をしたい。事前に感謝 – jaydev

答えて

18

nilを返す場合でも、返信ブロックを呼び出す必要があります。以下はエラーを解決します:

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

詳細については、the Apple documentationを参照してください。また、NSDictionary reply(myNSDictionary);を返すこともできます。ただし、辞書にはプロパティリストファイルに対してシリアライズ可能な情報しか含めることができませんが、Watchkit拡張に戻るのに役立つ情報があれば、文字列を渡すことはできますが、最初にNSDataとしてパッケージ化せずにカスタムクラスのインスタンスへの参照を含む辞書を渡すだけです。

+0

私はエラーが削除されたので答えを受け入れる –

+8

うわー、replyInfo辞書にカスタムオブジェクトを渡すことができないことを永遠に思い出しました。 NSCodingにも準拠していません。実際の問題がreplyInfoディクショナリである場合、あなたが返信ブロックを呼び出さなかったというエラーメッセージは誤解を招きます。 – bdmontz

+0

@bdmontz XPCサービスとは異なり、カスタムクラスを登録する規定はないようです。バマー!おそらくあなたは別の答えとしてそれを掲示すべきです。 – GoodSp33d

14

脇だけ返信ブロックを呼び出していないから、これは少なくともカップルの理由で発生することができます

  1. あなたのiPhoneアプリは、それが要求を処理している間にクラッシュしたため、返信ブロックを呼び出すことができませんでした。誤ってNSMutableDictionaryにnilを入れていないことを確認すると、クラッシュする可能性があります。
  2. plistファイルにserializeできないものをreplyInfoディクショナリ(hat tip〜@ duncan-babbage)に入れようとしています。お返事辞書を構築し、電話機側では

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]; 

、背面にそれを解凍しますが、NSAttributedStringまたはカスタムオブジェクトを渡すことを確認、それはNSCodingに準拠して作成し、これを実行する必要がある場合時計側:私はdocumentationに指定されていることがhandleWatchKitExtensionRequestでバックグラウンドタスクを開始することが重要であることを追加したいと思います

NSData *objectData = replyInfo[@"myKey"]; 
MyCustomObject *myObject = [NSKeyedUnarchiver unarchiveObjectWithData: objectData]; 
NSData *stringData = replyInfo[@"otherKey"]; 
NSAttributedString *myString = [NSKeyedUnarchiver unarchiveObjectWithData: stringData]; 
+0

アーカイブを使用するには、プロトコル「 'その必要なメソッドを実装する必要があります。 – EridB

+0

@ EridB、それは間違っています。私の答えで述べたように、オブジェクトはアーカイブを使用するためにNSCodingプロトコルに準拠している必要があります。 – bdmontz

+0

@bdmontz私のベーコンを保存してくれてありがとう!私はこのことを理解しようとしていたでしょう!私は素晴らしいNSDictionary Categoryを作成して、このすべてを私から隠すようにしました。 – eric

6

。これにより、iPhone上のメインアプリケーションが応答を送信する前に中断されないことが保証されます。 (バックグラウンドタスクを起動してもシミュレータやiPhoneアプリがアクティブになっても問題は発生しませんが、iPhoneアプリがアクティブでないときに問題が発生します)。

メインアプリケーションのアプリケーション代理人のコードiPhone上:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply 
{ 
    __block UIBackgroundTaskIdentifier watchKitHandler; 
    watchKitHandler = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"backgroundTask" 
                   expirationHandler:^{ 
                   watchKitHandler = UIBackgroundTaskInvalid; 
                   }]; 

    if ([[userInfo objectForKey:@"request"] isEqualToString:@"getData"]) 
    { 
     // get data 
     // ... 
     reply(data); 
    } 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)NSEC_PER_SEC * 1), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [[UIApplication sharedApplication] endBackgroundTask:watchKitHandler]; 
    }); 
} 
関連する問題