jubilee

Programing, Books and more...

アプリの標準言語を日本語のみにする方法

日本国内のみの配布などで、アプリの標準言語を日本語のみにする設定する方法。
アプリ作成時のデフォルトは英語になっており、UIImagePickerなどを使用してカメラ機能を実装した場合には、Cancel / Retakeなど英語で表示がされる。 これを日本語に変える。 ただし、通常のlocalization対応と違い日本語オンリーにする対応。

Localization native development

  1. プロジェクトナビゲーターでプロジェクトを選択 – Target – Infoを開く
  2. Localization native development region – en → Japanに変更する localization-1

Localizations

  1. 上記の設定後に、そのままの場所で右クリック → Add Row
  2. Keyに「Localizations」を追加する
  3. Item0を選択し、Valueの値を「Japanese」に変更する localization-2

viewのサイズを変更する方法

viewのサイズを変更する方法。

1
2
3
4
// 高さを変更
CGRect newRect = _sampleView.frame;
newRect.size.height = 165.0f;
[_sampleView setFrame:newRect];

UIScrollViewに配置したViewが下にズレる時の対応

NavigationBarなどが存在し、UIScrollViewの上にviewを配置した画面の場合に、ビルドして確認するとviewが下にズレて表示されることがある。

ViewController – Attribute inspector

このときは、ViewControllerのAttribute inspector – Adjubst Scroll View Insets のチェックを外す。
automaticallyAdjustsScrollViewInsets = NO

inspector

参考

UIScrollViewをスクロールさせる方法

UIScrollViewを設定したのに、スクロールしない時は以下を確認する。

contentSize

  • UIScrollViewのconntentSizeをUIScrollViewの大きさよりも、大きくしているか?
  • conntentSizeをセットするタイミング
1
2
3
4
5
6
// このタイミングで行う
-(void)viewDidLayoutSubviews
{
    // UIScrollView:320,568で作成済み
    [_sceneScrollView setContentSize:CGSizeMake(320,680)];
}

参考

http://blog.livedoor.jp/manjumanju/archives/3323842.html

iPhoneのスクリーンサイズを調べる方法

iPhone・iPadなどのスクリーンサイズを調べる方法。

1
2
3
4
5
6
7
8
9
// 3.5インチかどうかの判断
- (BOOL)isSmallSizeScreen
{
    CGSize screenSize = [[UIScreen mainScreen]bounds].size;
    if (screenSize.height == 480.0) {
        return YES;
    }
    return NO;
}

アプリの起動イメージを指定時間表示する方法

アプリの起動イメージを表示する時間を制御する方法。
AppDelegate.m のアプリ起動時処理部分に、スレッドをスリープさせるコードを追記する。

1
2
3
4
5
6
7
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    ...
    // 2秒間停止する
    [NSThread sleepForTimeInterval:2.0];
}

アプリ内のフォントを統一させる方法

アプリ内のフォントを統一させる方法。
今回は、カスタムフォントとして「Rounded-L M+ 2p regular」を使用。

プロジェクトへフォントを追加する

Xcodeを開き、追加したいフォントファイルをドラッグ&ドロップ(または、右クリック等から”Add Files to 〜”)で、ファイルをプロジェクトに追加する。
add fontfile

.plistへの情報追加

Supporting Files –> プロジェクト名.plistへ追加したフォントの情報を追加する。
Fonts provided by application –> item0 にフォントの「PostScript 名」を記述する。
※PostScript名は、FontBook.appを起動し、対象フォントのinfoボタンから確認
plist

AppDelegate.m

AppDelegate.mdidFinishLaunchingWithOptions: 等で、appearance を使い設定する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// フォント
UIFont *baseInputFont = [UIFont fontWithName:@"rounded-l-mplus-2p-regular" size:16.0f];
UIFont *baseTitleFont = [UIFont fontWithName:@"rounded-l-mplus-2p-regular" size:18.0f];
// フォント・カラー
NSDictionary *barItemInfo = @{NSFontAttributeName : baseTitleFont, NSForegroundColorAttributeName:[UIColor whiteColor]};

// UILabel
[[UILabel appearance] setFont:baseInputFont];

// UINavigationBar
[[UINavigationBar appearance] setTitleTextAttributes:barItemInfo];
[[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:0.2 green:0.6 blue:0.86 alpha:1]];

// UINavigationBarItem
[[UIBarButtonItem appearance] setTitleTextAttributes:barItemInfo forState:UIControlStateNormal];

// UITextField
[[UITextField appearance] setFont:baseInputFont];

// UITextView
[[UITextView appearance] setFont:baseInputFont];

参考

ViewControllerでアプリの状態を検知する

ViewControllerで、バックグラウンドから復帰した際の処理をしたかったが、検知できる方法がAppDelegate.mの applicationWillEnterForeground: 以外に思いつかなかったので調査。
結果としては、ViewControllerでもアプリの状態を検知する方法があった。

通知を利用する

ViewController.mの viewWillAppear などに、通知を追加しておく。

追加

1
2
3
4
5
6
7
8
- (void)viewWillAppear:(BOOL)animated
    // UIApplicationDidBecomeActiveNotification:アクティブになったとき
    // applicationDidBecomeActive(自作)メソッドを呼ぶ
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(applicationDidBecomeActive)
                                                 name:UIApplicationDidBecomeActiveNotification
                                               object:nil];
}

削除

1
2
3
4
5
- (void)viewWillDisappear:(BOOL)animated
{
    // 通知の削除
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

状態一覧

UIApplicationのNotifications一覧

ライフサイクル系

  • UIApplicationDidFinishLaunchingNotification
    • アプリケーションが起動した直後に通知
  • UIApplicationWillEnterForegroundNotification
    • アプリケーションがアクティブになる直前に通知
  • UIApplicationDidBecomeActiveNotification
    • アプリケーションがアクティブになった時に通知
  • UIApplicationDidEnterBackgroundNotification
    • アプリケーションがバックグラウンドに入る時に通知
  • UIApplicationWillResignActiveNotification
    • アプリケーションがアクティブで無くなる直前に通知。通知アラートが表示される時などにも通知される
  • UIApplicationWillTerminateNotification
    • アプリケーションが終了される直前に通知

サイズ変更系

  • UIApplicationWillChangeStatusBarFrameNotification
    • ステータスバーのサイズ変更される直前に通知
  • UIApplicationDidChangeStatusBarFrameNotification
    • ステータスバーのサイズ変更が発生した時に通知。デバイスが回転した時など
  • UIApplicationWillChangeStatusBarOrientationNotification
    • デバイスの向きが変わる直前に通知
  • UIApplicationDidChangeStatusBarOrientationNotification
    • デバイスの向きが変わった後に通知

その他

  • UIApplicationDidReceiveMemoryWarningNotification
    • メモリ不足の警告発生時に通知
  • UIApplicationProtectedDataDidBecomeAvailable
    • 保護されたファイルへコードからアクセスが可能になった時に通知
  • UIApplicationProtectedDataWillBecomeUnavailable
    • 保護されたファイルへコードからアクセス出来なくなる前に通知
  • UIApplicationSignificantTimeChangeNotification
    • 時間に大きな変更が有った場合に通知。日付が変わった時や夏時間に変更など

参考

プッシュ通知の誤解

アプリがバックグラウンド状態で、サーバーからプッシュ通知を受信した際の動作で、自分が誤解していたこと。
実機繋げてデバッグ実行中に、バックグラウンドにいる状態では処理が動いている形跡がないので、おかしいな〜と。
Apple公式の「LocalおよびPush Notificationプログラミングガイド」を確認したら、P14に記載されてた。

誤り

  1. サーバーからプッシュ通知を受信
  2. アプリが通知を受信し、アプリがバックグラウンドでアイコンバッジ表示や受信を契機にした処理を行う(自分でコーディング)

正しくは

  1. サーバーからプッシュ通知を受信
  2. OSが通知を受信し、メッセージを表示(アイコンバッジはサーバーからの指示でOSが表示)
  3. ユーザーがアプリを起動し、受け取った通知をもとに処理を行う(自分でコーディング)

注意

  • アプリが完全に終了している時で、通知受信後にメッセージセンターからではなく、アプリのアイコンから起動した場合は、受信データを受け取ることができない
  • 通知センターから起動とアプリアイコンから起動では、動作がちがう
  • バックグラウンドで処理をしたい場合は、サーバーからの通知ペイロードに content-available=1 を含むこと
  • TARGETS – Background Models – Remote notifications, (Background fetch)にチェック
  • UIRemoteNotificationTypeNewsstandContentAvailability指定するとバッジがでない

参考

CocoaPodsでライセンス表記を自動で作成する

CocoaPodsを使用している場合に、使用しているライブラリのライセンス表記を自動で作成する方法。
ライセンス表記は、iPhoneの設定アプリに作成される。
pod install / pod update するたびに自動作成してくれるので、ライブラリの追加/削除のたびにライセンス表記の修正をしなくていいので便利。
作成時に、些細なところでハマったので、やり方を残しておく。

Settings.bundleを作成

File – New – File から、iOS – Resource で「Settings Bundle」を選択。 settingbundle1

作成する場所を選択する。
ここで、Groupを「Supporting Files」にはしないこと。 ← ここでハマった。 settingbundle2

Root.plistの編集

デフォルトの状態から、以下のように編集する。
「Child Pane」は、「Type」からしか選択はできないので注意。
root.plist

Acknowledgements.plistの作成

「Settings.bundle」内に「Acknowledgements.plist」を作成する。
作成方法は通常のファイル作成と違い、以下のようにする。

  • 「Settings.bundle」を右クリックで「パッケージの内容を表示」させ
  • 「Root.plist」を複製し、「Acknowledgements.plist」に名前をかえる
  • 「Acknowledgements.plist」を開き(エディタなど)、中身を消す ← ここでもハマった。

Acknowledgements.plist

Podfileへの追加

Podfileへ、以下を追加する。

1
2
3
4
5
6
7
post_install do | installer |
require 'fileutils'
//FileUtils.cp_r('Pods/Pods-acknowledgements.plist', 'SampleLicense/Settings.bundle/Acknowledgements.plist', :remove_destination => true)
// 2015.1.27追記
// いつの間にかこっちの表記に変わってた
FileUtils.cp_r('Pods/Target Support Files/Pods/Pods-Acknowledgements.plist', 'SampleLicense/Settings.bundle/Acknowledgements.plist', :remove_destination => true)
end

Settings.bundle へのパスは、XcodeでSettings.bundleを表示させ、エディタエリア上部のジャンプバーを参照すること。
Podfile

pod install

あとは、pod install をすれば、完成。Acknowledgements.plistはこんな感じになる。
Acknowledgements.plist

ビルドし、iPhoneの設定アプリから確認することができる。
Setting.app Setting.app