如何在 Cordova/Phonegap 应用程序中提供和处理深度链接

12

你好,我想了解一下在我的Sencha Touch / Cordova应用程序中公开和处理深度链接的Cordova / Phonegap插件或方法。

到目前为止,我已经能够深度链接到其他应用程序,例如打开Google Play到特定的应用程序详细页面。

使用这个插件https://github.com/code4jhon/org.apache.cordova.startapp

因此,我想要做的就是使其他应用程序能够打开我的应用程序中的特定视图或功能。 我想支持Android和IOS。

所以底线是有没有适用于Android的Cordova插件来公开活动及其在IOS上的对应物?

还是如何实现这一点?

查看了Cordova文档,但没有找到任何信息...任何帮助、文档链接将不胜感激。

4个回答

14

我尝试将函数定义在独立的文件中并警报URL,但没有成功...嗯 - code4jhon
从另一个 PhoneGap 插件 https://github.com/code4jhon/org.apache.cordova.startapp 打开目标应用程序会防止 handleOpenUrl 被触发吗? - code4jhon
你可以在index.html中,在cordova.js引用之前,使用一个单独的脚本标签定义handleOpenUrl函数。你有几种选择,这只是一个js的问题。 - mentat
安装后记得清理/构建您可以处理实现handleOpenURL的变量function handleOpenURL(url) { console.log("received url: " + url); } - Reign.85
@mentat 您在哪个位置定义 handleOpenURL() 函数?对我来说,只有在 index.html 中定义它时才会被调用。从 index.html 中,我无法更改应用程序的状态,因为我无法获取应用程序的作用域。 - Bej
显示剩余2条评论

5
我使用Branch Metrics完成了此操作。他们是一家新创企业,非常出色。
查看他们的cordova插件文档,了解有关深层链接的信息:
https://github.com/BranchMetrics/Branch-PhoneGap-Cordova-SDK#initialize-sdk-and-register-deep-link-routing-function
我建议您阅读他们的所有文档,以了解该怎么做。但是,使用Ionicframework和AngularJS,我构建了一个服务,您可以在应用程序中使用:
https://gist.github.com/sean-hill/627fa40f96577baae378
使用Branch的插件构建项目后,请按照以下步骤配置iOS和Android。
iOS
将此添加到您的`.plist`文件中:
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>yourappname</string>
        </array>
    </dict>
</array>

然后运行cordova build ios; cordova emulate ios。为了检查它是否工作正常,打开模拟器,进入Safari并输入yourappname://,看看是否重定向到您的应用程序。

Android

在构建Android后,将以下内容添加到您的AndroidManifest.xml文件中:

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

将以下代码添加到您的config.xml文件中:
<preference name="AndroidLaunchMode" value="singleTask" />

然后重新构建,你就可以成功实现深层链接!

根据@Deminetix的请求,这是我如何关闭Branch会话。

document.addEventListener("pause", function(){
    var branch = window.Branch;
    branch.closeSession();  
}, false);

玩得开心,编程愉快 :)


修改Cordova的config.xml文件中的preference,加上+1。你为什么不使用生命周期事件,比如Branch.closeSession()呢? - Deminetix
当 Android 应用处于后台时,单击链接会发生什么?由于它已经被初始化,因此不会看到它。 - Deminetix
嘿@Deminetix,我确实有生命周期事件,就像我刚刚更新的答案一样。当用户在手机上点击Branch链接时,Branch Metrics在后台进行深度链接并运行您的代码,其中有一些神奇的东西。 - sean-hill

5

该插件已经过时。 - Sohrab Taee

1

我认为我们不能使用Cordova插件来做这个。整个Cordova及其插件的意图是在应用程序中建立和执行网页与本地代码之间的通信。

在你的情况下,你正在尝试允许其他应用程序在你的应用程序中使用深层链接。这只能通过Android的intent-filter和iOS的custom-app-url来实现。

appurl.org有一些非常好的逐步教程,可以帮助您处理自定义URL。请查看以下链接:


感谢@ChitranshuAsthana提供的帮助,但在Android Activity或Objective C方法中如何打开Sencha Touch视图? http://stackoverflow.com/questions/25223642/how-to-open-a-sencha-touch-view-from-an-android-activity-or-objective-c-method 仍然无法弥合这个差距... - code4jhon
你所启动的活动必须派生自CordovaActivity。你可以获取webView并调用loadURL。由于你提到你正在使用sencha,我建议你研究一下sencha中的路由机制。路由将帮助你在事件上启动不同的Sencha控制器。 - Chitranshu Asthana
谢谢@ChitranshuAsthana,很有道理,是的,我正在看路由。虽然这种方法仍然让我需要解决ios的问题...我会尝试mentat的建议https://github.com/EddyVerbruggen/LaunchMyApp-PhoneGap-Plugin并回来 - code4jhon
呵呵呵,我打算把奖励给予Mentat。 - code4jhon
哎呀..能撤销吗? - Chitranshu Asthana
我看不到,但你无论如何也帮了我 :) - code4jhon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接