让 Ionic 应用出现在“分享”列表中并接收数据

Posted

技术标签:

【中文标题】让 Ionic 应用出现在“分享”列表中并接收数据【英文标题】:Make Ionic app appear in "Share" list and receive data 【发布时间】:2017-09-28 11:13:19 【问题描述】:

当用户单击图像的共享按钮时,我试图让 Ionic 应用程序出现在“共享”列表中。

据我所知,我必须添加类似

<intent-filter> 
   <action android:name="android.intent.action.SEND" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="image/*" />
</intent-filter>

AndroidManifest.xml。我想我可以使用cordova-custom-config plugin 来做到这一点。 然后我必须以某种方式处理这个意图,这对我来说很棘手。似乎目前唯一为意图维护的科尔多瓦插件是this one。我试过这样使用它:

  initializeApp() 
    this.platform.ready().then(() => 
      // Okay, so the platform is ready and our plugins are available.
      // Here you can do any higher level native things you might need.
      this.statusBar.styleDefault();
      this.splashScreen.hide();
      this.registerBroadcastReceiver();
    );
  
  private registerBroadcastReceiver()
      window.plugins.intentShim.registerBroadcastReceiver(
          filterActions: [
              'com.darryncampbell.cordova.plugin.broadcastIntent.ACTION'
              ]
          ,
          function(intent) 
              //  Broadcast received
              console.log('Received Intent: ' + JSON.stringify(intent.extras));
          
      );
  

但是这样我会收到一个错误,即 window.plugins 未定义。 我真的不知道如何将它与 Ionic 集成

此外,这仅适用于 Android,我希望也适用于 iOS。 This SO question 是相关的,并提到了一种为 ios 执行此操作的方法,但它已有 4 年的历史(链接的 iOS 部分为 5 年),并且答案中为 Android 指定的项目 webintent 甚至不再存在。

如果有人可以在这里帮助我,那就太好了。

也相关:

Cordova receive shared data from other app - 使用过时的插件,window.plugins,特定于 Android。 Sending url to ionic android app via webintents from another app - 使用过时的插件,window.plugins,特定于 Android。

更新

所有答案都只针对 Android,我真的希望有人可以为我指出 iOS 的正确方向,因为我更需要它......

最终结论和赏金

赏金 经过长时间的考虑,我决定将赏金交给@Ghandi。虽然没有人能给出完整的答案,但他是唯一一个试图回答整个问题的人——包括 iOS 部分。我没想到会有完整的代码解决方案,只是为 Android 和 iOS 指明了正确方向,而这正是他最接近所有答案的地方。我知道这是一个非常广泛的问题,我要感谢所有花时间回答和/或评论这个问题的人。

对于其他试图完成同样事情的人,这是我对所有研究和答案的总结

安卓 正如我在上面的问题中已经描述的那样,您必须将这些行添加到AndroidManifest.xml。然后,Android 将使您的应用出现在共享列表中。您的应用收到的数据必须通过所谓的Intent 进行处理。为此,您可以使用Ionic Native - Web Intent。从 9.5.2017 开始,这将无法正常工作,因为 Ionic Native 正在使用的插件不再存在。然而,我创建了一个issue on Github,我被告知下一个版本的 Ionic Native(我认为是 3.7.0)应该在接下来的两周内发布,应该使用我在我的上面的问题已经。这解决了您必须自己玩弄 Ionic 框架并简单地使用 Ionic Native 的问题。

iOS 在 iOS 中,它似乎有点棘手,而且在网络上也找不到它。最好按照@Ghandi 在下面的答案中提供的链接。

【问题讨论】:

让我知道它是否有效.. 谢谢,过几天试试。关于如何在 iOS 中执行此操作的任何想法? @bergben 以下链接应该可以帮助您 - ***.com/questions/42384763/… ***.com/questions/13350857/… 特别是 devanshsadhotra 的 cmets @bergben 就 ios 而言,不幸的是,据我所知,您没有现成的插件来实现这一目标 @bergben 您期望答案被接受的附加信息是什么?请介绍一下 【参考方案1】:

经过详细分析,我可以得出以下结论:

在 Android 中,您可以使用 cordova-plugin-intent 将您的应用程序添加到共享列表中,如 here 所述。您也可以通过在活动中添加意图过滤器来实现这一点,如here 所述

在 iOS 中,这有点棘手,因为没有直接的插件或现成的解决方案可以实现这一点。但与在 iOS 共享菜单中添加应用程序相关的最佳链接是 getting listed in share menu 该链接包括执行此操作的苹果文档以及 Info.plist 中的一些调整以实现此目的。

这是我能想到的最佳答案。希望能帮助到你。干杯。

【讨论】:

有什么方法可以让我们在 iOS 中使用相同的 webintent 共享功能,就像在 android 中使用 cordova intent 一样。并让我们的应用进入共享列表?【参考方案2】:

为了运行插件https://github.com/darryncampbell/darryncampbell-cordova-plugin-intent, 试试:

使用--save 安装插件以确保插件已添加到您的config.xml

ionic plugin add https://github.com/darryncampbell/darryncampbell-cordova-plugin-intent --save

由于ionic-native中没有导入这个插件,所以需要识别全局对象。这将在插件文件夹->plugin.xml 中声明。这里的对象是intentShim

   <js-module name="IntentShim" src="www/IntentShim.js">
      <clobbers target="intentShim" />
  </js-module>

在您的代码中将全局对象声明为:

declare var intentShim:any;

在你的函数中,

private registerBroadcastReceiver()
  intentShim.registerBroadcastReceiver(
      filterActions: [
          'com.darryncampbell.cordova.plugin.broadcastIntent.ACTION'
          ]
      ,
      function(intent) 
          //  Broadcast received
          console.log('Received Intent: ' + JSON.stringify(intent.extras));
      
  );

【讨论】:

我是 ionic 新手。你上面的'declare var intentShim:any'代码,它在哪里?它看起来不像打字稿 它就在您在 ts 文件中导入之后。您正在声明一个全局对象来告诉打字稿编译器。 @AmbroseLeung @AmbroseLeung 检查typescriptlang.org/docs/handbook/declaration-files/… 我现在在 pages/home/home.ts 下有它,但是当我从我的移动浏览器共享一个 url 时,“接收到的意图”代码不会被调用(我在我的使用 ionic cordova 的手机运行 android -l -c)【参考方案3】:

试试

window.intentShim.registerBroadcastReceiver

或者调用里面的函数

document.addEventListener('deviceready', function()
    registerBroadcastReceiver() , 
false);

【讨论】:

【参考方案4】:

您可以通过 ionic 提供的 webIntent 插件发送或接收数据。

Ionic:
   Ionic CLI          : 5.0.2 (C:\Windows\System32\node_modules\ionic)
   Ionic Framework    : ionic-angular 3.9.5
   @ionic/app-scripts : 3.2.2

Cordova:
   Cordova CLI       : 9.0.0 (cordova-lib@9.0.1)
   Cordova Platforms : android 8.0.0
   Cordova Plugins   : cordova-plugin-ionic-keyboard 2.1.3, cordova-plugin-ionic-webview 4.1.0, (and 5 other plugins)

Utility:
   cordova-res : not installed
   native-run  : 0.2.5

System:
   Android SDK Tools : 26.1.1 (D:\Android\Sdk)
   NodeJS            : v12.4.0 (D:\node.exe)
   npm               : 6.9.0
   OS                : Windows 8.1

插件安装命令:

ionic cordova plugin add com-darryncampbell-cordova-plugin-intent
npm install --save @ionic-native/web-intent@4

接收数据的代码:(在提供程序中添加“Web-Intent”)

import  WebIntent  from '@ionic-native/web-intent';

clickMe() 
    console.log('clicked')
    this.webIntent.getIntent().then((data) => 
      console.log('Success', data);
    ,
    err => 
      console.log('Error', err);
    );
  

【讨论】:

以上是关于让 Ionic 应用出现在“分享”列表中并接收数据的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 React Native 应用出现在 android 的分享列表中

Ionic Cordova:Push Notification 插件 onMessage 接收消息。

如何将数据设置到服务中并进入另一个页面 Ionic 4/5

使用 listView 和 PouchDb 的 Ionic (v1) 应用程序出现问题

在接收推送通知时获取数据 - ionic3

一些图像没有出现在我的 ionic 3 列表中