让 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 接收消息。