Android / iOS-URI personnalisé / gestion du protocole

est-il une façon de définir une sorte de mécanisme de manipulation dans Android et iOS qui me permettrait d'intercepter l'un des suivants:

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

j'aimerais "écouter" soit le protocole, soit l'hôte, et ouvrir un contrôleur D'activité / de vue correspondant.

j'aimerais aussi que ceux-ci soient aussi larges que possible. J'imagine que ce sera plus un problème sur iOS, mais je serais idéalement en mesure de cliquer l'un ou l'autre de ces deux schémas, sous forme d'hyperliens, à partir de n'importe quelle application. Gmail, Safari,etc.

43
demandé sur qub1n 2012-07-11 00:03:24

3 réponses

mise à Jour: C'est une très vieille question, et les choses ont beaucoup changé sur les deux iOS et Android. Je vais laisser la réponse originale ci-dessous , mais quiconque travaille sur un nouveau projet ou la mise à jour d'un ancien devrait plutôt envisager d'utiliser liens profonds , qui sont pris en charge sur les deux plateformes.

sur iOS, deep links sont appelés universal links . Vous aurez besoin de créer un fichier JSON sur votre site web qui associe votre application avec des URL qui pointent vers des parties de votre site web. Ensuite, mettez à jour votre application pour accepter un objet NSUserActivity et configurez l'application pour afficher le contenu qui correspond à l'URL donnée. Vous devez également ajouter un droit à l'application liste les Url que l'application peut gérer. En cours d'utilisation, le système d'exploitation prend soin de télécharger le fichier d'association à partir de votre site et de démarrer votre application lorsque quelqu'un essaie d'ouvrir l'une des URLs que votre application gère.

up liens app sur Android fonctionne de façon similaire. Tout d'abord, vous établirez une association entre votre site web et votre application, puis vous ajouterez filtres d'intention qui permettent à votre application d'intercepter les tentatives d'ouvrir les URLs que votre application peut gérer.

Bien que les détails sont évidemment différents, l'approche est sensiblement la même sur les deux plateformes. Il vous donne la possibilité d'insérer votre application dans l'affichage de votre site web contenu quelle que soit l'application tente d'accéder à ce contenu.


réponse originale:

pour iOS, oui, vous pouvez faire deux choses:

  1. demandez à votre application d'annoncer qu'elle peut gérer des URL avec un schéma donné.

  2. installez un gestionnaire de protocole pour gérer le schéma que vous voulez.

la première option est assez simple, et décrite dans implémenter des schémas D'URL personnalisés . Pour faire savoir au système que votre application peut gérer un schéma donné:

  • mise à jour de votre application Info.plist avec un CFBundleURLTypes entrée

  • mettre en œuvre -application:didFinishLaunchingWithOptions: dans votre application délégué.

la seconde possibilité est d'écrire votre propre gestionnaire de protocole. Cela ne fonctionne que dans votre application, mais vous pouvez l'utiliser en conjonction avec la technique décrite ci-dessus. Utilisez la méthode ci-dessus pour obtenir le système de lancer votre application pour une URL donnée, puis utilisez un gestionnaire de protocole D'URL personnalisé dans votre application pour tirer parti de la puissance du système de chargement D'URL de iOS:

  • créez votre propre sous-classe de NSURLProtocol .

  • Override +canInitWithRequest: -- habituellement, vous allez simplement regarder le schéma D'URL et l'accepter s'il correspond au schéma que vous voulez gérer, mais vous pouvez aussi regarder d'autres aspects de la requête.

  • enregistrez votre sous-classe: [MyURLProtocol registerClass];

  • outrepasser -startLoading et -stopLoading pour démarrer et arrêter le chargement de la requête, respectivement.

lire les docs Nurlprotocol liés ci-dessus pour plus d'informations. Le niveau de difficulté dépend largement de ce que vous essayez de mettre en œuvre. Il est courant que les applications iOS implémentent un gestionnaire D'URL personnalisé pour que les autres applications puissent faire des requêtes simples. Implémenter votre propre gestionnaire HTTP ou FTP est un peu plus compliqué.

pour ce que ça vaut, C'est exactement comme ça que fonctionne PhoneGap sur iOS. PhoneGap comprend une sous-classe de Nslprotocol appelée PGURLProtocol qui regarde le schéma de N'importe quelle URL que l'application essaie de charger et prend en charge si c'est un des schémas qu'elle reconnaît. Le cousin open-source de PhoneGap est Cordova -- vous pouvez trouver utile de jeter un oeil.

19
répondu Caleb 2018-06-08 12:31:45

MODIFIER 5/2014, comme cela semble être une question populaire, j'ai ajouté beaucoup de détails à la réponse:

Android:

pour Android, se référer à intention de lancer mon activité lorsque l'URI personnalisé est cliqué .

vous utilisez un filtre d'intention:

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

ceci est attaché à L'activité que vous voulez lancer. Par exemple:

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

alors, dans votre activité, si elle n'est pas en cours d'exécution, l'activité sera lancée avec L'URI passé dans l'intention.

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

si déjà en cours d'exécution, onNewIntent() sera appelé dans votre activité, encore une fois avec L'URI dans l'intention.

enfin, si vous voulez gérer le protocole personnalisé dans UIWebView hébergé dans votre application native, vous pouvez utiliser:

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

iOS:

pour iOS, référez-vous à application de Lauching avec URL (via uiapplicationdelegate's handleOpenURL) travaillant sous iOS 4, mais pas sous iOS 3.2 .

Définissez votre schéma D'URL via Info.clés plist similaires à:

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

puis définir une fonction de gestionnaire pour être appelé dans votre délégué app

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

si vous voulez manipuler le protocole personnalisé dans UIWebViews hébergé dans votre application native, vous pouvez utiliser la méthode 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"]) 
    {
      ...
    }
  }
}

}

pour WKWebView (iOS8+), vous pouvez à la place utiliser un WKNavigationDelegate et cette méthode:

- (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);
}
75
répondu CSmith 2017-05-23 11:54:37

pour la deuxième option dans votre question:

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

il y avait une nouvelle technique introduite avec iOS 9, appelée liens universels qui vous permet d'intercepter les liens vers votre site web, s'ils sont https: / /

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

1
répondu Gregory Cosmo Haun 2016-10-20 17:46:42