/// <summary> /// JavaScript経由でWebページの値を取得する。 /// </summary> /// <param name="func">値取得後に実行する処理。</param> /// <param name="valueRawStr">メソッドの引数として記述する文字列。JavaScriptが記述可能。</param> /// <param name="dummy">WebGLで実行していない場合にダミーで渡すWebページの値。</param> /// <returns>実行結果。</returns> public IEnumerator GetWebPageValue(AfterGetDelegate <string> func, string valueRawStr, string dummy = null) { // 一意なIDを生成し、値取得後に実行する処理をプロパティに記録 int id = Interlocked.Increment(ref this.idCounter); string command = this.MakeSendMessageForGetWebPageValueEnd(id, valueRawStr); Debug.Log(command + " called."); if (!this.IsWeb()) { Debug.Log("WebGL環境外。ダミー処理を実行します。"); func(dummy); } else { // JavaScript経由でGetWebPageValueEndに結果を送信。結果が来るまで待つ Application.ExternalEval(command); int counter = 0; while (!this.results.ContainsKey(id)) { if (++counter > TimeOut) { throw new IOException("Webページが応答しません"); } yield return(null); } // 取得した結果で後処理を実行 func(this.results[id]); this.results.Remove(id); } }
/// <summary> /// WebGL実行時に認証トークンを取得する。 /// </summary> /// <param name="func">取得結果を受け取るデリゲート。</param> /// <returns>処理結果。</returns> public IEnumerator GetAuthToken(AfterGetDelegate <string> func) { if (!this.IsWeb()) { func(this.DummyAuthToken); } else { yield return(this.GetLocalStorage( TokenKey, (token) => { // ダブルクオーテーションで囲まれた文字列で来るので中身を渡す // ※ "null" が文字列で来たりもしているのでその場合消す if (token == null || token == "null") { func(null); } else { func(token.Trim('"')); } })); } }
/// <summary> /// WebGL実行時に言語設定を取得する。 /// </summary> /// <param name="func">取得結果を受け取るデリゲート。</param> /// <returns>処理結果。</returns> public IEnumerator GetLanguage(AfterGetDelegate <string> func) { if (!this.IsWeb()) { func(string.Empty); } else { yield return(this.GetUrl((url) => { var param = ParseQuery(url); string lang; if (param.TryGetValue("lang", out lang)) { func(lang); } })); } }
/// <summary> /// WebGL実行時にCookie情報を取得する。 /// </summary> /// <param name="func">取得結果を受け取るデリゲート。</param> /// <returns>実行結果。</returns> public IEnumerator GetCookies(AfterGetDelegate <IDictionary <string, string> > func) { // Cookieの内容を受け取り側メソッドに送信させる yield return(this.GetWebPageValue( (allCookies) => { IDictionary <string, string> cookies = new Dictionary <string, string>(); foreach (string cookieStr in allCookies.Split(';')) { string[] keyAndValue = cookieStr.Split('='); if (keyAndValue.Length >= 2) { cookies[keyAndValue[0]] = keyAndValue[1]; } } func(cookies); }, "(document.cookie || '')")); }
/// <summary> /// WebGL実行時にステージIDを取得する。 /// </summary> /// <param name="func">取得結果を受け取るデリゲート。</param> /// <returns>処理結果。</returns> public IEnumerator GetStageId(AfterGetDelegate <int> func) { if (!this.IsWeb()) { func(this.DummyStageId); } else { yield return(this.GetUrl((url) => { var param = ParseQuery(url); int id; string idStr; if (param.TryGetValue("stage_id", out idStr) && int.TryParse(idStr, out id)) { func(id); } })); } }
/// <summary> /// WebGL実行時にページURL情報を取得する。 /// </summary> /// <param name="func">取得結果を受け取るデリゲート。</param> /// <returns>実行結果。</returns> public IEnumerator GetUrl(AfterGetDelegate <string> func) { // ページのURLを受け取り側メソッドに送信させる yield return(this.GetWebPageValue(func, "window.location.href", "http://localhost/")); }
/// <summary> /// WebGL実行時にローカルストレージ情報を取得する。 /// </summary> /// <param name="key">ローカルストレージのキー。</param> /// <param name="func">取得結果を受け取るデリゲート。</param> /// <returns>実行結果。</returns> public IEnumerator GetLocalStorage(string key, AfterGetDelegate <string> func) { // ローカルストレージの内容を受け取り側メソッドに送信させる yield return(this.GetWebPageValue(func, "(window.localStorage.getItem('" + key + "') || '')")); }