Utrzymuję się z błędem podczas korzystania z aplikacji Watchkit. Kiedy go uruchomię, pytam aplikację zawierającą iOS, by uzyskać pewne dane z sieci. Problem polega na tym, że pojawia się błąd informujący, że aplikacja zawierająca nie wywołuje "reply()": o Ale patrząc na mój kod, powinien go wywołać.openParentApplication: odpowiedz: błąd z asynchronicznym wywołaniem sieciowym zawierającym aplikację
Próbowałem debugować każdy krok od openParentApplication do "post() połączenia, a to wydaje się działać dobrze = X
Oto mój kod w rozszerzeniu Watchkit
- (void)initDiaporamasWithSuccess:(void (^)())success andFailure:(void (^)(NSError*))failure {
NSLog(@"Ask to load diapos");
__weak typeof(self) weakSelf = self;
[WKInterfaceController openParentApplication:@{@"watchKit": @"watchKit.initDiapos"} reply:^(NSDictionary *replyInfo, NSError *error) {
if (error) {
NSLog(@"%@", error);
if (failure) {
failure(error);
}
return;
}
NSLog(@"got items : %@", replyInfo[@"diapos"]);
weakSelf.diaporamas = replyInfo[@"diapos"];
[weakSelf setDiaporama:replyInfo[@"firstDiapo"] AtIndex:0];
if (success) {
success();
}
}];
}
Rezultatem powinien być NSDictionary zawierający NSArray zawierający podstawowe informacje o diaporamach oraz obiekt (Diapo) zawierający pełne informacje o pierwszej diaporamie (np. Self.diaporamas [0])
A oto kod w zawierającego aplikacji AppDelegate:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply {
// Maybe we could handle multiple watchKit extension calls that way ?
// Something like a key-value 'protocol' to run the right block of code
NSString *watchKitCall = userInfo[@"watchKit"];
NSLog(@"watchKit handled");
if ([watchKitCall isEqualToString:@"watchKit.initDiapos"]) {
[AppDelegate watchInitialObjects:^(NSDictionary *info) {
NSLog(@"Managed to get initial infos");
reply(info);
} failure:^(NSError *error) {
NSLog(@"Fail : %@", error);
reply(@{@"error": error});
}];
}
}
+ (void) watchInitialObjects:(void (^)(NSDictionary *info))success failure:(void (^)(NSError *error))failure {
NSDictionary *parameters = @{@"site" : @(14), @"limit" : @(10)};
[AppDelegate requestDiapoListWithParams:parameters success:^(NSArray *items) {
if ([items count] == 0)
{
NSError *error = [NSError errorWithDomain:@"com.domain.app" code:404 userInfo:nil];
failure(error);
return;
}
Diapo *firstDiapo = [items firstObject];
[AppDelegate requestDiapoDetailWithDiapo:firstDiapo success:^(Diapo *diapo) {
if (!diapo)
{
NSError *error = [NSError errorWithDomain:@"com.domain.app" code:404 userInfo:nil];
failure(error);
return;
}
NSDictionary *result = @{
@"firstDiapo" : diapo,
@"diapos" : items
};
success(result);
} failure:^(NSError *error) {
failure(error);
}];
} failure:^(NSError *error) {
failure(error);
}];
}
W watchKitHandler wzywam watchInitialObjects uzyskać tablicę diaporam i informacji pierwszego diaporama za . W watchInitialObjects wykonuję pierwsze połączenie sieciowe, aby uzyskać tablicę, a po sukcesie wykonuję inne połączenie sieciowe, aby uzyskać informacje o diaporamach.
Aby dokonać połączenia i mapować JSON do obiektów, używam RESTKit
I naprawdę nie rozumiem, co może być błąd = x
UPDATE
zapomniałem napisać błąd dostaję, tutaj jest:
Błąd Domena = com.apple.watchkit.errors Code = 2 "Aplikacja UIApplicationDelegate w aplikacji na iPhone nigdy nie nazywa odpowiedzi() In - [Application UIApplicationDelegate: handleWatchKitExtensionRequest: Odpowiedz:]”UserInfo = 0x7fcb53e12830 {NSLocalizedDescription = The UIApplicationDelegate w aplikacji iPhone nigdy nazwie odpowiedź() in - [Application UIApplicationDelegate: handleWatchKitExtensionRequest: Odpowiedz:]}
I Próbowałem dowiedzieć się, dlaczego pojawia się ten błąd i myślę, że go znalazłem: Wygląda na to, że jest (bardzo mało) limit czasu, aby wykonać pracę w aplikacji zawierającej. Ale zmapowałem dane JSON, które otrzymałem bezpośrednio w aplikacji zawierającej, a następnie wysłałem te niestandardowe obiekty w replice(). Ale kiedy usunąłem część mapowania, działało dobrze!
Więc ... właśnie dlatego myślę, że to był problem = X Czy ktoś może zatwierdzić moje myśli lub poprawić mnie?
Any inne szczegóły błędu? Czy na zegarku jest czas oczekiwania, a aplikacja nie odpowiada na czas? – Wain