2015-03-19 36 views
7

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?

+1

Any inne szczegóły błędu? Czy na zegarku jest czas oczekiwania, a aplikacja nie odpowiada na czas? – Wain

Odpowiedz

9

Po godzinach wyszukiwania i testowania różnych kodów, w końcu znalazłem swój problem ... i jest to oczywiste, kiedy czytamy dokumentację Apple o "application: handleWatchKitExtensionRequest: reply:" poważnie ...

oto odpowiedź: (jest to w dokumentacji)

Zawartość słownika musi być możliwy do serializacji do pliku listy nieruchomości.

Co oznacza, że ​​obiekty mogą być tylko słowniki, tablice, ciągi znaków, liczby całkowite i (float), daty, dane binarne, lub Boolean wartości

... czuję niemych> <

+2

Życzę Apple dał lepszy komunikat o błędzie! – rdougan