安卓/ iOS版 - 自定义的URI /协议处理(Android / iOS - Custom UR

2019-06-14 19:13发布

有没有一种方法来定义某种在Android iOS的处理机制,可以让我做拦截以下任一操作:

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

我想“听”为任一协议或者主机,并打开相应的活动/ ViewController中。

我想太多,如果这些可以作为全系统成为可能。 我想这将是更多的在iOS上的问题,但我想最好能够单击这两个方案,超链接,任何应用程序。 Gmail中,Safari等

Answer 1:

更新:这是一个很老的问题,事情已经两个iOS和Android发生了很大变化。 我会离开原来答案在下面,但任何人工作的一个新项目或更新旧的,而不是应该考虑使用深层链接 ,这是支持这两个平台上。

在iOS上,深层链接被称为通用连接 。 你需要在你的网站,你的应用程序与指向你的网站的网址,部分关联创建一个JSON文件。 接下来,更新您的应用程序接受NSUserActivity对象,并设置该应用以显示对应于给定的URL的内容。 您还需要一个授权添加到应用程序的列表,它的应用程序可以处理的URL。 在使用时,操作系统会从您的网站下载关联文件和启动您的应用程序的照顾,当有人试图打开您的应用程序处理的其中一个网址。

设置在Android上的应用链接工作方式类似。 首先,您将设置你的网站(S)和你的应用程序之间的关联,然后您将添加意图过滤器 ,让你的应用程序拦截试图打开您的应用程序能够处理的URL。

虽然细节有明显的不同,这种方法是非常两个平台上是相同的。 它使您能够将您的应用程序到您的网站内容的显示不管是什么应用程序试图访问内容的能力。


原来的答案:

对于iOS,是的,你可以做两件事情:

  1. 让你的应用程序公布它能够处理的URL与给定的方案。

  2. 安装协议处理程序来处理你喜欢的任何方案。

第一个选项是非常简单的,并描述在实现自定义URL方案 。 为了让系统知道你的应用程序可以处理一个给定的方案:

  • 用CFBundleURLTypes项更新应用的Info.plist

  • 实现-application:didFinishLaunchingWithOptions:在您的应用程序委托。

第二种可能性是写自己的协议处理程序。 这只有在您的应用程序,但你可以结合上述技术使用它。 使用上面的方法来获得系统启动您的应用程序对于给定的URL,然后你的应用程序中使用自定义URL协议处理程序利用的iOS的网址加载系统的功率:

  • 创建一个自己的子类NSURLProtocol

  • 覆盖+canInitWithRequest: -通常你只要看看URL方案,如果你要处理的方案相匹配接受它,但你可以在请求的其他方面看也是如此。

  • 注册您的子类: [MyURLProtocol registerClass];

  • 覆盖-startLoading-stopLoading分别启动和停止加载的要求。

阅读上面链接以获取更多信息NSURLProtocol文档。 这里的难度很大程度上取决于你想实现什么。 这是常见的iOS应用程序来实现自定义URL处理程序,以便其他应用程序可以使简单的请求。 实现你自己的HTTP或FTP处理是一个比较复杂。

对于它的价值,这是PhoneGap的究竟是如何适用于iOS。 PhoneGap的包括一个名为PGURLProtocol的NSURLProtocol子类,着眼于应用程序试图加载任何URL的方案和接管,如果它是它识别方案之一。 PhoneGap的开源表弟是科尔多瓦 -你可能会发现它有助于看看。



Answer 2:

编辑2014分之5,因为这似乎是一个流行的问题,我已经添加了很多细节的答案:

安卓:

对于Android,是指意图过滤器点击自定义的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 = 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,请参阅空空应用程序与URL(通过UIApplicationDelegate的handleOpenURL)的iOS 4下工作,但不是的iOS 3.2下 。

通过类似的Info.plist键定义URL方案:

<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程序(iOS 8 +),你可以改用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);
}


Answer 3:

对于你的问题的第二个选项:

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

有与iOS 9中引入了新的技术,称为通用连接,它允许你拦截链接到你的网站,如果他们是https://开头

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



文章来源: Android / iOS - Custom URI / Protocol Handling