BAD_ACCESS

おもにiOS、ときどき変な電子工作、ガジェット話。

位置情報の利用をどうしてもオンにしてほしいときの対応

位置情報を必要とするアプリが増えてきている一方で、iOS5からどうも電池の減るスピードが早くなったと感じてついつい位置情報をオフにしているユーザーも多いのではないでしょうか?
開発者の立場としてはなかなか辛いところですが、今回は位置情報の利用をどうしてもオンにして欲しいときの対応について書きます。

iOS5からiPhoneの設定画面へもURLスキームを使ってアクセスできるようになりました。
(どういった機能にアクセスできるようになったかは以下の記事が詳しいです)
iPhoneの設定画面をサクッと開く方法 -『Touch Icon Creator』でURLスキーム対応アイコンを簡単に作る | 代助のブログ
IPhone URL Schemes - akosma wiki

当然、位置情報の設定にもアクセスできるようになるので、位置情報が有効でない場合に表示するAlertViewで確認のボタンを押した際に設定項目にジャンプするようにします。

//まずは位置情報が使えるかどうか?
if (![CLLocationManager locationServicesEnabled])
{
        UIAlertView *locationSettingConfirm;
        locationSettingConfirm = [[UIAlertView alloc]init];
        [locationSettingConfirm setTitle:@"エラー"];
        [locationSettingConfirm setMessage:@"位置情報設定をOnにしてください"]; 
        [locationSettingConfirm setDelegate:self];

//「OK」ボタンと「キャンセル」ボタンを表示できるようにしておく
        [locationSettingConfirm addButtonWithTitle:@"OK"];
        [locationSettingConfirm addButtonWithTitle:@"キャンセル"];
        [locationSettingConfirm setCancelButtonIndex:1];

         [locationSettingConfirm show];
         [locationSettingConfirm release];
}

ボタンが押された時の処理(iOS5以降かどうかも判定しておく)

-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{
    [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];
    float version = [[[UIDevice currentDevice]systemVersion]floatValue];
    switch (buttonIndex) 
    {
        case 0://OKボタンを押した時。
            if(version >= 5.0f)
            {
                NSString *schemeStr =  @"prefs:root=LOCATION_SERVICES";
                NSURL *schemeURL = [NSURL URLWithString:schemeStr];
                [[UIApplication sharedApplication] openURL:schemeURL];
                break;
            }
            else
            {
                break; 
            }
        case 1:
            //「キャンセル」ボタンが押されたときの処理を記述する
            break;
    }
}

「OK」ボタンが押されると設定画面の位置情報項目までジャンプ。
ここでなんとか位置情報をオンにしてもらえれば。

※ただしURLスキームがiOS5.1以降で一部つかえなくなるような噂も…
iOS 5.1 Beta Blocks Shortcuts to System Settings