Intereting Posts
Совместимость сеанса мультимедиа, не отображающая элементы управления Lockscreen на Pre-Lollipop Сценарий оболочки в android дает [: не найден Модернизация до градиента 2.1.0 причины – Не удалось развернуть ZIP-сообщение Ошибка выполнения теста: невозможно найти информацию о контроле для: ComponentInfo {} – ошибка, пытающаяся протестировать в IntelliJ с Gradle Перечисление usb для Android Lollipop RippleDrawable vs Selector for Pre-Lollipop Как настроить репозитории Git для разработки Android в Eclipse? Android: Как отправить сообщение программно с помощью приложения whats, We chat? Цвет текста стилей – Android Показать мягкую клавиатуру, даже если подключена аппаратная клавиатура XML-файлы layout-land не работают с onConfigurationChanged call back Обновить все столбцы в таблице ormlite базы данных в Android Android developpement, Gottox socket.io-java-client: file not fount Exception /socket.io/1/ Показывать нет в Android Studio в предварительном просмотре Android OpenGL ES 2, рисовые квадраты

Android / iOS – настройка пользовательского URI / протокола

Есть ли способ определить какой-то механизм обработки в Android и iOS, который позволил бы мне перехватить одно из следующих:

myapp:///events/3/ - or - http://myapp.com/events/3/ 

Я бы хотел «прослушать» протокол или хост и открыть соответствующий Activity / ViewController.

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

Для iOS, да, вы можете сделать две вещи:

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

  2. Установите обработчик протокола для обработки любой схемы, которая вам нравится.

Первый вариант довольно прост и описан в разделе «Внедрение настраиваемых схем URL-адресов» . Чтобы система узнала, что ваше приложение может обрабатывать данную схему:

  • Обновите Info.plist вашего приложения с помощью элемента CFBundleURLTypes

  • Реализовать -application:didFinishLaunchingWithOptions: в вашем -application:didFinishLaunchingWithOptions: приложения.

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

  • Создайте свой собственный подкласс NSURLProtocol .

  • Override +canInitWithRequest: обычно вы просто смотрите на схему URL и принимаете ее, если она соответствует схеме, которую вы хотите обработать, но вы также можете посмотреть на другие аспекты запроса.

  • Зарегистрируйте свой подкласс: [MyURLProtocol registerClass];

  • Override -startLoading и -stopLoading для запуска и прекращения загрузки запроса, соответственно.

Прочтите приведенные выше документы NSURLProtocol для получения дополнительной информации. Уровень сложности здесь во многом зависит от того, что вы пытаетесь реализовать. Обычно приложения iOS реализуют собственный обработчик URL-адресов, чтобы другие приложения могли выполнять простые запросы. Реализация вашего собственного HTTP или FTP-обработчика немного более сложна.

Для чего это стоит, именно так работает PhoneGap на iOS. PhoneGap включает подкласс NSURLProtocol под названием PGURLProtocol, который просматривает схему любого URL-адреса, которое приложение пытается загрузить и берет на себя, если это одна из схем, которые он распознает. PhoneGap с открытым исходным кодом – Кордова – вам может показаться полезным взглянуть.

EDIT 5/2014, так как это, кажется, популярный вопрос, я добавил много подробностей к ответу:

Android:

Для Android см. Intent Filter для запуска моей активности при нажатии пользовательского URI .

Вы используете фильтр намерений:

 <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" /> </intent-filter> 

Это связано с активностью, которую вы хотите запустить. Например:

 <activity android:name="com.MyCompany.MyApp.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="myapp" android:host="com.MyCompany.MyApp" /> </intent-filter> </activity> 

Затем в вашей деятельности, если она не выполняется, действие будет запущено с URI, переданным в Intent.

 Intent intent = getIntent(); Uri openUri = intent.getData(); 

Если он уже запущен, onNewIntent () будет вызываться в вашей активности, снова с URI в намерении.

Наконец, если вы хотите обрабатывать пользовательский протокол в UIWebView, размещенном в вашем родном приложении, вы можете использовать:

 myWebView.setWebViewClient(new WebViewClient() { public Boolean shouldOverrideUrlLoading(WebView view, String url) { // inspect the url for your protocol } }); 

IOS:

Для iOS обратитесь к Lauching App с URL-адресом (через handleApenURL UIApplicationDelegate), работающим под iOS 4, но не под iOS 3.2 .

Определите свою схему URL с помощью ключей Info.plist, аналогичных:

 <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>com.yourcompany.myapp</string> </dict> <dict> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> </array> </dict> </array> 

Затем определите функцию обработчика, которая будет вызвана в вашем делете приложения.

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // parse and validate the URL } 

Если вы хотите обрабатывать пользовательский протокол в UIWebViews, размещенном в вашем родном приложении, вы можете использовать метод UIWebViewDelegate:

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *urlPath = [request URL]; if (navigationType == UIWebViewNavigationTypeLinkClicked) { // inspect the [URL scheme], validate if ([[urlPath scheme] hasPrefix:@"myapp"]) { ... } } } 

}

Для WKWebView (iOS8 +) вместо этого вы можете использовать WKNavigationDelegate и этот метод:

 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSURL *urlPath = navigationAction.request.URL; if (navigationAction.navigationType == WKNavigationTypeLinkActivated) { // inspect the [URL scheme], validate if ([[urlPath scheme] hasPrefix:@"myapp"]) { // ... handle the request decisionHandler(WKNavigationActionPolicyCancel); return; } } //Pass back to the decision handler decisionHandler(WKNavigationActionPolicyAllow); } 

Для второго варианта в вашем вопросе:

 http://myapp.com/events/3/ 

В iOS 9 появилась новая технология, называемая Universal Links, которая позволяет перехватывать ссылки на ваш сайт, если они https: //

https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html