Attention! Translated article might be found on my English blog.
ラベル iOS の投稿を表示しています。 すべての投稿を表示
ラベル iOS の投稿を表示しています。 すべての投稿を表示

2018年1月8日月曜日

MPMediaPickerControllerで音楽ファイルのURLを取得するメモ

・Info.plistにNSAppleMusicUsageDescriptionというキーを追加し、値にテキストを追加する
・(通常は親側のビューコントローラで) MPMediaPickerControllerDelegateのメソッドを2つ実装する
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {
    NSURL *url = [mediaItemCollection.items.firstObject valueForProperty:MPMediaItemPropertyAssetURL];
    if (url)
        [self _openFileWithURL:url];
    [mediaPicker dismissViewControllerAnimated:YES completion:nil];
}

- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker {
    [mediaPicker dismissViewControllerAnimated:YES completion:nil];
}

・-[MPMediaPickerController presentViewController:animated:completion]を実行すると音楽を選択するビューに切り替わる
MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
    picker.delegate = self;
    picker.showsCloudItems = NO;
    picker.showsItemsWithProtectedAssets = NO;
    [self presentViewController:picker animated:YES completion:nil];

・シミュレータではiTunesMusicLibraryを利用できないので実機で動作確認を行う。
・MPMediaPickerControllerではDRM保護された音楽やiCloud上の音楽のURLを参照できないようです。


参考:
ios - MPMediaPickerController shows an empty screen on iOS10 - Stack Overflow
iphone - Can i access iPod Library on simulator? - Stack Overflow

2016年7月23日土曜日

UIGestureRecognizerがxib上で使えるのはXcode 4.2から

Xcode 4.2以上で作成したxibでUIGestureRecognizerを使っている場合、Xcode 4.1でビルドしようとしたりxibを編集しようとすると
Unable to resolve Interface Builder plug-in dependencies for "MainWindow.xib". Xcode 4 is missing components necessary to load the following classes: IBUITapGestureRecognizer, IBUIPanGestureRecognizer, and IBUIPinchGestureRecognizer. Ensure that Xcode has been properly installed.
というようなエラーが表示される。どうやらxib上でUIGestureRecognizerが使えるようになったのはXcode 4.2かららしい。 4.1以前ではソースコード側でrecognizerを作成/設定していたようだ。その場合は Event Handling Guide for iOS: Gesture RecognizersのListing 1-2 Creating a single tap gesture recognizer programmaticallyを参考にすると良さげ。

UIGestureRecognizerの利用でUIButtonの反応が鈍くなった場合の対処

uigesturerecognizer - UITapGestureRecognizer waiting for second tap, buttons slow - Stack Overflowを参考にすると、どうやらダブルタップ入力待ちのために一瞬固まるように見えてしまうようだ。(もしかするとダブルタップ用ジェスチャを外すと治るのかも)
この対策として、「ボタン類にタップした時はジェスチャ判定を行わない」という処理を追加する。
具体的にはUIGestureRecognizerのdelegateにUIGestureRecognizerDelegateプロトコル対応クラスのオブジェクトをセットし、
そのクラスにてgestureRecognizer:shouldReceiveTouch:を実装する。
UIControl類をタップした時に無視する場合は以下のようなコードで良さそうだ。


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // ボタンやテキストフィールドに対してはジェスチャ判定は行わない return ![[self hitTest:[touch locationInView:self] withEvent:nil] isKindOfClass:[UIControl class]]; }

ここで、selfはUIViewのサブクラスのオブジェクトでUIGestureRecognizerDelegateプロトコルに対応させてあり、使用するジェスチャのdelegateとしてセット済み。

AVSpeechSynthesizerで喋らせる

iOS >= 7.0
AVFoundation.framework追加後

#import <AVFoundation/AVFoundation.h>
AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"ja-JP"];
AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:@"こんにちは"];
utterance.voice = voice;
self.synth = [[AVSpeechSynthesizer alloc] init];
[self.synth speakUtterance:utterance];

声はOS Xで言うkyokoさんなんだと思う。
utteranceは"アタランス"という発音らしい。
アデランスみたいやなw

2015年5月28日木曜日

Safariと自作アプリでセッション(cookie)を共有する方法を調べた

2016/10/01 追記: 10.11から、アプリケーション間でcookieを共有できなくなった様です。
NSHTTPCookieStorage.hのsharedHTTPCookieStorageのdiscussionによると、
Starting in OS X 10.11, each app has its own sharedHTTPCookieStorage singleton, 
which will not be shared with other applications.
とのこと。むう…ユーザにいちいちログインしてもらったりするのはフィッシングサイト(アプリ)だと疑われそうで嫌ですね…。
2015/08/07 追記:WebViewを使えばSafariとセッションを共有できているようです。
共有するような設定ってどっかに有ったっけか…。
基本的に何もしなくても共有されるような気がします。
[NSHTTPCookieStorage sharedHTTPCookieStorage]というのが使えそう。

参考: Safari 5.1 cookie format specs - Stack Overflow
参考: NSHTTPCookieStorage Class Reference

なお、Safariのクッキーは~/Library/Cookies内で保存している模様。

参考: (旧) Cocoaの日々: Safari のクッキーはどう保存されているのか?

但し、現在はplistではなく、.binarycookiesというフォーマットのようです。
.binarycookiesは普通のバイナリですが、解析用スクリプトが色々あるようで、
こちらからもアプローチできそうです。

参考: Another Forensics Blog: Safari Binary Cookies - Now with more parsing power!
参考: Safari/iOS - Cookies.binarycookies reader

2014年11月10日月曜日

iOS 8では.aupresetを使ってSoundFontを読めなくなった

AU Lab上でSoundFontを使った.aupresetを作り、それをTechnical NoteのLoading an instrument from a AUSampler Preset Fileを参考に読みこんでAUSamplerにセットしていたのですが、
iOS 8(シミュレータ含む)ではAudioUnitSetProperty() - kAudioUnitProperty_ClassInfoを実行すると

ERROR:     354: InstrumentManager::GetSampleWithID: Cannot find sample with ID 0x10000001

というエラーが出て読み込めなくなってしまいました。(iOS 7だと実機、シミュレータ共にOK)
.aupresetを使う方法は諦め、Technical NoteのLoading an instrument from a DLS2 sound bank or SoundFont Fileの方法を使うようにしました。

なお、Yosemite上のAU Lab(2.3.1)でもAUSamplerのプリセットをロードしようとすると同様のエラーが出てサンプルを読み込めない場合があるようでした。