iOSアプリ開発の逆引き辞典

iPhone/iPadで使えるアプリ開発のTipsをまとめてみました

カスタムURLスキームを使って地図アプリに位置座標を渡して連携起動する

地図アプリを位置情報を渡して起動させたい場合、どのようにして連携起動を行うのかをご紹介したいと思います。

UIApplicationクラスはアプリケーション全体を管理するクラスです。canOpenURL:メソッドで実際に開くことが可能なURLなのかどうか判定し、その上でopenURL:メソッドを使って地図アプリを起動しています。

地図アプリに位置座標を渡して連携起動する(iOS 6〜)

iOS 5までは、iPhoneの標準地図アプリと言えば「Googleマップ」が使われていました。しかし、iOS 6ではGoogleからではなくApple自身が各国の地図配給会社と直接提携して開発した地図アプリが標準地図アプリとなりました。

地図データの配給会社としては、海外をTomTom社をはじめ複数社、日本では[インクリメント・ピー]社(http://www.incrementp.co.jp/)のデータが使われるようになっています*1

カスタムURLスキームがhttp://maps.apple.com/に変更されています。

NSString *format = @"http://maps.apple.com/maps?ll=%1.6f,%1.6f";
NSString* urlString = [NSString stringWithFormat:format, 35.668194, 139.601111];
    
NSURL* url = [NSURL URLWithString:urlString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url];
}

上記のサンプルコードを実行すると下図のように、地図アプリが起動し指定した位置座標の場所を表示していることがわかります。

f:id:ch3cooh393:20140303012128p:plain

出発地点と到着地点を指定して地図アプリを起動させる(iOS 6〜)

iOS 6以降対応のアプリでの出発点と到着始点を指定して、地図アプリを起動するためにはどうすればよいでしょうか。iOS 5以前と同じようにsaddrに出発地点、daddrを指定してopenURL:メソッドを実行します。

iOS 5以前とのカスタムURLスキーマの違いはドメイン部分だけとなります。

    // 出発点
    NSString *name1 = @"大阪駅";
    NSString *encName1 = [name1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    // 到着点
    NSString *name2 = @"大阪市北区";
    NSString *encName2 = [name2 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSString* urlstr = [NSString stringWithFormat:@"http://maps.apple.com/?saddr=%@&daddr=%@",
                        encName1, encName2];
    
    NSURL* url = [NSURL URLWithString: urlstr];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }

上記のサンプルコードを実行すると下図のように、地図アプリが起動し順路が表示されているのが分かります。

f:id:ch3cooh393:20140303012252p:plain

地図アプリに位置座標を渡して連携起動する(〜iOS 5)

前述した通り、iOS 6以降は標準の地図アプリがApple独自のものになってしまったため、iOS 5では標準地図アプリを起動できていた下記のカスタムURLを使用すると、Googleマップアプリが起動します。

NSString *name = [item valueForKey:@"桃山大学"];
NSString *encName = [name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString* urlstr = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@@%1.6f,%1.6f",
    encName, 135.5583577, 34.8477655];

NSURL* url = [NSURL URLWithString: urlstr];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
    [[UIApplication sharedApplication] openURL:url];
}

出発地点と到着地点を指定して地図アプリを起動させる(〜iOS 5)

他にもカスタムURLスキームにどのようなパラメータがあるのか調べてみました。

例えば、地図アプリでルート検索をおこない場合には、出発地点にsaddr=、到着地点にdaddr=を指定します。大阪駅から大阪北区へのルートを表示させる場合には、URLは以下のようになります。

http://maps.google.co.jp/maps?saddr=%E5%A4%A7%E9%98%AA%E9%A7%85&daddr=%E5%A4%A7%E9%98%AA%E5%B8%82%E5%8C%97%E5%8C%BA

コードで書くと以下の通りです。

    // 出発点
    NSString *name1 = @"大阪駅";
    NSString *encName1 = [name1 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    // 到着点
    NSString *name2 = @"大阪市北区";
    NSString *encName2 = [name2 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSString* urlstr = [NSString stringWithFormat:@"http://maps.google.co.jp/maps?saddr=%@&daddr=%@",
                        encName1, encName2];
    
    NSURL* url = [NSURL URLWithString: urlstr];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }

iOS 7シミュレータにて上記のサンプルコードを実行すると、下図のようにSafari上でGoogle Mapsが表示されます。

f:id:ch3cooh393:20140303012103p:plain

参考

他にも沢山パラメータが存在しているので、Apple社のドキュメントを紹介します。

*1:地図アプリのライセンス欄参照