ionic也是支持 schema 的,能够设置schema name,被其余app调用打开,也一样能够经过这个办法打开其余app,通常都是使用cordova的这个插件ios
https://github.com/EddyVerbruggen/Custom-URL-schemegit
插件很好用,文档也写的有够详细,通常的时候在ionic上彻底套用便可。angularjs
可是有一种状况下将有不一样,就是其余app使用shema url带有参数,ionic app要获取参数,而后根据参数进行后续处理的状况。github
好比:promise
<a href="mycoolapp://somepath?foo=bar">Open my app</a>
文档里描述,使用app
function handleOpenURL(url) { console.log("received url: " + url); }
看上去也很简单,可是....,这个handleOpenURL 是一个js的全局函数,也就是说没法在ionic的ctrl,service里直接使用。异步
鉴于此,有不少的办法,好比,先使用 handleOpenURL 函数获取url,而后将url存入 localStorage,而后在ionic代码里,好比$ionicPlatform.ready()
或 onDeviceReady()
里触发,localStorage里取出url进行后续处理,貌似是个好方法,可是我通过屡次试验,发现一个问题,js是异步执行的,将url存入 storage 并不必定总先于 取出 storage。存入是全局js函数,又没有好办法使用相似promise的方案,保证分别前后执行。ionic
这个时候天然会想到可否利用 事件 触发,用这个为线索,还真找到了一个接近完美的方案,直接看代码:函数
写一个module,将全局函数handleOpenUrl封装进去,并触发了一个rootScope的广播url
angular.module('MyCustomUrlHandler', []) .run(['$rootScope', '$window', function($rootScope, $window) { $window.handleOpenURL = function(url) { $rootScope.$broadcast('customURL', url); }; }]);
而后在须要处理url的地方,响应这个广播:
angular.module('MyApp', ['MyCustomUrlHandler']) .run(['$rootScope', function($rootScope) { $rootScope.$on('customURL', function(event, url) { alert('The URL is: ' + url); }); }]);
这个想法很是棒,解决了这个问题,同时也给咱们一个全局js 与 angularjs 进行通信的一个好方法。
若是有兴趣,能够回到原帖看看其余讨论,也有其余方案,可是我的以为这个最简介优雅:
https://forum.ionicframework.com/t/ios-url-schema-handling/3998/16