Сегодня Виджет Расширения Приложения Нажмите, Чтобы Открыть Содержащее Приложение


я реализовал виджет сегодня для моего приложения + котировки, который отображает котировку дня в Центре уведомлений с помощью этих Apple Docs. То, что я хотел бы сделать, - это открыть содержащее приложение, в этом случае +Quotes, когда пользователь нажимает виджет +Quotes в своем представлении Today notification, не совсем уверен, как это назвать, как календарь, Если вы нажмете его в представлении Today. Я попытался наложить кнопку поверх метки, которая будет вызывать -(void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler после его нажатия, а затем откройте пользовательскую схему URL, которую я объявил, чтобы открыть содержащее приложение. Проблема в том, что он не открывает содержащее приложение.

-(IBAction)myButton:(id)sender {
    NSURL *customURL = [NSURL URLWithString:@"PositiveQuotes://"];
    [self openURL:customURL completionHandler:nil];
}
5 52

5 ответов:

EDIT: хорошо, просто небольшая поправка здесь. Я получил его работу с размещением кнопки над этикеткой так же, как предложил выше и следующий код:

- (IBAction) goToApp: (id)sender { 
    NSURL *url = [NSURL URLWithString:@"floblog://"];
    [self.extensionContext openURL:url completionHandler:nil]; 
  }

я связал его с событием "Touch Up Inside". Однако это также приводит к запуску приложения, когда пользователь прокручивает представление "сегодня".

=======================================

я столкнулся с такой же проблемой. Однако, похоже, что на данный момент нет решения, так как релиз Примечания для первой бета-версии iOS 8 упоминание:

известные проблемы: openURL не работает с расширением.

поэтому я думаю, что нам, по крайней мере, придется подождать до бета-2.

Swift 2 версия, согласно Apple Doc

extensionContext?.openURL(NSURL(string: "foo://")!, completionHandler: nil)

Swift 3 version

extensionContext?.open(URL(string: "foo://")! , completionHandler: nil)

и не забудьте добавить пользовательские схемы URL на Info.plist

enter image description here

ответ @sunseeker является хорошим, но он" скрыт " в комментариях. И поскольку принятый ответ говорит, что это невозможно, это может ввести в заблуждение посетителей.

этот код работает:

- (IBAction)launchHostingApp:(id)sender
{
  NSURL *pjURL = [NSURL URLWithString:@"hostingapp://home"];
  [self.extensionContext openURL:pjURL completionHandler:nil];
}

Я использую Xcode 6.0 (6A215l) с Yosemite Beta 1.

и, как Apple, говорится в Обработка Сценариев Общего Пользования:

расширение не говорит напрямую его содержащее приложение, чтобы открыть; вместо этого он использует openURL:completionHandler: метод NSExtensionContext, чтобы сообщить системе, чтобы открыть его содержащее приложение. Когда расширение использует этот метод для открытия URL-адреса, система проверяет запрос перед его выполнением.

еще один способ сделать это без добавления скрытой кнопки-Добавить UITapGestureRecognizer на UILabel (убедитесь, что на метке userInteractionEnabled установлено значение true). Проверьте состояние распознавателя в обработчике, чтобы убедиться, что вы достигли UIGestureReconizerStateEnded (а не отменены или не выполнены), а затем запустите код openUrl.

на всякий случай, вот версия для Swift 3 с версией обработки ошибок:

let myAppUrl = URL(string: "main-screen:")!
extensionContext?.open(myAppUrl, completionHandler: { (success) in
    if (!success) {
        print("error: failed to open app from Today Extension")
    }
})

чтобы заставить его работать, вам нужно открыть информацию о приложении.plist (open as source code) и в самом верху, после этого

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

добавьте следующее, чтобы приложение знало, какие URL-адреса оно должно обрабатывать Вот это пример о том, как открыть содержащее приложение и поделиться пользовательскими настройками по умолчанию между приложением и расширением.