Unyablog.

のにれんのブログ

iOS / Android アプリ作成入門スライドを公開しました

自分の所属している京大マイコンクラブ (KMC) では毎年3月に春合宿を行っており、60分ほど講座を行います。

今年は iOSアプリ作成入門 を行いました。

speakerdeck.com

また、書いたけど没になった Android 編も公開しました。

speakerdeck.com

続きを読む

iOS で Slack に投稿するアプリを作り実機にインストール

iOS チュートリアルが一通り終わったので、Slack に投稿するアプリを作ってみることにしました。

レポジトリは以下。

元々 Android 版をシュッと作っていたので、iOS 版という位置づけでやってみます。

アプリの機能は非常に単純で、webhook の URL を入力し、ユーザー名、アイコン、文字列を指定して OK を押すと JSON を webhook サーバーに POST するというものです。

続きを読む

iOS 入門 3日目

iOSチュートリアル自体は今回で終わりです。

今回は画面遷移の実装、データの編集、データの永続化あたりです。

画面遷移

  • どうやら iOS における IntentSegue と言うらしい。
    • 段々マウスクリックして伸ばすのが面倒になってきた。
  • Segue にもいろんな種類の遷移があって、それぞれアニメーション等が微妙に違う。こういうのが apple っぽくて良いですね。
  • NavigationControllerActivity みたいなもので、 ViewControllerFragment みたいなものだというざっくりした認識を得た。
  • Push SegueModal Segue というのがある。
    • 前者はタップしたものの詳細を示すような画面で使い、後者は新しいものを登録するような画面で使うということでよい?
    • 後者の場合 NavigationController も入れ替わるが、前者ではそんなことない。
  • prepareForSegue は自分から離れるときに呼ばれる。
    • このとき相手先の ViewController が降ってくるので、そこのメンバ変数に入れたいものを突っ込む…らしい
    • Android だと Intent に一旦突っ込むので直接入れるのは意外だった
  • 遷移先からデータを受け取りたいときは、 StoryBoard から関数まで Ctrl + ドラッグ をしてイベントを発火する
    • この時も遷移先の ViewController が降ってくるのでそこからデータを受け取るとのこと。

データの編集

メソッド一つ設定するだけでいい感じの編集UIができあがる。

編集UI、横スクロールした時に View がはみ出していてつらい気持ちになった。

iPhone6S だったらならなかった。あまり横幅を広くするなということだろうか。

データの永続化

Android よりも楽にモデルごと保存できるようでよかった。この程度になると Android では SQLite 使わないといけなさそう?

こうして公式チュートリアルは終わりました。あとは自分で軽いアプリを作ってみたいと思います。

その他

  • iOS、 String でコールバック関数とかクラスとか指定するのはそういうものらしい。

一日目

nonylene.hatenablog.jp

二日目 nonylene.hatenablog.jp

iOS 入門 2日目

1日目の記事はこちらです。

さて今日は二日目です。果たしてサークルの合宿に間に合うのか…

今日はモデルを定義して TableView を作成しました。

TableView での感想

  • Androidでいう ListViewRecyclerView の中間っぽい。

    • recycle がつよい ListView という感じ。。
  • iOS はこんなに簡単に ListView が作れるの最高ですね…!

    • Android だととにかくいろいろめんどくさくて…
    • Xcode の手厚いサポートのおかげという感じがする
  • でも RecyclerView のほうが型的には安心だという気がした。

tableView.dequeueReusableCellWithIdentifier("MealTableViewCell", forIndexPath: indexPath) as! MealTableViewCell

ってなんだよ…そこクラス入れていい感じに型安全にできるじゃん…!って思ってしまう。

とにかく文字列で指定という感じ、obj-C の遺産だったりするんだろうか。

その他

  • ViewController のクラスを指定するときに存在しないクラスを指定してもビルドできちゃうんですね
    • Run したときにコケました。
  • StoryBoard 上でパーツ削除した時、コードから消すのは手でチマチマやるのは少しつらい。
    • なんで StoryBoard に存在しないのにビルド通るのか。

最高だけど UI 周り案外いろいろだるいのでは、と思った日でした。

iOS 入門 1日目

春休みなので iOS 学んでみることにしました。*1

目標

作りたいアプリは特になくて、ただ iOS / Swift 学びたいなあという気持ちがあるという感じです。Swift で書かれた iOS のコード理解できるようになりたい。

当方ほぼ初心者です。(夏に Hello World ぐらいならしたことがある)

*1:Haskellをしないわけではないですよ!!

続きを読む

CircleCI で Android Library Project を GitHub Pages にデプロイ

こんにちは。最近 build.gradle をゴニョゴニョするのに慣れてきました。

ここ数日、 PhotoLinkViewerモジュール分けしたいなーと思って一部分を切り離しました

切り離したものは他のアプリでも使いたいので、プロジェクトとして独立させることにしています。

ここで切り離し元から参照するには 2つほど方法があり、

  1. submodule などでプロジェクト直下等に置いて管理する

  2. aar 化してレポジトリに置き、 build.gradledependencies に組み込む。

という感じです。

submodule で管理する方法を使えば ManifestMergerAndroidManifest をよしなにマージしてくれるので、切り離し元の AndroidManifest に Activity の情報を書く必要がありません。

続きを読む

Android 6.0 がおかしいと思ったらバージョンが古かった

marshmallow のつづりが未だに覚えられないです。

原因わかったので追記しました。

症状(preview 3 で確認されていた症状)

さて、自分の作っている PhotoLinkViewer には「他のブラウザで開く」機能があります。例えば画像の開くアプリで PhotoLinkViewer をデフォルトのアプリに指定していて、その後画像だけではなくウェブサイトが見たくなった時などに重宝します。

これはどのように実現しているかというと、

startActivity(Intent.createChooser(new Intent(Intent.ACTION_VIEW, uri), getString(R.string.intent_title)))

として行っています。 createChooser を用いることでこのアプリをデフォルト設定している時でもアプリ選択画面が現れるようにしています。

しかし、この機能が Andorid 6.0 からうまく動かなくなってしまい、デフォルト設定していればまた PhotoLinkViewer が立ち上がってしまうようになりました。

続きを読む