アプリからメールを起動する

アプリからメールを起動する方法。

.hファイル

・メールのフレームワークを読み込む
・メール用のデリゲートをセット

#import <MessageUI/MessageUI.h>

@interface MainViewController : UIViewController <MFMailComposeViewControllerDelegate>

.mファイル

//------------------------------------------------------------------------------
// メール機能開始
//------------------------------------------------------------------------------
- (void)mailStart{
    // メールを利用できるかチェック
    if (![MFMailComposeViewController canSendMail]) {
        return;
    }
    
    //メール管理作成
    MFMailComposeViewController *mailCtrl = [[MFMailComposeViewController alloc] init];
    //デリゲートの設定
    mailCtrl.mailComposeDelegate = self;
    //タイトル
    [mailCtrl setSubject:[NSString stringWithFormat:@“メールタイトル”]];
    //メールアドレス
    [mailCtrl setToRecipients:[NSArray arrayWithObjects:@"メールアドレス”, nil]];
    //本文
    [mailCtrl setMessageBody:@"メール本文” isHTML:NO];
    
    //送信するデータのNSString
    NSString *str = @"データ用文字列";
    //送信するデータをNSData型に変換する
    NSData *data = [str dataUsingEncoding:NSShiftJISStringEncoding];dataUsingEncoding:NSShiftJISStringEncoding];
    //データを添付する
    [mailCtrl addAttachmentData:data mimeType:@"text/csv" fileName:@“データファイル名.csv”];
    
    //メールビューを表示
    [self presentViewController:mailCtrl animated:YES completion:nil];
    
}
//------------------------------------------------------------------------------
// メール機能終了(終了すると呼ばれる)
//------------------------------------------------------------------------------
- (void)mailComposeController:(MFMailComposeViewController*)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError*)error {
    switch (result)
    {
      // キャンセル
        case MFMailComposeResultCancelled:
            break;
        // 保存
        case MFMailComposeResultSaved:
            break;
        // 送信
        case MFMailComposeResultSent:
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"送信に成功しました。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert show];
            break;
        }
        // 送信失敗
        case MFMailComposeResultFailed:
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"送信に失敗しました。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
            [alert show];
            break;
        }
        default:
            break;
    }
    // モーダルビューを閉じる
    [self dismissViewControllerAnimated:YES completion:nil];
}

音量を取得する

iPhoneでマイクから拾った音の音量を取得する方法。


① AudioToolBoxをインポートする

#import <AudioToolbox/AudioToolbox.h>


②音声入力用のキューとタイマーのインスタンス変数を用意する

@implementation ViewController{
    AudioQueueRef _queue;
    NSTimer *_timer;
}


③コールバック関数を宣言する(今回は録音をしないので、中身は空)

static void AudioInputCallback(
                               void* inUserData,
                               AudioQueueRef inAQ,
                               AudioQueueBufferRef inBuffer,
                               const AudioTimeStamp *inStartTime,
                               UInt32 inNumberPacketDescriptions,
                               const AudioStreamPacketDescription *inPacketDescs)
{
}


④音検知の設定、開始

- (void)startUpdatingVolume{
    // 記録するデータフォーマットを決める
    AudioStreamBasicDescription dataFormat;
    //サンプリング周波数(1秒間のフレーム数)
    dataFormat.mSampleRate = 44100.0f;
    //フォーマットID(リニアPCM、MP3、AACなど)
    dataFormat.mFormatID = kAudioFormatLinearPCM;
    //フォーマットフラグ(エンディアン、整数or浮動小数点数)
    dataFormat.mFormatFlags = kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
    //1バケットのバイト数
    dataFormat.mBytesPerPacket = 2;
    //1バケットのフレーム数
    dataFormat.mFramesPerPacket = 1;
    //1フレームのバイト数
    dataFormat.mBytesPerFrame = 2;
    //1フレームのチャンネル数
    dataFormat.mChannelsPerFrame = 1;
    //1チャンネルののビット数
    dataFormat.mBitsPerChannel = 16;
    //?
    dataFormat.mReserved = 0;
    
    // レベルの監視を開始する
    AudioQueueNewInput(&dataFormat, AudioInputCallback, (__bridge void *)(self), CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &_queue);
    AudioQueueStart(_queue, NULL);
    
    // レベルメータを有効化する
    UInt32 enabledLevelMeter = true;
    AudioQueueSetProperty(_queue, kAudioQueueProperty_EnableLevelMetering, &enabledLevelMeter, sizeof(UInt32));
    
    // 定期的にレベルメーターを監視するタイマーを設定
    _timer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                              target:self
                                            selector:@selector(detectVolume:)
                                            userInfo:nil
                                             repeats:YES];
}


⑤一定時間ごとにレベルを取得する(④で指定した秒数ごとに呼ばれる)

- (void)detectVolume:(NSTimer *)timer
{
    // レベルを取得
    AudioQueueLevelMeterState levelMeter;
    UInt32 levelMeterSize = sizeof(AudioQueueLevelMeterState);
    AudioQueueGetProperty(_queue, kAudioQueueProperty_CurrentLevelMeterDB, &levelMeter, &levelMeterSize);
    
    // 最大レベルと平均レベルを表示(値はマイナスを取る、最大が0.0)
    NSLog(@"mPeakPower:%f",levelMeter.mPeakPower);
    NSLog(@"mAveragePower:%f",levelMeter.mAveragePower);
    
    if (levelMeter.mPeakPower > -1.0) {
         //音量が一定値を越えると処理を行う
    }
}


⑥音の検知の終了

- (void)stopUpdatingVolume{
    // キューを空にして停止
    AudioQueueFlush(_queue);
    AudioQueueStop(_queue, NO);
    AudioQueueDispose(_queue, YES);
    //タイマーを停止する
    if ([_timer isValid]) {
	[_timer invalidate];
	_timer = nil;
    }
}

使ったあとは停止しましょう。




Xcodeショートカットキーのカスタマイズ

Xcodeを使っていて、ショートカットキーを自分の使いやすいようにいじりたいなーと思ったときのめも。

英語が苦手すぎて「環境設定は?!どこ?!」ってすぐ迷う……

 

やり方 

Xcodeのメニューバー「Xcode」→「Preferences」→「Key Bindings」タブ

でショートカットキーの確認画面に入れます。

 

初めての時は、

上のKey Binding Setの横の「Default」をクリックし、「Manage Key Bindings…」を選択、

左下の「+」ボタンを押して「Duplicate "Default"」を押すとデフォルトのショートカットキーの設定をコピーすることができるので、

自分の好きな名前をつけてあとは自由に編集しましょう!

 

変更したい項目を見つけて、「Key」の部分をダブルクリックし、変更したいキーを入力、他の部分をクリックすることで変更を完了できます。