ObjecTips

Swift & Objective-C で iOS とか macOS とか

Objective-C

Share Extension の NavigationItem をカスタマイズする

Share Extension のテンプレートで作成される SLComposeServiceViewController のサブクラスを自前のコントローラクラスとして、コード内では self として説明する。 Share Extension のデフォルトの表示が以下 self.title = @"Title"; これで NavigationBar…

StoreKit の iOS 8.3 での変更点

iOS 8.3 で StoreKit に若干の変更があった。いずれも役に立つ変更。 ファミリー共有の Ask to Buy のテストが可能に SKPayment @property(nonatomic, readonly) BOOL simulatesAskToBuyInSandbox NS_AVAILABLE_IOS(8_3); SKMutablePayment @property(nonato…

発着信と通話の開始停止を検出する

前回に続き CoreTelephony のネタ 携帯キャリアの情報を取得する - ObjecTips CoreTelephony を使って電話の発着信と通話の開始停止を検出できる。 コールバックはアプリがアクティブな時に受け取れる。 CTCallStateIncoming 電話がかかってきた時 CTCallSta…

携帯キャリアの情報を取得する

CoreTelephony.framework を使えばできるらしい。知らなかった。 CTTelephonyNetworkInfo をインスタンス化して subscriberCellularProvider メソッドを呼べば CTCarrier でキャリア情報が取得できる。 CTCattier にはキャリア情報に関するいくつかのプロパ…

NSFormatter クラス まとめ

Framework クラス OS X iOS 用途 Foundation NSNumberFormatter 10.0 2.0 数値 Foundation NSDateFormatter 10.0 2.0 日付 Foundation NSByteCountFormatter 10.8 6.0 Byte,KB,MB,GB 等 MapKit MKDistanceFormatter 10.9 7.0 メートル、ヤード、キロ 等 Foun…

Photos.framework でカメラロールを取得する

Photos.framework でカメラロールを取得する方法が分かり辛かったので備忘 fetchAssetCollectionsWithType:subtype:options: メソッドの引数の type で PHAssetCollectionTypeAlbum を指定した場合、写真アプリで作成したものとiTunesで同期したアルバムの一…

スクリーンショットを検出する

iPhone のホームボタンとロックボタン同時押しでのスクリーンショットを検出する UIApplicationUserDidTakeScreenshotNotification が iOS 7 で追加されている。 これを使えばスクリーンショットを検出できる。 [[NSNotificationCenter defaultCenter] addOb…

Share Extension の ConfigurationViewController を投稿画面のようにブラー表示する

ピンポイントなタイトルだけど Share Extension の実装の際にこれはやっておきたいなという事で。 まずプロジェクトへの Share Extension の追加は省略。 設定が終わると Safari などから Extension を呼び出す事ができる。 とりあえず名前は Test Share Ext…

Storyboard で UIViewController の dismiss を設定できるようにする

Storyboard で segue を設定して画面遷移を作っていく時、Modal 表示した ViewController にキャンセルボタンを設置する事がままある。 この時の ViewController への実装は - (IBAction)cancel:(id)sender { [self.presentingViewController dismissViewCon…

WatchKit Extension から親アプリを起動した時の挙動

WKInterfaceController の openParentApplication: メソッドから親アプリが起動された際にどのような処理の流れになるのか確認してみた。 確認方法は以下 親アプリとエクステンションの両方に NSLog を仕込む Xcode で WatchKit App をターゲットにしてrunす…

フォトライブラリへの動画保存メソッド まとめ

PHAssetChangeRequest.h (iOS 8以降) + (instancetype)creationRequestForAssetFromVideoAtFileURL:(NSURL *)fileURL; PHPhotoLibrary の performChanges:completionHandler: または performChangesAndWait:error: メソッドと組み合わせて使用する。 ALAsset…

フォトライブラリへの画像保存メソッド まとめ

PHAssetChangeRequest.h (iOS 8以降) + (instancetype)creationRequestForAssetFromImage:(UIImage *)image; + (instancetype)creationRequestForAssetFromImageAtFileURL:(NSURL *)fileURL; PHPhotoLibrary の performChanges:completionHandler: または pe…

iOS 8での位置情報のプライバシーアクセス

iOS 7では CLLocationManager を用いて位置情報を利用する際に自動的にシステムのアラートが表示される。 CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; self.locationManager = locat…

指紋認証APIの iOS 8.3 での変更点

iOS 8.2 から iOS 8.3 で Touch ID を使った指紋認証APIに微妙な変更があった。 フォールバックボタンの表示 まず iOS 8.2 で以下のコードを呼び出す LAContext *context = [[LAContext alloc] init]; [context evaluatePolicy:LAPolicyDeviceOwnerAuthentic…

NSViewController の viewWillAppear メソッド

OS X v10.10 の NSViewController に iOS の UIViewController と同じような以下のメソッドが追加された。 - (void)viewWillAppear NS_AVAILABLE_MAC(10_10); - (void)viewDidAppear NS_AVAILABLE_MAC(10_10); - (void)viewWillDisappear NS_AVAILABLE_MAC(1…

NSPredicate で UTI を扱う

NSPredicate の predicateWithFormat: のフォーマット内で UTI-CONFORMS-TO という評価式が使える。 これは UTTypeConformsTo() ファンクションと同じロジックで UTI を判定に用いる事ができて、例えばファイル情報のリストに対して UTI-CONFORMS-TO で kUTT…

NSPredicate で正規表現

NSPredicate と正規表現の組み合わせはちょっとややこしい。 例えば、正規表現で数字列を検出する場合 \d+ を用いる。 NSString でこの文字列を扱う場合 \ がエスケープ文字なので、これをこのまま NSString に入れると Unknown escape sequence '\d' という…

NSPredicate でワイルドカード

predicateWithFormat: でワイルドカードを使う事ができる。 1つ目はの a*e は先頭の文字が a で間に何文字か挟んで(0文字でもOK)末尾の文字が e の文字列が条件に合致する。 2つ目の a??le は先頭の文字が a で間に2文字挟んで末尾の文字が le の文字列が…

Xcode 6 での Storyboard の画像設定の不具合

Xcode 6.3 で検証 xcassets で Render As Template Image に設定したテンプレート画像を Storyboard 上で UIButton に設定してビルドした時に、iOS 8 だと正しく tintColor が反映されるけど iOS 7 だと tintColor が設定されないという問題がある。たぶん不…

iPhone 本体の音量

本体のハードウェアキーで設定可能な volume 値を調べてみた。 コードは以下 NSLog(@"%f", [MPMusicPlayerController systemMusicPlayer].volume); iOS 8ではdeprecated だけど warning を無視してビルドして確認。 結果は以下 *iOS 8.3 0.000000 0.062500 0…

iPhone 本体の音量を変更する その2

koze.hatenablog.jp 前回は結局 Private API を使うとできるという話になってしまったので今回は正攻法で。 MPVolumeView を使う。 UIが提供されるのみで programmatically に設定はできない。 UIはこんな感じ。 分かりやすく以下のコードで border を描画し…

iPhone 本体の音量を変更する

iPhone 本体の音量を変更するには MPVolumeView と MPMusicPlayerController クラスを使う。 MPMusicPlayerController には アプリ内の音楽再生周りを制御するインスタンスを呼び出す + (MPMusicPlayerController *)applicationMusicPlayer; システムの音楽…

UIKit の Private な UIGestureRecognizer その4

UIKit の Private な UIGestureRecognizer その3 - ObjecTipskoze.hatenablog.jp 前回の記事で実装した LogGesture() 関数を用いてシステムが自動的に - (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer で設定するジェスチャの中身を…

メソッド置換

Runtime API に method_exchangeImplementations というメソッド置換を行う関数がある。 メソッド交換、メソッド置き換え、メソッド入れ替えなどとも呼ばれる。 実装は簡単 objc/runtime.h をimportして Class cls; Method m1 = class_getInstanceMethod(cls…

UIKit の Private な UIGestureRecognizer その3

前回の続き id object = [[gestureRecognizer valueForKey:@"targets"] firstObject]; で取り出した Private な UIGestureRecognizerTarget クラスから target と action を取り出す。 target は KVO で取得できる。 id target = [object valueForKey:@"targ…

UIKit の Private な UIGestureRecognizer その2

NSLog(@"%@", gestureRecognizer); の出力結果って見辛いよねって事で、いい感じに調査をするために調査用のログ出力を試みてみる。 通常のログ出力 <UITextTapRecognizer: 0x7ff853734850; state = Possible; delaysTouchesEnded = NO; view = <MyTextField 0x7ff853725f30>; target= <(action=oneFingerTripleTap:, target=<UITextInteractionAssistant 0x7ff853724d50>)>; num…</uitextinteractionassistant></uitexttaprecognizer:>

クラス階層を調べる

Private なクラスに出会った時に、そのクラスの superClass がさらに Private だったりする事がある。 その時にさらに superClass に遡って、、とやるのも面倒なので一気にクラス階層を出力できるようにする。 実装方法は以下の記事と同じく Private なメソ…

Private なメソッド、プロパティ、インスタンス変数を調べる

クラスの Private なメソッド、プロパティ、インスタンス変数を調べるには Objective-C の Runtime API を使う。 メソッドは Method, プロパティは objc_property_t, インスタンス変数は Ivar 型で取得できる。 #import <objc/runtime.h> で Runtime API を import してそれ</objc/runtime.h>…

UIKit の Private な UIGestureRecognizer

UITextField の長押し時の挙動をカスタマイズする必要があって調べてみたらいろいろと面白かった。 調べた方法は以下 UITextField のサブクラスを作って UIView の - (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer NS_AVAILABLE_IOS(…

NSString が数字のみで構成されているかを判定する

暗証番号とかパスコードの入力画面を作る際に数字だけの入力を許可したい場合がある。 文字列の入力制限は UITextFieldDelegate のメソッド - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(N…