ブログアーカイブ プロジェクト ワークスタイル お問い合わせ

「京都 夏」におけるiPhoneアプリで下位互換を維持する手法


この記事は「京都 夏」iPhoneアプリケーションの開発に関するものです。京都 夏

OS別普及率

「京都 夏」の開発当時、最新の iPhone OS は 3.0 でした。3.0 からはアプリ内でマップを表示できる機能が追加されたため、この機能を使い、写真から地図を表示するという機能を実装する事にしました。しかし、OS バージョン別の普及率を調べてみると、2.2.1 が圧倒的に多く、これでは購入者を大幅に減らせてしまうと思いました。

こちらのサイトで OS バージョン別の普及率が出ています。 iPhoneOS percentages 08/2009

iPhone OS 3.0 Adoption Rate Estimates All Over The Place : 2009/06/29

iPhone では無料で OS の更新ができるため 3.0 のユーザーが多いと思うのですが、iPod touch は有料アップデートのためか依然として2.2.1が多いようで、その割合は2009年8月末時点で全体の 40% ほどを占めています。

そこで我々は、iPhone SDK 3.0 で開発を行いならが、2.2 でも動作が可能な手法をとりましたので、紹介したいと思います。

下位互換の手法

まず、開発のポイントは2つあります。

  • 3.0 にしか無いライブラリは Weak リンクをする

  • 実行時に OS のバージョンを調べ動作を変える

ライブラリは通常 Required というモードで追加されます。このモードでは、実機での実行時にライブラリが存在していない場合はアプリが起動しません。 これを Weak というモードに変更する事で、実機での実行時にライブラリが存在していなくても起動できるようになります。今回は 3.0 から追加されたライブラリである MapKit.framework を Weak に設定します。以下の画像が設定例です。

PMS1-001

そして、次に OS のバージョンによって動作を変えます。MapKit.framework がリンクされていない 2.2 などでは、その機能を使おうとするとアプリが落ちてしまいます。以下のコードが OS のバージョンを調べ、3.0 以下の場合は Map に関するクラスを作成しないものになります。

float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if(version >= 3.0){
    MapController   *_map = [[MapController alloc] init];
    self.mapController = _map;
    [_map release];
}

また、2.2 でもマップ表示を実装するために、外部マップアプリで表示する手法をとっています。

float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if(version >= 3.0){
    [g_Instance.mapController setTitle:NSLocalizedString([NSString stringWithCString:title encoding:NSUTF8StringEncoding], @"") latitude:latitude longitude:longitude];
    [g_Instance push:g_Instance.mapController];
}else{
    NSString* url8 = [NSString stringWithFormat:@"%@%f,%f (%@)", @"http://maps.google.com/map?f=q&q=", latitude, longitude, NSLocalizedString([NSString stringWithCString:title encoding:NSUTF8StringEncoding], @"")];
    NSString *uelEncode = (NSString*)CFURLCreateStringByAddingPercentEscapes(
                                    kCFAllocatorDefault,
                                    (CFStringRef)url8,
                                    NULL,
                                    NULL,
                                    kCFStringEncodingUTF8); 

    NSURL* url = [NSURL URLWithString:uelEncode];
    [[UIApplication sharedApplication] openURL:url];
}

こちらが 3.0 と 2.2系 での動作を比較した動画です。