Проверьте, можно ли открыть URL-адрес из виджета iOS сегодня

Моя проблема в том, что я не могу узнать, можно ли открыть определенный URL-адрес из виджета iOS. Метод canOpenURL: недоступен в сегодняшнем виджете, потому что не существует класса UIApplication.

Более того, метод openURL: of NSExtensionContext возвращает ДА ​​для логического "успех", даже с недопустимым URL-адресом.

Приведенный ниже код входит в условие else (успех BOOL всегда YES), но в то же время симулятор показывает всплывающую ошибку, как вы можете видеть на прикрепленном изображении.

NSURL* invalidURL = [NSURL URLWithString:@"fake://blablabla"];
[self.extensionContext  openURL:invalidURL completionHandler:^(BOOL success) {
    if (success == NO) {
        DDLogWarn(@"Can't open URL: %@", invalidURL);
    }
    else{
        DDLogInfo(@"Successfully opened URL: %@",invalidURL);
    }
}];

введите здесь описание изображения


person andreacipriani    schedule 08.10.2015    source источник
comment
Вы пробовали это на реальном устройстве? Поведение может быть разным.   -  person Steve Wilford    schedule 08.10.2015


Ответы (2)


Это известная ошибка. Я подал эту проблему в Apple в прошлом году (rdar: // 18107612), когда была текущая iOS 8.0b5, и это все еще нерешенная проблема.

Сообщите о своей ошибке в Apple на странице http://bugreport.apple.com и надейтесь на лучшее.

person Tom Harrington    schedule 08.10.2015
comment
Спасибо что подметил это. Есть ли жизнеспособный обходной путь? Это было бы оценено. - person Arthur Gevorkyan; 09.10.2015
comment
Не очень хороший. Лучшее, что я могу придумать, - это проверить URL-адрес вашего основного приложения, а затем сохранить информацию в пользовательских значениях по умолчанию, чтобы указать, работает ли оно. Расширение могло это прочитать. Однако информация может быть устаревшей, если пользователь добавляет или удаляет приложения. - person Tom Harrington; 09.10.2015

Вы можете перейти к общему экземпляру UIApplication, используя performSelector:, что-то вроде

UIApplication *sharedApplication = [[UIApplication class] performSelector:NSSelectorFromString(@"sharedApplication")];

person Tim Johnsen    schedule 27.10.2015
comment
Я думаю, что это не общедоступный API, поэтому Apple откажется от любого приложения, использующего эту строку кода, не так ли? - person andreacipriani; 27.10.2015
comment
Это правда, если вы запутаете подпись метода, вы сможете пройти через - person Tim Johnsen; 27.10.2015
comment
запутайте его и добавьте NSDate проверку, чтобы убедиться, что вызов выполняется только после того, как истечет ожидаемая дата проверки приложения. А если серьезно, я не думаю, что вам следует это делать. - person Mazyod; 10.11.2015