ObjecTips

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

Xcode プロジェクトの watchOS 1 から watchOS 2 への移行

watchOS 1 から watchOS 2 への移行は、Xcode のプロジェクトを選択して Editor > Validate Settings... を選択して Xcode にお任せてプロジェクト更新するのが良い。 でもなぜかこの時に watchOS の移行についての項目が出てこなくてプロジェクトがうまくア…

自作の iOS Framework を watchOS に対応させる

自作Farmework内で watchOS で利用できないAPIを使っていると not available on watchOS のエラーが出て watchOS 向けにビルドできない。 Apple純正の Framework と同じようにヘッダのメソッド定義に __WATCHOS_PROHIBITED を付けて watchOS では使えません…

NSString の真偽値の判定

NSString で表される文字列の真偽値を判定するには boolValue メソッドが使える。 @property (readonly) BOOL boolValue NS_AVAILABLE(10_5, 2_0); 数字、YES/NO、true/false などの文字列を boolValue メソッドで判定できる NSLog(@"%d", @"1".boolValue); …

Touch IDのエラーまとめ

LAContext の以下のAPI - (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString *)localizedReason reply:(void(^)(BOOL success, NSError * __nullable error))reply; このAPIで指紋認証の LAPolicyDeviceOwnerAuthenticationWithBiometrics …

ターミナルでUUIDを生成する

iOS, macOS でプログラム内でUUIDを使う場合 CFUUID か NSUUID が使える。 プログラム外で識別子としてUUIDが欲しい時は uuidgen というコマンドが用意されているのでこれを使う。 ターミナルで $uuidgen 結果は以下のように生成されたUUIDが表示される 14B7…

Google Firebase で既存の AdMob アカウントを使う

新たに作成したFirebaseアカウント(GoogleアカウントA)で今まで使っていた既存のAdMobアカウント(別のGoogleアカウントB)を引き続き使いたいというパターンの手順。 *1 *2 GoogleアカウントAでFirebaseにログイン 新規プロジェクトを作成 歯車アイコンか…

Google Firebase で Crash Reporting を使う

まず初めに 後からこの issue で分かった事だけど https://github.com/firebase/quickstart-ios/issues/13 Google Cloud Platform の利用規約に同意しておかないと下の手順の dSYM アップロード用のアカウントの作成やその権限付与でサーバエラーが起きて進…

Bitcode対応のアプリでクラッシュレポートを使う際の注意

アプリをBitcode対応してリリースしたら Crashlytics でクラッシュレポートが表示されなくなってしまった。 ダッシュボードには dSYMs が見当たらないとのメッセージが。 Found 1 unsymbolicated crash from missing dSYMs in 1 version in the last 24 hour…

Atom のデフォルト syntax を変更する

GitHub製のエディタAtomでplistを開くとデフォルトでは Property List (Old-Style) として開かれるが、今時のplistファイルはOld-Style形式ではなくXML形式なので syntax error になってしまう。 メニューの Edit>Select Grammar かウィンドウ右下のフォーマ…

watchOS 1からwatchOS 2への置き換え例

watchOSとiOSでデータのやり取りをしている場合のwatchOS 1からwatchOS 2への置き換え例 watchOS watchOS 1 [WKInterfaceController openParentApplication:userInfo reply:^(NSDictionary *replyInfo, NSError *error) { if (error) { } else { } }]; watch…

Playground で delegate を使う

Playground で delegate メソッドを扱うにはどうする? delegate が呼ばれるクラスの実装が必要、Playground でクラス定義できるの? というあたりが疑問だったけど Playground でも普通にクラス定義が可能で delegate も試せるらしい。 下記の前回のコード…

Playground でオーディオ再生(音声読みあげ)をする

Playground を使って簡単なオーディオ再生のテストを行う。 スニペットを実行確認するのにいちいちダミーのアプリを作ったりしなくていいのが Playground の便利なところ。 Playground なので言語は Swift まずババッと以下のコードを書いてみる。 オーディ…

中国語のローカライズ表記

iOS の言語設定の言語一覧画面と同じような画面を作ろうと思って実装してみたら中国語の場合に思い通りにいかなかったメモ iOS の言語設定の言語一覧画面 cell.textLabel.title には現地語でのローカライズ表記 cell.detailTextLabel.title にはシステム言語…

XLIFF ファイルを使ってローカライズ

現在一番新しいローカライズの方法が XLIFF を使ったプロジェクト全体のローカライズになる。 この方法は Base Internationalization 方式でのローカライズを想定している。 Xcode のプロジェクトナビゲーターでプロジェクトを選択した状態でメニューから Ed…

ibtool を使って incremental にローカライズ

前回 今回は前回の ibtool を使ったローカライズの話の続き ibtool には incremental localization という機能がある。 コマンドの形式 ibtool --previous-file <old_file> --incremental-file <old_translated_file> --localize-incremental --write <new_translated_file> <current_modified_file> --previous-file <old_file> には翻訳元の古いフ</old_file></current_modified_file></new_translated_file></old_translated_file></old_file>…

ibtool を使ってローカライズ

サンプルに使用する Main.storyboard ファイルは ViewController の上に1つ UILabel が載っているだけの状態 storyboard ファイルの中身のXMLは以下

genstrings で Localizable.strings を生成する

genstrings は C や Objective-C のソースコードファイルから .strings ファイルを生成するユーティリティで、以下のマクロと関数を Localizable.strings に書き出してくれる。 NSLocalizedString("key", comment); CFCopyLocalizedString("key", comment); …

Localizable.strings ファイルを plutil で読み込んで変換する

plutil -- property list utility コマンドで Localizable.strings (strings file format) を読み込む事が出来るらしいので試してみる。 元ファイルは以下 /* Localizable.strings Test */ "Yes" = "はい"; "No" = "いいえ"; "Cancel" = "キャンセル"; "Titl…

Localizable.strings ファイルを Cocoa で読み書きする

ローカライズに用いる Localizable.strings ファイルは NSDictionary で簡単に読み書きができる。 例えば以下のような Localizable.strings があった時 /* Localizable.strings Test */ "Yes" = "はい"; "No" = "いいえ"; "Cancel" = "キャンセル"; "Title" …

SSReadingList で出来る事

リーディングリスト周りのAPIを使って何が出来るのか調査。 Framework は SafariServices.framework でリーディングリスト周りのクラスは SSReadingList のみ。 API は以下 イニシャライザ + (nullable SSReadingList *)defaultReadingList; - (instancetype…

watchOS 2.2 API Diffs

前記事の iOS と同じく β3 での変更点に限らず watchOS 2.2 から watchOS 2.3 で今のところ追加予定のものを調査。 (網羅はしてない) 以下ドキュメント watchOS 2.2 API Diffs / watchOS 2.1 to watchOS 2.2 API Differences https://developer.apple.com/…

iOS 9.3 β3 API Diffs

β3 での変更点に限らず iOS 9.2 から iOS 9.3 で今のところ追加予定のものを調査。 (網羅はしてない) ドキュメントは以下2つ iOS 9.3 API Diff / iOS 9.2 to iOS 9.3 API Differences https://developer.apple.com/library/prerelease/ios/releasenotes/Ge…

UITextView で「リッチテキストとしてペースト」pasteAsRichText を実装する その2

前回 前回の結果を踏まえて copy: メソッドもオーバーライドして挙動をカスタマイズする事にする。 簡単なのは copy: メソッドの super の挙動を呼び出してペーストボードの中身を作ってから自前で追加したいものを加える方法。 実装 - (void)copy:(id)sende…

UITextView で「リッチテキストとしてペースト」pasteAsRichText を実装する

OS Xでの挙動 OS Xの NSTextView には - (void)paste:(id)sender; - (void)pasteAsPlainText:(id)sender; - (void)pasteAsRichText:(id)sender; これらのメソッドがあって、システムのペーストの挙動をそのまま使う事もできるしプレーンテキストやリッチテキ…

AppleScript の JavaScript for Automation で plist ファイルを作成する

上記の記事ではJSONファイルの書き出し保存を行った。 iOS でデータを扱う際には JSON より plist の方が読み込みが簡単なので plist 形式でのファイル保存もさらっておく。 plist の書き出しは NSArray or NSDictionary を writeToFile:atomically: で書き…

AppleScript の JavaScript for Automation で Excel から JSON ファイルを作成する その2

前回 前回のコードではエクセルの1行目の colums が固定長で key も固定の値として実装されていた。 これを改良して可変長に対応するよう修正してみた。 シートが何行何列あってもシート全体を一括して JSON に変換できる。 以下の決まり事で実装 シートの1…

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

以前 NSCharacterSet の decimalDigitCharacterSet メソッドを使って文字列が数字のみを含んでいるかを調べるコードを書いた。 ここに少しコードを追加して文字列がローカライズとフォーマットされた数字表記のみを含んでいるかどうかを調べるコードにする。…

コピー可能な UILabel

編集不可な文字列を UILabel で表示させつつユーザにコピー操作だけはさせたいという事があったので実装を試みてみた。 コピーの方法は UITextView や UITextField でコピー操作を行う時と同様にポップアップのメニューを表示するようにする。 メニューは UI…

OSType, FourCharCode から NSString への変換

いろいろデバッグしていて OSType や FourCharCode を扱う事があるので備忘。 OS Xだと Foundation.framework に NSFileTypeForHFSTypeCode という便利な関数が用意されている。 この関数はシングルクォーテーションで囲われた文字列を生成する。 OSType typ…

ナビゲーションバーを透明にする transparent UINavigationBar

サンプルとして UINavigationController の rootViewController に UITableViewController を設定したものを使う。 UINavigationItem に適当にボタンを設定して UITableView の tableViewHeader に UIImageView を aspectToFill で入れて画像を設定。 Storyb…