UIApplicationDelegate в приложении для iPhone никогда не вызывал response() в -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]

Итак, я делаю это приложение для Apple Watch, и в моем приложении для часов у меня есть кнопка. При касании кнопки происходит следующее:

[WKInterfaceController openParentApplication:[NSDictionary dictionary] reply:^(NSDictionary *replyInfo, NSError *error) {
    if(error) {
        NSLog(@"%@",error);
    }
}];

И в моем файле App Delegate я делаю это:

-(void) application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply {
    //Code that is not importent and is confidential
    reply([NSDictionary dictionary]);
}

Тем не менее, я получаю эту ошибку, когда нажимаю кнопку:

Домен ошибки = com.apple.watchkit.errors Code = 2 «UIApplicationDelegate в приложении для iPhone никогда не вызывал ответ () в -[приложение UIApplicationDelegate: handleWatchKitExtensionRequest: ответ:]» UserInfo = 0x7fd2b9c35ae0 {NSLocalizedDescription = UIApplicationDelegate в приложении для iPhone никогда вызывается response() в -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]}

Я звоню reply(), как показано выше, но он этого не видит! Кроме того, он игнорирует другой код, который у меня есть!

Кто-нибудь может объяснить, почему это происходит?


person Nerdy Lime Apps    schedule 23.03.2015    source источник
comment
Никогда не использовал это, я бы обратился к документации, в которой говорится: Because this method is likely to be called while your app is in the background, call the beginBackgroundTaskWithName:expirationHandler: method at the start of your implementation and the endBackgroundTask: method after you have processed the reply and executed the reply block. Starting a background task ensures that your app is not suspended before it has a chance to send its reply. Так что, возможно, попробуйте.   -  person Louis Tur    schedule 24.03.2015
comment
@LouisTur Спасибо за комментарий! Не могли бы вы привести пример этих методов, потому что у меня возникли проблемы с их реализацией?   -  person Nerdy Lime Apps    schedule 24.03.2015
comment
Обоснованное предположение, попробуйте удалить строки кода, которые у вас есть в методе handleWatch, и сообщите нам о результатах.   -  person Ashraf Tawfeeq    schedule 24.03.2015
comment
Пожалуйста, проверьте мой ответ здесь: stackoverflow.com/a/31994232   -  person Lonkly    schedule 31.08.2015


Ответы (4)


Из документации:

answerInfo: словарь, содержащий данные для возврата в приложение WatchKit. Содержимое словаря должно сериализоваться в файл списка свойств. Содержание этого словаря на ваше усмотрение, и вы можете указать nil.

Если вы не отправите действительный словарь, вы не получите ответа.

person david72    schedule 29.05.2015

Всю работу в handleWatchKitExtensionRequest необходимо выполнять в фоновой задаче. Вы можете найти документацию здесь: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Этот пост в блоге также может оказаться полезным: http://www.fiveminutewatchkit.com/blog/2015/3/11/one-weird-trick-to-fix-openparentapplicationreply

person bgilham    schedule 24.03.2015
comment
Итак, я кое-что менял и пробовал то, что вы, ребята, предложили. Вот мой новый код (он не работает): - person Nerdy Lime Apps; 26.03.2015
comment
В приложении для часов (кнопка): NSLog(@нажата кнопка); [WKInterfaceController openParentApplication: [словарь NSDictionary] ответ: ^(NSDictionary *replyInfo, NSError *error) { if(error) { NSLog(@%@,replyInfo); NSLog(@%@,ошибка); } }]; NSLog(@приложение открыто?); - person Nerdy Lime Apps; 26.03.2015
comment
В приложении для iPhone (которое даже не вызывается): - (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier { } - (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(NSString *)taskName expireHandler:(void (^)(void))handler { NSLog(@ backgroundBegunDelegate?); вернуть UIBackgroundTaskInvalid; } - person Nerdy Lime Apps; 26.03.2015
comment
- (void)application:(UIApplication*)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo answer:(void (^)(NSDictionary *))reply { NSLog(@in handle watch); //конфиденциальный код, который выдает, что представляет собой приложение (использует UILocalNotification, если это важно) if (success) { // логическое значение, которое я сделал ранее в функции answer(@{YES :@Success}); } еще { ответ(@{НЕТ :@Успех}); } } - person Nerdy Lime Apps; 26.03.2015
comment
Мой вывод: кнопка нажата, приложение открыто? каждый раз, когда я нажимаю кнопку. Я не знаю, почему это не работает! - person Nerdy Lime Apps; 26.03.2015

Ошибка «Error Domain=com.apple.watchkit.errors Code=2 «UIApplicationDelegate в приложении iPhone никогда не вызывал ответ() в -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]» обычно означает, что в handleWatchKitExtensionRequest вашего приложения возникла ошибка и /или не вызвал ответ() или вызвал его правильно.

Документация находится здесь: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:handleWatchKitExtensionRequest:reply:

Вот небольшой пример кода с использованием ответа NSDictionary.

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply{
    NSLog(@"containing app received message from watch");
    NSDictionary *response = @{@"response" : @"MyResponse"};
    reply(response);
}
person Bill Bunting    schedule 13.05.2015

У вас могут возникнуть проблемы, если ваш словарь включает пользовательские классы. Попробуйте сначала отправить простые строки и посмотрите, будет ли это иметь значение.

Убедитесь, что ваш «важный и конфиденциальный» код не вызывает исключения, или завершите работу без ответа (например, с сообщением об ошибке).

Ваш «важный и конфиденциальный» код должен быть очень быстрым. Если это не так, вы должны использовать фоновая задача (см. здесь примеры).

Наконец, рассмотрите возможность использования фоновой задачи, если ваш код требует времени, требует доступа к сети. Если вы используете асинхронные сетевые задачи (рекомендуется), ответьте, когда получите ответ, и завершите фоновую задачу в это время.

И последнее, но не менее важное: первый вызов parentApplication не работает в некоторых версиях iOS: Непоследовательное поведение openParentApplication в моем приложении WatchKit. Это решило последнюю проблему для меня!

Надеюсь, это поможет ;-)

person blackbox    schedule 14.08.2015