イッツァハローワールド

恥さらしていこうかなとか。

(iOS)小ネタ NS CALENDAR ENUM DEPRECATED

なんてことない記事ですが。

いま、OHAYO耐えマーのバージョンアップ対応してます。
主に、iOS8対応(+バグ修正、一部機能追加)

そのなかで、NSDateで日付や時刻を取得してほげほげいじるみたいな処理を行っている所があって
ビルドしたら、NSCalenderのEnumがiOS8.0で非推奨ですって。

'NSMinuteCalendarUnit' is deprecated: first deprecated in iOS 8.0 - Use NSCalendarUnitMinute instead

要はNSMinuteCalendarUnitつかってたらNSCalendarUnitMinuteに変えとけよ。ってことらしい。
変えたら、警告無くなりました。

ああそうですか。って感じ。

(iOS)備忘録 SLComposeViewControllerを利用したSNS連携

ブログ書くの時間かかる。。。くうう。。
本日はSNS連携の備忘録

耐えマーでもtwitter連携やっていますが、今回はfacebook連携についても記載。
耐えマーのバージョンアップでfacebook加えようかなとか。

とりあえず画面用意します。

f:id:hanamiju:20141029213342p:plain

だいぶ適当。
今回はtwitterアイコン押すとtwitterの投稿ダイアログが、
facebookアイコン押すとfacebookの投稿ダイアログが表示される仕様ですすめる。

まずはヘッダファイル
#import <Social/Social.h>

コイツを入れる。twitterだけの場合だったら

#import <Twitter/Twitter.h>

でもオーライ。

まずはtwitter投稿
- (IBAction)tweetButtonPushed:(id)sender {
    //
    SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    
    // 送信文字列(140文字)
    NSString* message = @"今日は29の日うぇうぇうぇうぇうぇうぇーーーーっっっw #テスト";
    
    // 文字列をセット
    [vc setInitialText:message];
    
    // URLをPOSTする場合
    [vc addURL:[NSURL URLWithString:@"http://matome.naver.jp/odai/2138561901190627201"]];

    // 画像をPOSTする場合
    [vc addImage:[UIImage imageNamed:@"29.png"]];
    
    // [CANCEL]ボタンなどのイベントハンドラ定義
    vc.completionHandler = ^(SLComposeViewControllerResult res) {
        [self dismissViewControllerAnimated:YES completion:nil];
    };
    // 送信View表示
    [self presentViewController:vc animated:YES completion:nil];
}

29の日を祝うありふれたツイート。URLは焼き肉のおいしい焼き方のリンク、加えておいしそうな肉の画像を添付。
f:id:hanamiju:20141029214559p:plain

流れとしては、SLComposeViewControllerをつくって、tweetに必要な要素を登録していく感じ。

下の方にあるblocksに何入れればいいか分からなくて困った。
completionHandlerのリファレンス読むと

// Specify a block to be called when the user is finished. This block is not guaranteed
// to be called on any particular thread. It is cleared after being called.
@property (nonatomic, copy) SLComposeViewControllerCompletionHandler completionHandler;

ってあって、
たぶん、終了やらキャンセル時の処理をblocksで入れとけコラってことだと思う。なるほど。

ということで、実行してtwitterアイコンをタップすると、こんな画面が。
f:id:hanamiju:20141029214510p:plain

アカウントが登録されていないときの警告ですな。
別にそんな警告な実装はしていなくてもこういった画面が出てくれて大変楽。

そんで登録するとこんな画面に。
f:id:hanamiju:20141029214916p:plain
あれれ、リンクが記載されていないんですけど...

まあいいやということで実際のツイートを見てみる。

しっかりリンクが張られてました!

Facebook投稿

ほとんどtwitterの時と一緒。

- (IBAction)fbbuttonPushed:(id)sender
{
    SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
    
    // 送信文字列
    NSString* message = @"今日は29の日うぇうぇうぇうぇうぇうぇーーーーっっっw #テスト";
    
    // 文字列をセット
    [vc setInitialText:message];
    
    // URLをPOSTする場合
    [vc addURL:[NSURL URLWithString:@"http://matome.naver.jp/odai/2138561901190627201"]];
    // 画像をPOSTする場合
    [vc addImage:[UIImage imageNamed:@"29.png"]];
    
    // [CANCEL]ボタンなどのイベントハンドラ定義
    vc.completionHandler = ^(SLComposeViewControllerResult res) {
        [self dismissViewControllerAnimated:YES completion:nil];
    };
    // 送信View表示
    [self presentViewController:vc animated:YES completion:nil];
}

facebookアイコンを押すとこんなダイアログが出ます。
f:id:hanamiju:20141029215338p:plain

ちょっとtwitterの時と違う。
アルバムやら、位置情報やら、公開範囲の指定がデフォルトで可能っぽい。
facebookではテストしてないけど。

とりあえずこんなかんじ。簡単なことしたいだけだったら非常に楽。

(iOS)備忘録 ステータスバー、ナビゲーションバーをいじる

備忘録

アプリ作る毎にどうやったっけってなるので備忘録を。
まあ、割とこの手の記事はググれば見つかりますが。

ステータスバー

ここではステータスバーを明るくしてみる。

1. Info.plistで View controller-based status bar appearance を NO にする
f:id:hanamiju:20141028220407p:plain
↑のハイライトな部分


2. UIApplicationのsetStatusBarStyle:animated:をつかう
AppDelegateとかで、以下の関数をよぶ。

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

ナビゲーションバー

タイトルがテキストの場合

こんなナビゲーションバーをつくる。
f:id:hanamiju:20141028221145p:plain
適当にハロウィン。

ViewControllerに実装。

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    // ナビゲーションバーの背景色
    self.navigationController.navigationBar.barTintColor = [UIColor blackColor];
    
    // バータイトルの色
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};

    // バーボタンの色
    self.navigationController.navigationBar.tintColor = [UIColor yellowColor];
    
    // バータイトル
    self.title = @"HELLOWEEN";
    
    // バーボタン
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"お菓子" style:UIBarButtonItemStylePlain target:self action:nil];
}
タイトルが画像のとき

お次はこんなナビゲーションバー
f:id:hanamiju:20141028221648p:plain
タイトルで画像を使ってます。

まずは適当に画像を用意。
f:id:hanamiju:20141028221755p:plain
↑透過MAXなんでこのまま見るとタダのカボチャ。

こちらもViewControllerに実装。

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    // ナビゲーションバーの背景色
    self.navigationController.navigationBar.barTintColor = [UIColor blackColor];
    
    // バーボタンの色
    self.navigationController.navigationBar.tintColor = [UIColor yellowColor];
    
    // バーボタン
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"お菓子" style:UIBarButtonItemStylePlain target:self action:nil];

    // タイトルに貼付けたいイメージ
    UIImage* image = [UIImage imageNamed:@"titlebar.png"];
    
    // イメージのサイズを調節
    CGSize viewSize = CGSizeMake(image.size.width, image.size.height);
    CGFloat imageHeight = 30;
    CGSize titleImageSize = CGSizeMake(viewSize.width * (imageHeight / viewSize.height), imageHeight);
    
    // UIImageViewをつくる
    UIImageView* titleImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, titleImageSize.width, imageHeight)];
    titleImageView.backgroundColor = [UIColor clearColor];
    titleImageView.image = image;
    [titleImageView setContentMode:UIViewContentModeScaleAspectFit];  // 縦横比を維持しつつImageViewに画像をセット
    
    // UIViewにUIImageViewをのっける
    UIView* bgView = [[UIView alloc] initWithFrame:titleImageView.frame];
    bgView.backgroundColor = [UIColor clearColor];
    [bgView addSubview:titleImageView];
    
    //UINavigationBarのタイトルに画像を設定。
    self.navigationItem.titleView = bgView;
}

オナ禁タイマーアプリつくったよ。

また前回の更新から一ヶ月経ってしまった。

以前、はじめてiPhoneアプリつくったで!ってムダに長い記事書いたけど、
あれでObjective-c思い出したし、小粒アプリだったら簡単に作れるわ!って感じで味を占めたのでそれからまたアプリ作りたくなったの。

でも、ネタなんかすぐないので唸りながら考えるんだけど、

  • 面白いけど、実現不可(収拾不可)なアイデア
  • なんか使えそうで実現可能そうだけどクソつまんねえアイデア

しか出てこない。作りたいときにつくりたいのに!
そんで、友人が1年以上前に「(Androidで)オナ禁タイマーアプリつくりたい」って言ってたのを思い出したので軽くググってみた所、あんまりアプリがヒットしなかったので、題材をパクった次第でござる。

https://itunes.apple.com/jp/app/naiema-shinpuruna-jin-yutaima/id915915359?mt=8&uo=4&at=10l8JW&ct=hatenablog


ちなみに、

俺はオナ禁なんかしない('A`)


名前の由来

読んでみれば分かる。
当初は「忍耐」+「タイマー」で「ニンニンタイマー」とか考えたけど、よりバカっぽい今のやつにした。

やりたかったこと

iOSアプリで軽く調べた所、オナ禁タイマーでいくつかアプリがヒットしたんで視察がてら落としてみた。
シンプルがウリなのによくわかんないUIだったり、ガマンを進めることによる称号授与が凝りすぎてたりなんだかなーって思った。なんか楽しくない。いちユーザーの意見ですけどね。

てなわけでテーマを「楽しくガマンを続ける。」って設定して↓みたいなアプリを目指しました。

要件
  1. 分かりやすい画面。(タイマーごときに操作ガイドなんかいらない)
  2. ガマンをしたことによってどういう効果が得られたか知りたい。
  3. みんなにシェアして自分を追い込みたい。
  4. どうせなら、周りを巻き込んでガマンくらべ(チキソレース)みたいにやりたい。
  5. ガマン出来なかった場合、それさえもネタに出来るようにしたい。
  6. 頻繁にアプリを起動させたくない。でもたまーに気付かせたい。
分かりやすい画面

f:id:hanamiju:20141027234034p:plain

基本はこんな感じ。一覧から、個々のタイマーに遷移するだけ。
個々のタイマーは、時間表示(タイマー)と成果表示をします。

基本色は白黒にすることで、ボタンの色を特徴づけてます。



唯一分かりにくいのは「オタマジャクシ」かなと。


ガマンをしたことによってどういう効果が得られたか知りたい。

時間だけだと単純すぎるのでお金の節約ならおいくら得したよとか、間食控えるなら何kcal控えたよとかって知れるといいかなって。

オタマジャクシは完全にネタ。
オナ禁すると髪の毛抜けないって本当?(次回アップデート時に入れる予定)

みんなにシェアして自分を追い込みたい

かまってちゃんのネタになればいいかなって思ってはじめてtwitter連携をさせてみた。
ただツイートだけさせたいだけなら実装もすぐできる。twitterアカウント有無の確認とかも混みで簡単。
それ系の技術記事はまた今度。(面倒がっていつも後回し)

あと、ガマンできなかったときの罰とかも用意しとくと、より追い込めるかなと思って勝手に罰を考える機能を追加。ネタ元は診断メーカー。

どうせなら、周りを巻き込んでガマンくらべ(チキソレース)みたいにやりたい。

こんどつくるところ。

ガマン出来なかった場合、それさえもネタに出来るようにしたい。

「ガマン、ガマン」って意識しているうちはガマンなんか長く続かないっていうのを禁煙で痛いほど知っているつもりなので、「くう...ガマン続かなかったでござる...でもtwitterでみんなに誓ったから言い出せないでござる...」ってなるくらいならガマンの失敗はさらっと流せる仕組みを作った方が面白そうだと思いました。

てなわけで、上記の罰を考える機能に加えて、ガマンできなかった理由も勝手に考える機能を追加。
ちなみに、このアプリで一番時間がかかった所はこれらのネタをそろえる所。

頻繁にアプリを起動させたくない。でもたまーに気付かせたい。

コンテンツの内容はシンプルな分、頻繁に見るほど魅力もないアプリなので

  1. 基本は放っておく
  2. 数日おきに「オナ禁開始から何日経過したよ!」って通知をとばす
  3. ユーザーが気付いて進捗をtweetする

みたいになればいいなとおもって、数日おきにローカル通知とばしてます。

感想

  • 何の宣伝もしてないのに意外とダウソしてもらえている。うれしい。
  • twitterのタイムラインで #耐えマー で探すと意外と使ってもらえている。うれしい。
  • ふまじめ系アプリは結構ふざけられるのでアドリブとか勢い実装ができて楽しい。
  • ふまじめ系アプリはウケなくてもショックが少ない。まじめ系だとダウソ数が少ないと疎外感半端ない。
  • 小粒アプリだけど、シンプルにまとめられてるんじゃないかと自己満足してる。
  • 構想、素材作成を抜けば3日でできた。含めても1週間強程度。前回の経験が割と生きている。
  • また広告入れるの失敗している。なんでやねん。


この記事もムダに長いな。

(iOS)備忘録 perhaps the designated entry point is not set? エラー

StoryBoard上でUIをつくったあと、ビルドしたらシミュレータが真っ黒になった。

コンソールを見ると以下の表示。

Failed to instantiate the default view controller for UIMainStoryboardFile ‘Main’ – perhaps the designated entry point is not set?

InterfaceBuilderのインスペクタを開き、Is Initial View Controller にチェックが入っていなかったのでチェックを入れたら解決。

これ、毎回やってまう...

はじめてiOSアプリリリースしたけど、とっても苦労したって話

Macを信者から布教されて7年ほど...

Xcodeにはじめて触れてから5年ほど経ちますがようやくアプリをリリースしました。
(何のドラマもないただ長いだけの経歴は別途ネタとしてまとめようかと。)

リリースしたアプリ

https://itunes.apple.com/jp/app/ohayo-shinpurunao-tian-qiaramu/id907899803?mt=8&uo=4&at=10l8JW&ct=hatenablog

タイトルにあるとおり、お天気アラームアプリです。
アラームの基本機能はしっかりとおさえ、寝ぼけていてもわかるくらいシンプルなお天気表示、アラーム表示がウリのアプリです。
お天気は色で表し、直感的に理解できるようにしています。お天気のアイコンは補助的な感じでしか使っていません。

今回作成したアプリに関しては、開発、画面デザイン、アイコンデザインは一応自分でやりました。

作った動機

今あるアプリへの不満8割と、ちょっとしたアイデア2割です。
以下煽り気味ですが、このくらいの不満がアプリ開発を駆り立てるのですよ...

アラームアプリに対して思っていたこと
  • 使いにくいのが多い。
  • 機能が大杉。(↑にもつながる)
  • 決まった時間にアラーム音だけ鳴らすアプリはないのものか。
  • アラーム再生時の画面に文字盛り込み過ぎ
  • 鳴らないときがあって油断ならない。
  • なんでバックグラウンドで鳴らないの?
お天気アプリに対して思っていたこと
  • 装飾が凝り過ぎ。ぱっと見で天気が分かるのはないものか。
ちょっとしたアイデア

目覚めたときにカーテン開けるまでもなく天気がすぐに分かれば、
どんなに忙しい朝でも、天気を考慮した準備ができるよね。そうだよね。

っていうやつ。それだけ。
昔はカーテン開けない派で朝困った経験が多々あったのですよ...

こだわろうと思ったこと

  • いらん機能は全部消す。(現状のアラームアプリの機能にとらわれない。)
  • アラーム機能は不自由させない。
  • 一度セットしたら、アラーム鳴るまでアプリは起動しなくて良いようにしたい。
  • 天気はできるだけ分かりやすく表示したい。

要はシンプルイズ某ということで、着手しました。
制作目標期間は1ヶ月。

画面設計

ペーパープロトタイピング的な感じを試してみようかと実施してみました。
テンプレは以下からいただきました。

iPhone5 ペーパープロトタイプ用のPDF A4サイズ iOS7, 8 - Qiita


書いたらPOPっていうアプリをつかって
実際にiPhoneで画面遷移やUI等の使用感を試しました。

POP - Prototyping on Paper

POP - Prototyping on Paper

  • Marvel Prototyping LTD
  • 教育
  • 無料

画面設計は、構想段階からそこそこ変わらぬイメージでできました。

開発

以前すこしだけ、Cocoaで開発することもありましたが、
現職がWinアプリ開発な人ですので、ほぼ初心者と見積もってましたが、
少しばかりの知識の貯蓄と無駄に溜まった初心者参考書をつかってなんとか作ることができました。

下記、いろんな機能をつまみ食い的な感覚で実装しましたので浅く広く勉強することができたのでよかった。

  • バックグラウンド機能(音楽再生)
  • ローカル通知
  • 位置取得
  • iPodの音源取得
  • アプリ内課金

などなど

つまづいたこと
  • バックグラウンド再生

上記の文句にも書きましたが、
iOSのアラームアプリって割とバックグラウンドで再生できず、アプリは起動したままクソして寝ろ。っていうアプリが多いのです。

理由としては、バックグラウンドではアプリは強制的にお休み状態になるので、アラーム音鳴らすタイミング(時刻)が分からないの。
ていうか、そもそも鳴らす人もいない。

加えてマルチタスクのアプリは、意図した目的のためにバックグラウンドサービスを使うだけにする。(VoIP、音楽再生、位置情報、タスク完了、ローカル通知など)っていう規約があり、それを破るとリジェクトされちゃったりします。溜まんねえな。

ローカル通知時に音源を鳴らせたりもするけど、それも30秒までだったりして、iPodの音源鳴らせないじゃんかと。アラームを止めるタイミングでお天気を確認したいので、以下のような寝起きフローが達成できないと困るわけです。

(アプリはバックグラウンド状態)

  1. アラーム鳴る
  2. ローカル通知出る
  3. アプリ起動
  4. アプリのSTOP押す(←このとき天気を確認)
  5. 起床!

しっかしまあ、この世には脱獄アプリでなくてもバックグラウンド再生に対応しているアプリが存在しているわけで。
それらのアプリの挙動を研究してたら、ある糸口が分かりまして、「だけどこれってAppleに文句つけられたらお手上げじゃね?」とかビビりつつながら実装を進めました。

テストと称して、自分のアラームとして使ってみたものの、寝坊かましてしまってから、逆に信用できなくて朝が強くなりました。(おい)

リリース&リジェクト

お盆前に実装・テストを終え、神にすがるような思いでアプリの申請を出しました。
お盆明けのある日、起きてiTunes Connectをのぞいてみたら「Rejected」と。

理由:

  1. iOSで標準で提供している機能をアプリ内課金で使わせようとしてんじゃねえボケ
  2. バックグラウンドONになっているんだが、つかってる様子ねーぞ。どういうことだ。

('A`)オワタ


1についてはちょっとマネタイズに走ろうとしてたのです...チョットだけ...
起きる(アラーム止める)ときしか使わないアラームに広告入れてもなーとか考えていて、だったらアプリ内課金や!と。
ってなわけで、「iPodの音源使いたかったら100円払いなさーい」って腰振ってたら規約に引っかかったわけです。だせえ。


2については恐れていた事態やなあと。どうにかバックグラウンド機能が必要だということを言いたい...
そこで、再度バックグラウンドでアラームを鳴らしている先駆者たちをじっくり研究してみることに。そして気付きました。共通項。


睡眠前音楽再生機能


これは眠る前に心地よいミュージックを鳴らして快適にお休みいただこうという機能だと思うのですが、こいつを実装すれば、「バックグラウンド機能が必要なんや」と胸はってドヤ顔できるわけです。

自分にとってはあってもなくてもどっちでもいい機能(→いらない機能)だったので、画面を増やしたくなかったのですが、ほかにどうしようもないということでさっさと実装して再申請。


数日後またメールが。



Rejected



('A`)クッソ


Apple「理由:バックグラウンドONになっているんだが、つかってる様子ねーぞ。どういうことだ。」


私「ふふふ。今回はバックグラウンド機能つかってないと困る機能が実装されているのだよ。睡眠前にリラックス音楽を再生するために必要なんだよ。分かったか!!」


Apple「でもお前、アラーム再生にも使ってるだろ?」


私「え?」


Apple「アラーム再生を実現しているステップを提供してみろよ。さあ。」


(((((('A`)))))))マジオワタ



ってなわけで、撃沈。のう!
よし、もうこうなったら正直に全部タネあかして「じゃあどうすればいいんだってばよ!」って泣きついてやる。って覚悟を決めたわけです。

それで、なんかAppleとやり取りしているうちに英語がだいぶ苦手な自分とのやり取りがだいぶウザかったのか、返事が来なくなってしまいました。
あれ?と思ってたら1日後に「ready for sale」のステータスが!


あれ?なんで?でもやった!


てなわけで、なかなか謎な感じでリリースができたわけです。
シンプルにアラームを使いたい方にはうれしいアプリですので是非ダウソしてみて下さい。

ver.1.0版にバグがありまして、今なら広告が表示されません。(設定忘れ)

https://itunes.apple.com/jp/app/ohayo-shinpurunao-tian-qiaramu/id907899803?mt=8&uo=4&at=10l8JW&ct=hatenablog

iOS備忘録 ○秒置きにタイマーをセットする

だいぶ日が空いてしまった...
 
ほとんど絵は描いていなくて、かわりにiOSアプリ作っていました。
初めて申請までこぎ着けたぜ...。
ただいま申請中です。(ちなみに1回リジェクトされた...)

ブログはじめたからには、備忘録も書かないとね☆
とか思っていたら、だいぶ日が過ぎていました。

今更記事書く気起きねーよっていうテンションなのですが、小ネタでも出来るだけ毎日備忘録を起こそうと思います。
というわけで、初回なんで出来る限りハードル下げます。

 

タイマーのセット(例:10秒ごとオカンがおはようと語りかけるプログラム)

セットする関数の記述

// タイマーのセット(10秒ごとにokanメソッドを繰り返し呼び出す。)
 [NSTimerscheduledTimerWithTimeInterval:10.0 target:self selector:@selector(okan:) userInfo:nil repeats:YES];


オカンメソッド

- (void)okan:(NSTimer* )timer
{
    NSLog(@"J( 'ー`)し たかしおはよう ");
}
    


クッソどうでもいい記事書いてしまった。
次回はもっと、備忘録にすべき内容を書きたい。