Сегодня виджет расширения приложения Нажмите, чтобы открыть содержащее приложение

Я реализовал виджет "Сегодня" для своего приложения + цитаты, который отображает дневную цитату в центре уведомлений с помощью этих документов Apple. Я хотел бы открыть открывающее приложение, в данном случае +Quotes, когда пользователь нажимает на виджет +Quotes в своем представлении уведомлений Today, не совсем уверенный, как это вызвать, как в Calendar, если вы нажали его в Сегодня посмотреть. Я попытался наложить кнопку на ярлык, который будет вызывать -(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 ответов

Решение

РЕДАКТИРОВАТЬ: Хорошо, просто небольшая коррекция здесь. Я работал с размещением кнопки над ярлыком, как предложено выше, и со следующим кодом:

- (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

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

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

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

Ответ @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: завершении Handler: метод 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")
    }
})

Чтобы это работало, вам нужно открыть info.plist приложения (открыть как исходный код) и в самом верху, после этого

<?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-адресами оно должно работать. Вот полный пример того, как открыть содержащее приложение и обмениваться пользовательскими настройками по умолчанию между приложением и расширением.

Другие вопросы по тегам