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

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

+ Виджет расширения приложения Quotes Today

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

person Daniel Storm    schedule 03.06.2014    source источник


Ответы (5)


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

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

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

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

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

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

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

person sunseeker    schedule 04.06.2014
comment
Хорошо, здесь небольшая поправка. У меня получилось разместить кнопку над меткой, как было предложено выше, и следующий код: - (IBAction) goToApp: (id) sender {NSURL * url = [NSURL URLWithString: @floblog: //]; [self.extensionContext openURL: URL-адрес завершенияHandler: nil]; } Я связал это с событием Touch Up Inside. Однако это также приводит к запуску приложения, когда пользователь прокручивает представление «Сегодня». - person sunseeker; 06.06.2014
comment
Без проблем. У вас есть идея, как исправить поведение, которое я описал в своем последнем предложении? - person sunseeker; 07.06.2014
comment
Это происходит только тогда, когда вы прокручиваете, а ваш палец все еще находится на невидимой кнопке? - person CoderNinja; 07.06.2014
comment
Да, но этого не должно происходить и при прокрутке за пределами невидимой кнопки. В основном это должно происходить только при касании, но не при жесте прокрутки. - person sunseeker; 08.06.2014
comment
sunseeker, было бы здорово, если бы вы могли отредактировать свой ответ так, чтобы правильный ответ был показан всем :) - person teriiehina; 15.06.2014
comment
Это исправлено в бета-версии 2. - person Andrew; 18.06.2014
comment
Будущим читателям стоит отметить, что этот метод разрешен только в Today Extensions. - person BFar; 08.10.2014
comment
У меня тоже работает! Я потратил много времени даже после того, как использовал приведенный выше код, создав свой собственный экземпляр «NSExtensionContext» вместо простого использования «self.extensionContext», который упоминается в приведенном выше коде. Слава богу! Наконец я понял, что мне нужно просто использовать self.extensionContext. - person Ranganatha G V; 31.05.2016
comment
Вместо добавления пустой кнопки поверх метки для обработки вкладки я использую распознаватель жестов одним касанием. И после этого добавьте следующую функцию, которую я упомянул в селекторе. - (void) handleSingleTap: (UITapGestureRecognizer *) распознаватель {NSURL * myURL = [NSURL URLWithString: @AppUrlType: // home]; [self.extensionContext openURL: myURL completionHandler: nil]; } - person Panayot; 25.06.2017

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

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

Версия Swift 3

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

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

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

person Quanlong    schedule 24.08.2015
comment
Как можно было бы восстановить userActivity, как при поиске? Нужно ли нам создавать NSUserActivity в нашем TodayViewController в качестве виджета, к которому он обращается (т.е. перед вызовом openURL)? - person Ace Green; 12.10.2015
comment
На всякий случай, если кто-то еще такой же глупый, как я: этот URL Type находится на вкладке информации основного приложения, а не в виджете. - person Todd; 22.03.2019

Ответ @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 говорит в Обработка сценариев Commons:

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

person teriiehina    schedule 14.06.2014
comment
Будет ли это работать на симуляторе. Я получаю предупреждение о том, что этот URL не поддерживается ». - person Imran; 15.09.2014
comment
Схема hostingapp - это то, что вы должны установить в своем Infos.plist. Это может быть что угодно. Подробнее здесь: developer.apple.com/library/ios/documentation/iPhone/Conceptual/ в разделе" Реализация пользовательских схем URL ". - person teriiehina; 15.09.2014
comment
Для создания в вашем листе приложения URL-схемы hostingapp вы можете увидеть stackoverflow.com/questions/8201724/ @Mike S. - person Lito; 04.10.2014

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

person EPage_Ed    schedule 17.06.2014

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

person Mikita Manko    schedule 16.02.2017