关于ionic的schema

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

相关文章
相关标签/搜索