最新バージョンを確認してAppStoreに移動するiOSライブラリ

iOS アプリのアップデートがあった場合、iPhoneApp Store アイコンにバッジが付いたり、iTunes のサイドバーの App に数字が表示されたりして知らせてくれる。
なので特にアプリ側では何もしなくて良いかな〜?と考えていたのだけど、アプリ起動時に最新バージョンの確認を行って新しいバージョンがリリースされていたらアップデートを促すダイアログを表示するライブラリ(というかスニペット?)を発見した。

せっかくだから試しにちょっと使ってみたのでメモ。

Harpy のダウンロードと使い方

GitHub に上がっているのでダウンロードするだけ。

中身は README とキャプチャが2枚に、コード本体が入っている Harpy フォルダ。
コード自体は以下の3つのファイルだけ。

  • Harpy.h
  • Harpy.m
  • HarpyConstants.h

使い方は簡単。
3つのファイルをアプリのプロジェクトに加えて、設定の入っている HarpyConstants.h を自分のアプリに合わせて修正。
Harpy.h を AppDelegate で import する。
後はアプリ起動時にチェックをするようにする為に、AppDelegate.m の application:didFinishLaunchingWithOptions 辺りで [Harpy checkVersion] してバージョンチェックを行うだけ。


修正する HarpyConstants.h の値はこんな感じ。
アプリのページの URL が以下のような場合は
https://itunes.apple.com/jp/app/nemusuta/id379270824?mt=8
こうなる。

#define kHarpyAppID                 @"379270824"

こんだけ!

Harpyを自分のアプリに合わせて細かい修正

README に書いてある通りに修正を行って起動してみたのだけど、アラートが表示されない…。
現在 AppStore で配布されているバージョンは 6.0 で、今回ビルドしたアプリはわざわざ 5.0 にしてみたのに…。


あれこれ確認してみた結果、原因は何をバージョン番号としてチェックしていたか?でした。
Harpy ではバージョン番号の確認は

#define kHarpyCurrentVersion [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]

で BundleVersion を使ってる。


一方、自分のアプリでは AppStore やアプリの About... で表示しているバージョン番号は BundleShortVersion を使ってる。
Harpy でチェックしている BundleVersion には自分の場合「ビルド番号?」を入れているので、こちらの方が全然大きな値になっていて比較になっていないのだった。


というわけで、自分のバージョン番号とビルド番号の仕組みを変える訳にはいかないので、Harpy.m のバージョン番号を取得するマクロ定義を下記のように変更した。

#define kHarpyCurrentVersion [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]

これでアプリを起動してみると…。

ちゃんと確認のアラートが表示された〜!
エミュレータだと Safari が起動してエラーになります。エミュレータに AppStore 入ってないもんね。最初すっごく悩んだ…)


けど、メッセージが英語のままだよ…。
というわけで、今度はローカライズ


ダイアログのタイトルとボタン2つの文字列は HarpyConstant.h で定義されている。
これをこんな感じにしてローカライズされた文字列を取得するようにした。

#define kHarpyAlertViewTitle        NSLocalizedString(@"updateAlertViewTitle", @"Title of Harpy Update Alert View")
#define kHarpyCancelButtonTitle     NSLocalizedString(@"updateAlertCancelTitle", @"Title of Harpy Update Alert View Cancel Button")
#define kHarpyUpdateButtonTitle     NSLocalizedString(@"updateAlertOkTitle", @"Title of Harpy Update Alert View Update Button")

後は localizable.strings で各言語での文字列を加えれば OK。


最後はダイアログの中身の文章。
これは Harpy.m の中に直接書き込まれてるので、これもローカライズされた文字列を取得するように変更。
まずは HarpyConstant.h に定義を1つ加える。

#define kHarpyAlertContent     NSLocalizedString(@"updateAlertContent", @"Content of Harpy Update Alert View")

で、Harpy.m の中でこの定義を使ってアラートを作る。こんな感じ。

#pragma mark - Private Methods
+ (void)showAlertWithAppStoreVersion:(NSString *)currentAppStoreVersion
{
    NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
    if ( harpyForceUpdate ) { // Force user to update app
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:kHarpyAlertViewTitle
                                                            message:[NSString stringWithFormat:kHarpyAlertContent, appName, currentAppStoreVersion]
                                                           delegate:self
                                                  cancelButtonTitle:kHarpyUpdateButtonTitle
                                                  otherButtonTitles:nil, nil];
        [alertView show];
    } else { // Allow user option to update next time user launches your app
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:kHarpyAlertViewTitle
                                                            message:[NSString stringWithFormat:kHarpyAlertContent, appName, currentAppStoreVersion]
                                                           delegate:self
                                                  cancelButtonTitle:kHarpyCancelButtonTitle
                                                  otherButtonTitles:kHarpyUpdateButtonTitle, nil];
        [alertView show];
    }
}

これで後は localizable.string にフォーマット付きで各言語用の文字列を入れておく。

/* Content of Harpy Update Alert View */
"updateAlertContent" = "%@ が新しくなりました。\nバージョン %@ にアップデートしてください。";

というわけで、最終的にこんな感じで表示できるようになりました。

毎回こんなのが出てきたらうるさくて仕方がないからアップデートしてくれるでしょう!


というか、Harpy には「Update」ボタンしか出てこなくするオプションもあるので、それなら必ずアップデートをしてくれるでしょう。(あ、ホームボタンでアプリ後ろに回されちゃう可能性もあるけど…。)
けど、明確にアップデートしたくない理由がある場合なんかは、こんな状態になったらうるさくてアプリ使うのを止める、もしくは削除されちゃいそうだけど…。そういう場合用に「今後は表示しない」チェックマークも必要だな。


というわけで、なんだかんだ色々とやったけど、ここまでやるなら自分で最初からちょこちょこっとコード書いても良いかもね。