2014/09/12新しいiPhoneやiOS8のリリースも正式にアナウンスされドタバタしています。iOS8の新機能、Extension。「写真」アプリで写真を選択し、アクションボタンをタップするとこのようにTwitterやFacebookに投稿したり、印刷したりする機能が現れます。iOS8ではアプリケーションが提供するExtensionを追加出来るようになりました。Extensionを提供したり出来るようになりました。このExtension、Appleのアナウンスではホスト・アプリを選んでXcodeで起動させればソースコードレベルでデバッグ出来る事になっているのですが、私がドキュメントをちゃんと読みこなせていないのか、なかなかうまくデバッグする事が出来ません。そこで強引にデバッグする手法です。Extensionが稼働しているプロセスを特定するため、PIDを取得します。viewDidLoadの最初にでも下記のようなコードを埋め込みます。(long)pid);#endif次にXcodeからExtensionを実行します。するとホストアプリをどれにするか聞いてきます。Extensionを起動出来るアプリを選んでやります。次にコンソールのメッセージを見るためにXcodeのWindowメニューからDeviceを選びます。Extensionを起動します。Name..”で先ほどのPIDを指定して目的のプロセスにAttacheします。以上でブレークポイントを掛けてデバッグ出来るようになります。この方法ではExtensionが起動した直後からデバッグを行う事は出来ません。Extensionはホスト・アプリの中で動いているのではなく、別プロセスとして立ち上げられていると言う事です。これによるメリットはホスト・アプリが非常にメモリーを使う物であっても、それに影響されずメモリーなどの資源を使う事が出来ると言う事です。Extensionにバグがあり、強制終了させられた場合でもホスト・アプリの動作には影響が無いのでしょう。2014/06/26Swiftには#defineがありません。下記のように記述する事が出来ません。DEBUG#else#endifまぁSwiftではヘッダファイルという概念が無いのですからしょうがないと言えばしょうがないのですが。付くのですが、Swiftのコンパイルではこれは意味が無いようです。追加すれば解決します(リリース時にはデフォルトで設定しておいてもらいたいですね)。デバッグ時にメッセージを出力して出荷時にはそれを自動的に消すには?Swiftではクラスに属さない「関数」を記述する事も出来るようです。いうようなソースにデバッグ用の関数を定義しておけば、Swiftはヘッダファイルを必要としていないため、自動的に全てのコードの中で参照出来るようになります。#ifdefの中で#defineとしてマクロを組むのとは違って、リリース版にも何もしないLOG()が呼び出されてしまいますが、無いよりは良いですね。2014/06/26CoreFoundationを含めてiOSやOSXのAPIのほとんどはNSObjectのサブクラスとして提供されています。そのため新しい画面をSwiftで追加する場合にはUIViewControllerのサブクラスを作るしかありません。UIViewも同じですね。してもNSObjectとは切っても切れません。言い換えればObjective-Cのクラスとは切り離せません。いえ前回のコラムでも書きましたがSwiftは親クラスを持たないクラスを作成する事が出来ますので、プログラミング言語と実行環境(Framework)が分離出来たと言えると思います。その事はiOSやOSX以外の環境でももしかしたらSwiftが主流の開発言語になる可能性も否定出来ないって事だと思います。Objective-CのクラスをSwiftで使う方法です。標準のFrameworkを使うにはimport文でフレームワークを指定してやれば良いだけです。文を追加してやる必要があります。このファイルはObjective-CのプロジェクトにSwiftのソースを追加してやる時に自動的に作成されます。Objective-CのクラスをSwiftで使うための前準備はこれだけです。インスタンス化しかしSwiftとObjective-Cではクラスのインスタンス化の方法が違うので注意する必要があります。メソッドを呼び出す必要はありません。ObjectiveC-Class()これだけです。これだけでObjective-Cのクラスのallocやinitを自動的に呼び出してくれます。クラスによってはinitメソッドに引数を持たせているものもあります。標準Frameworkではそのようなinitメソッドは下記のようなフォーマットになっています。Objective-CのこのようなinitメソッドをSwiftから呼び出す場合には、withのあとの文字列をパラメータ名としたクラス・メソッドに置き換えてくれます。ObjectiveC-Class(param:parameter)iOSでViewを作るような場合で比較してみます。viewRect)これは自分で作ったクラスがWith〜が付いたinitメソッドを持っていても、自動的に変換されます。出てきたSwiftですので、今はやはり取っ付きにくい部分も多くあります。柔軟な開発言語だと思います。使いこなせるようになれば便利じゃないかと感じています。betaでしか使えません。beta版のXcodeでは製品をAppStoreに上げる事は出来ませんが、古いiOSに対応したアプリも作成できるようですので、是非習得しておきたいと思います。2014/06/26前回はNSObjectから派生したSwiftのクラスをObjective-Cで使うための方法を紹介しました。Swiftは親クラスを持たないクラスを作る事も出来ます。その場合には気をつけなければいけない事があります。@objc(<#name#>)まず、クラスの宣言の前に@objc(<#name#>)を付けて、Objective-Cから<#name#>というクラス名で使用出来るようにしなければなりません。マニュアルによると@objc(<#name#>)はSwiftで宣言したのとは違うクラス名でアクセス出来るようにも出来ると書かれているのですが実際に試してみると上手くいきません。問題はありませんのでクラス名にします。initObjective-Cでクラスを扱う際には全てのクラスはNSObjectのサブクラスになります。従ってインスタンス化する時には以下のようにしていました。init];しかしこのような方法でNSObjectを親クラスに持たないクラスをインスタンス化する事は出来ません。allocとinitはどちらもNSObjectクラスのメソッドだからです。するか?Swiftのクラスにクラス・メソッドを作ってやり、その中でクラスのインスタンスを返してやります。create];}@end次はSwiftの中でObjective-Cのクラスを使う方法を考えてみます。SwiftのクラスをObjective-Cで使ってみる。2014で現れた新しいプログラミング言語のSwift。正直なところ、こんなのが出てくるとは思いませんでした。特徴については様々ところで書かれていますので紹介しません。どんなモンか試していきます。新しいアプリを書くなら全てSwiftで書くという事も可能でしょうが、バージョンアップの場合に全てを一からSwiftで書き直すと言うのはシンドイ話です。徐々にSwiftにシフトしていく事を前提に、新しいSwiftのクラスをObjective-Cで使う事を試してみます。新しくSwiftで書かれたクラスを追加します。Swiftのクラスを作成するにはLanguageをSwiftにしてやるだけで作成されます。最初にSwiftのクラスを作成するとこのようにBridge-Headerを作成して設定を変更するかどうかを聞いてきますので迷わず「Yes」をクリックします。すると”ProductModuleName-Bridging-Header.h”と言うファイルが作成され、プロジェクトに追加されます。Header”に追加されます。これはSwiftの中でObjective-Cのクラスを使用する場合に必要になるもので、今回は説明を省きます。マニュアルにはこのファイルをObjective-Cのコードの先頭で#importしろと書かれているのですが、面倒なのはこのファイルはプロジェクトの中には現れません。ビルドを行わなければ(クリアなどをしても)ファイル自体が存在しないようです(多分)。構わずObjective-Cのコードの先頭に追加してしまいます。”ProductModuleName”は各プロジェクトの名前ですので必要に応じて置き換えてください。この方法で、NSObjectをルートクラスとするようなクラスは使えるようになります。新しくSwiftのクラスを追加したりメソッドやプロパティを追加削除したり、クラスを削除した場合にはXcodeがこのヘッダファイルを自動的に編集してくれるようです。勝手に編集されないようにファイルを見えないようにしているのでしょう。Swiftのクラスを編集するとアップデートするまで若干時間がかかるようで、すぐにObjective-Cの方で新しいメソッドを参照しようとするとエラーが出ますが、ビルドすればすぐに解決するようです。method01];}@endしかしSwiftは親クラスを持たないクラスを作成する事も出来ます。その場合にはちょっと変わってきます。Distributionを行うにはHTTPSを使う必要が出てきました。開発中のアプリケーションを実機でテストする場合にもとても便利な機能なので残念です。XPのIISを手軽に使っていたのですが、私自身IISの深い知識は無いのでどのようにHTTPSを稼働させるのか良くわかりません。そのため、Mervericsに標準でインストールされているapatchでHTTPSサーバを立てる事にしました。スーパーユーザーになり以下の手順で公開鍵などを作成してきます。秘密鍵の作成パスフレーズの入力を求められますが、これは忘れないようにして下さい。その後の処理にも必要になります。Nameは本来はドメイン名を使いますが、ここではDNSで管理していないマシンを使うため、IPアドレスをそのまま指定しています。毎年更新するのも面倒ですので、この例では有効期限を約100年にしました。編集し、HTTPSを有効にします。490行目のコメントを外します。support/private/etc/apache2/extra/httpd-ssl.confを編集し、先ほど作った証明書を読み込むなのどの設定をします。設定が必要なのは以下の項目です。Nameと同じにします。apatchを起動します起動時にはパスフェーズの入力が必要です。証明書をiOSデバイスにインストールiPhone構成ユーティリティを起動します。「構成プロファイル」を選び、ファイルメニューから新規作成します。「資格情報」から先ほど作成したCSRを読み込みます。インストールしたいデバイスを選んでインストールします。以上で設定は完了です。なっていますので、適当なHTMLを置いて、アプリケーションをダルンロード出来るようにします。2013/12/04最近CoreDataを使ったアプリケーションの開発を行っていて「?」と思った事がありました。言う名前のファイルがいつの間にか出来ていました。コマンドで開いても全く更新されていない事があり調べてみました。storeにjournal_modeというのがデフォルトで使われるようになったとの事です。https://developer.apple.com/library/ios/releasenotes/DataManagement/WhatsNew_CoreData_iOS/上記のリンクを開くと書いてありますが、これによりロールバックのジャーなリングにおいて、信頼性とパフォーマンスが向上するそうです。読み込み専用やiOS4以前との互換性のためには推奨されないようです。使わないようにする方法です。追加する際に、optionで指定してやります。同様の方法で指定してやる事が出来るようです。2013/10/27iOS7と同時にリリースされたiPhone5sは64bitのCPUを搭載しています。今までのアプリもそのままで動作し、高速ではあるのですが、やはり64bitのネイティブアプリを試してみたくなります。一つのプロジェクトで構成されていれば簡単に出来てしまいますが、外部のフレームワークやライブラリなどを使っている場合にはそれらが64bit対応していなければなりません。そこでまずOpenCVの64bit対応を試してみました。定量的な測定はまだしていませんが、iPhone5sでは32bit版アプリでもかなり高速ですが、64bitアプリにすると更に高速になっている感じがあります。bitアプリも多く出てくるのではないかと思います。dstroot)112,113行目に以下のように編集し、ターゲットとアーキティクチャを追加する。(HAVE_FLAG_SEARCH_PATHS_FIRST)45行目を以下のように編集し、最適化オプションを変更する。(c)))このままではマクロでエラーになるため下記のように修正する。c)))最後に以下のコマンドでフレームワークを作成します。Machineでバックアップしています。時々エラーが起こり、再度のフル・バックアップからやり直してくれと言ってきます。これまでは諦めて支持通りに新規のフル・バックアップを行っていました。Machineとは別に個別のバックアップは取っています)しかしこのところ頻繁に起こるようになりましたので、何とか修復は出来ないかと試してみました。フル・バックアップが始まるとMacにもかなりの負荷がかかり開発等も効率が悪くなりますので。Errorsの記述通りに行うと修復出来たようです。記述は全て英語なので、簡単に訳してみます。ターミナルを開き以下コマンドでrootになって下さい。-Verificationが既に実行されてsparsebundleがbadにマークされていますので、まずそれをnormalにする必要があります。コマンドラインから以下のコマンドを実行して下さい。of}.sparsebundleこのコマンドは少し時間が掛かります。次に以下のコマンドを実行して下さい。of}.sparsebundle以下のような実行結果が表示されます。外部ディスクのディスクIDです。出力されたものが対象のディスクです。この時点でファイルシステム・チェックのプロセス(fsck)が既に起動されています。下記のコマンドでfsckの実行状況を追跡する事が出来ます。sparsebundleを修復するはずです。このコマンドは数時間かかります.fsckが終了すると以下のどちらかが表示されます。repaired’もし後者の場合にはもう一度ディスク修復のために以下のコマンドをもう一度実行します。/dev/diskxs2もし十分なRAMがある場合には以下のようにRAMキャッスを指定する事で高速かする事が出来ます。/dev/diskxs2上記の例では750MBのRAMを使用します。システム構成により変更して下さい。分からない場合には最初の例を使用してください。環境により置き換えて下さい。1〜2時間かかります。一度下記のコマンドを実行して下さい。/var/log/fsck_hfs.log修復が成功していれば下記のように表示されます。successfully’以下のコマンドを実行して下さい。/dev/diskxs2上記の処理を何度か実行して下さい。ファイルを編集する必要があります。以下の2行を削除します<key>RecoveryBackupDeclinedDate</key><date>{whatever-the-date}</date>(私の環境では上記の行はありませんでした)以下の行を変更します。Machineを復旧する事が出来ました。過去のバックアップも見る事が出来ます。ibtoolをカスタムで起動させる。なっているファイルを外します。追加して以下のように書き込みます。