Yokin's 2ch Browser を Windows ストアアプリで公開

2015年3月から2ch専用ブラウザに関して2ch運営元の方針変更により当アプリはWindowsストアから撤去する予定です。ご利用ありがとうございました。

Windows 8/RT のいわゆるストアアプリ (Windows Store App)のプログラミングから登録手続きまでの流れの学習を兼ねて作成しました。2chリーダーです。アプリストアで検索したところでは、いまだ2chリーダーは登録されていないようでしたので、気合を入れて作ってみました。Androidでは 2chMate にいつもお世話になっているので、仕様は2chMateを強く意識した作りにしました。

http://apps.microsoft.com/windows/ja-JP/app/yokins-2ch-browser/203ac772-a869-4c3d-ac09-0e5d9b4499a1

主な実装済みの機能は

  • 板一覧 -> スレッド一覧 -> 記

    事 までの UIをWindowsアプリの作法でナビゲーション

  • 各板のバナー画像を自動的に取得
  • URLからブラウザを起動
  • 書き込み内の画像リンクとYoutubeリンクのサムネイルを表示

近く実装したい機能は

  • スレッドのソート
  • 記事のソート機能(タグによる参照順など)
  • IDによるフィルター
  • 各種設定画面の追加

いずれ必要な機能は

  • Sync2ch 対応
  • 書き込みの機能

各所でお世話になっていることもあり、アプリ自体はフリーですが、Microsoft Advertising の広告を使用しています。Microsoftアプリストアを通じてダウンロード数や、ユーザーの反響などが得られるようなので、そちらを通じても、応援いただけたら機能追加の励みになります。

 

 

Androidの非同期通知機能 Google Cloud Messaging (GCM) のサーバー側コードをC#で書いてみた

.NETの標準以外に Newtonsoft のJSON.NETを使用します。http://james.newtonking.com/pages/json-net.aspx
使い方は

    var container = new Google.GoogleCloudMessaging.Container {
        RegistrationIds = new String [] { "APA*******PQZQ" },
        Data = new { message = "Hello World!" }
    };
    var response = Google.GoogleCloudMessaging.Broadcast( "AIz************", container );

のようになります。

------------------------------

 

using System;
using System.Net;

using Newtonsoft.Json;

namespace Google
{
    public class GoogleCloudMessaging
    {
        public class Container
        {
            [JsonProperty("registration_ids")]
            public String[] RegistrationIds { get; set; }
            [JsonProperty("collapse_key", NullValueHandling=NullValueHandling.Ignore )]
            public String CollapseKey { get; set; }
            [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)]
            public object Data { get; set; }
            [JsonProperty("delay_while_idle", NullValueHandling = NullValueHandling.Ignore)]
            public Boolean? DelayWhileIdle { get; set; }
            [JsonProperty("time_to_live", NullValueHandling = NullValueHandling.Ignore)]
            public int? TimeToLive { get; set; }
            [JsonProperty("restricted_package_name", NullValueHandling = NullValueHandling.Ignore)]
            public String RestrictedPackageName { get; set; }
            [JsonProperty("dry_run", NullValueHandling = NullValueHandling.Ignore)]
            public Boolean? DryRun { get; set; }
        }
        public class Response
        {
            [JsonProperty("multicast_id")]
            public String MulticastId { get; set; }
            [JsonProperty("success")]
            public int Success { get; set; }
            [JsonProperty("failure")]
            public int Failure { get; set; }
            [JsonProperty("canonical_ids")]
            public int CanonicalIds { get; set; }
            [JsonProperty("results")]
            public Result[] Results { get; set; }
        }
        public class Result
        {
            [JsonProperty("message_id")]
            public String MessageId { get; set; }
            [JsonProperty("registration_id")]
            public String RegistrationId { get; set; }
            [JsonProperty("error")]
            public String Error { get; set; }
        }
        static public Response Broadcast(String API_KEY, Container container)
        {
            var request = WebRequest.Create("https://android.googleapis.com/gcm/send");
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(container);
            using( WebClient web = new WebClient()){
                web.Headers.Add("Authorization", "key=" + API_KEY );
                web.Headers.Add("Content-Type", "application/json");
                byte[] result = web.UploadData("https://android.googleapis.com/gcm/send", "POST", System.Text.Encoding.UTF8.GetBytes(json) );
                String resultString = System.Text.Encoding.UTF8.GetString(result);
                var response = Newtonsoft.Json.JsonConvert.DeserializeObject<Response>( resultString );
                return response;
            }
        }
    }
}