iOS開発:MyTweet+リリース

ようやく、私のiOSアプリ(MyTweet+)がリリースされました!
MyTweet+ (iTunes App Store)

な、長かった〜

どんなアプリ?

MyTweet+は、ツイートを管理するアプリ。お気に入りにしたツイートを、後から見返したい時などに便利。「あのトリビアなんだっけ・・?Twitterで見たけど思い出せない・・」って時に、サッとツイートを取り出すことができる。

今の機能はこんな感じ。

  • お気に入りツイート、自分のツイートを読み込み
  • ツイートをタグで管理
  • タグがついたツイートを表示
  • ツイートのローカル保存(画像キャッシュもあり)
  • 保存したツイートの検索
  • 過去のツイートのダウンロード

続きを読む »

iOS開発:アプリケーション再申請


以前に申請していたアプリだが、見事にリジェクトされてしまった。予想通りだけど、少し凹む・・。

リジェクトの理由は、iOS Data Storage Guidelinesに従っていないためだった。
これの内容を見ていくと、「iCloudバックアップされるディレクトリには、ユーザが作成したデータを置く。再ダウンロード可能なデータなどは、別のディレクトリに置きなさい」とのこと。つまり、「何でも、iCloudバックアップさせないように!」という意味。

以下のサイトが参考になった。

対応する

対応は簡単だった。今まで「[Application_Home]/Documents」に全データを置いていたのだが、データの配置場所を変更することにした。

画像イメージは「[Application_Home]/Library/Caches」に、データベースファイルは「[Application_Home]/Library/Private Documents」に置くことにした。

Caches以下は、ディスク容量が足りなくなると消される可能性があるので、データベースファイルは置けない。そこで別ディレクトリを作成する。注意するのは、このディレクトはiCloudバックアップされてしまうのだ。そこで、no backup属性を付与して、iCloudバックアップさせないように設定する。

no backup属性を付与するためのコードは、Technical Q&A QA1719: Technical Q&A QA1719を参考にした。これを呼び出せば、バックアップされなくなる。

少し悩んだ箇所は、NSString型のファイルパスをNSURLに変換するやりかた。以下のようにすれば問題なく動いた。

// fileURLWithPathを使う
[DatabaseHelper addSkipBackupAttributeToItemAtURL:[NSURL fileURLWithPath:dbPath];

iPhoneシミュレータで起動した後、属性がついていることを確認する。

$ cd /Users/ei/Library/Application Support/iPhone Simulator/6.0/Applications/AA98DACC-4167-4A98-A6C5-EFC709CA80D2
$ xattr Library/Private\ Documents/app.db
com.apple.metadata:com_apple_backup_excludeItem

xattrコマンドでファイルの属性を見ると、バックアップ対象外となっている。

再申請


再度、バイナリをアップロードして、「Waiting For Review」ステータスになった。また、リジェクトになる気がするなぁ・・。

iOS開発:UIWebViewで表示しているコンテンツの高さを取得

UIWebViewで表示しているコンテンツの高さを取得する。Webでやり方を検索していると、2通りのやり方が見つかる。

1つ目は、「document.documentElement.clientHeight;」を使うやり方。
2つ目は、「document.getElementById(\”contentsDiv\”).clientHeight;」を使用するやり方。

どっちが良いのか分からずに、1つ目のやり方を使っていた。しかし、いろいろと検証した結果、2つ目のやり方の方が良いように思った。

検証結果

1つ目のやり方の問題点は、コンポネント(UIWebView)の高さを取得してしまう事がある点だ。

上の画像のように、UIWebViewの表示領域を大きくした場合で、表示内容が少ない場合、スクロースなく表示することが出来る。そうなると、「document.documentElement.clientHeight;」は、コンポネントの高さの取得となる。スクロールが発生するような場合は、コンテンツの高さが取得できる。常にコンテンツの高さが取得できるわけではないのだ。

2つ目のやり方だと、コンテンツの内容によらず、コンテンツの高さが取得できる。

サンプルコード

まずは、HTMLを表示させる。コンテンツのdivのidは、”contentsDiv”とした。

NSString *html1 = @"<html><head><style type=\"text/css\">body{font-family:Noteworthy-Bold,\"Apple Color Emoji\";}</style></head>"
        "<body><div id=\"contentsDiv\" style=\"background-color:#dddddd\">☀٩(・×・。)۶☀<br><a href=\"http://www.google.com/\">Google</a><br>あああ<br>あああ<br>あああ</div></body>"
        "</html>";

以下のDelegateメソッドで、コンテンツの高さを取得する。そして、コンテンツの高さに合わせて、UIWebViewの高さを変更する。

-(void)webViewDidFinishLoad:(UIWebView *)webView {
    NSString *output = [webView  stringByEvaluatingJavaScriptFromString: @"document.getElementById(\"contentsDiv\").clientHeight;"];
    int contentHeight = [output intValue] + 20;
    
    CGRect frame = self.webView.frame;
    frame.size = CGSizeMake(webView.frame.size.width, contentHeight);
    self.webView.frame = frame;
    
    NSLog(@"contentHeight is %d", contentHeight);
}

実行すると、こんな感じになる。

iOS開発:アプリケーション申請


開発中のアプリ(MyTweet+)を申請した。申請手順が多くて、丸一日ぐらいかかってしまった。「Waiting For Review」ステータスなので、レビュー待ち状態。

以下のページの通りで申請できた。非常に助かった。

申請時に困った箇所&失敗した箇所

1つ目。App IDの「Bundle Identifier」項目。アプリケーション固有の識別文字列を入れる。”net.eikatou”と入れてしまい、後から残念感でいっぱいに。アプリケーション固有のIDなので、”net.eikatou.mytweetplus”とした方が良かった。
仕方ないので、そのままで進んだ。

2つ目。アプリケーション名に”+”を入れると、XcodeからiTunesへ送信する前の検証でエラーになった。
iphone – My iOS app has a + in its name. Bundle is invalid due to this. Need help resolving – Stack Overflow
実際に「Camera+」とかあるから、アプリケーション名に”+”は入れられるはず。何が問題だったかと言うと、アプリのバイナリの名前に”+”がついていたことだった。なので、MyTweet+からMyTweetPlusに、プロジェクト名を変更。その後、Info.plistの「Bundle display name」を”MyTweet+”にすれば検証を通った。

iOS開発:ナビゲーションバーのタイトルを変更する

先日、なかなか解決できなかった点。以下のコードで、ナビゲーションバーのタイトルを変更しようとした。

self.title = @"Tweet";

すると、タブのタイトルも一緒に変わってしまう(以下の画像の枠の箇所)。

ナビゲーションバーのタイトルのみを変更したいのだ。タブのタイトルは変更したくない。そういう時は、以下のようにすれば良い。

self.navigationItem.title = @"Tweet";

この問題を解決するのに、意外と時間がかかってしまった。

self.titleは、なぜ両方のタイトルを変えるような仕様になっているのだろう・・。分かりにくいなぁ。

iOS開発:開発中のアプリ(MyTweet+)

しばらくブログを放置していたのは、アプリ開発とパズドラと山登りに夢中だったため。アプリ開発は、ゴールが見えてきた。

どんなアプリ?

MyTweet+は、ツイートを管理するアプリ。お気に入りにしたツイートを、後から見返したい時などに使用する。「あのトリビアなんだっけ・・?Twitterで見たけど思い出せない・・」って時に、サッとツイートが確認できるようになる。

今の機能はこんな感じ。

  • お気に入りツイート、自分のツイートをローカル保存
  • ツイートをタグで管理
  • タグ付けしたツイートの一覧表示
  • 保存したツイートの検索
  • 過去のツイートのダウンロード

続きを読む »

iOS開発:OHAttributedLabelの行間を調整する

iOS開発:UILabelでリッチにテキスト表示(OHAttributedLabel)で、UILabelの表示をカスタマイズしたが、気になる点が残っている。それは、行間の広さだ。


前回の結果だが、OHAttributedLabel(上)を使うと、通常のUILabel(下)よりも、行間が広くなっている。しかも、OHAttributedLabel(上)の1行目と2行目の間だけ、さらに広くなってしまっている。

続きを読む »