關於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

相關文章
相關標籤/搜索