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

2017年10月11日水曜日

[解決]Xcode 9.0でMac mini上にXcode Serverを立てられなかった

NOTE: English article is available.

-- 追記 2017/12/10 --
"/Library/Developer/XcodeServer"を削除してからためしたところ、エラーなくXcode Serverをセットアップすることができました。
詳細はxcode9 - Xcode 9 enable Server fails because "xcsd" keychain password - Stack Overflowを参照してください。
(Keychain Access.appでxscdを削除する方法はこちらの環境ではうまくいきませんでした)

英語版の記事のコメントで上記URLを教えてくれた名無しさんに感謝します。
-- 追記終了--

CI用に使っていたMacminiにmacOS 10.13とXcode 9.0を入れ、Xcode Serverの設定をしようとしたところ、
xcsreciperunnerは、キーチェーンに含まれるキー"Xcode Server Root Certificate Authority"を使用して署名しようとしています。
という表示が出て、
xcsdというユーザのパスワードを求められました。


管理者用パスワードもXcode 8でCI用に使っていたユーザのパスワードも通らず、
よくわからんので「拒否」を選択しました。
するとユーザがキャンセルした旨を示すエラーが表示されました。




その後、再度Xcode ServerをONにしようとしたところ、
今度はパスワード入力ダイアログは表示されず、

Could not create client certificate authority: Error Domain=Security Code=-25293 "The user name or passphrase you entered is not correct." UserInfo={NSLocalizedDescription=The user name or passphrase you entered is not correct.}

というエラーが即表示されました。




マシンを再起動してからXcode ServerをONにすると再びパスワード入力ダイアログ表示に戻りました。
結局パスワードが分からないので、このマシンでのCIは諦めることにしました。

その後、開発用のMacbookでは特に問題なくXcode Serverを立てることができました。
"xcsreciperunner"や"xcsd"でネットを検索しても、それらしい解決方法は出てきませんでしたので、環境に依存するエラーなのかもしれません。

ちなみに、上記手順を行なった後、Keychain Access.appには
"xcsd"という項目が勝手に追加されていました。


今後、どうしてもMac mini上でCIが必要になった場合は
システムをクリーンインストールし直そうと思います。


2017年10月10日火曜日

自作V3 AudioUnitを10.13のサードパーティ製ホストアプリで認識させる

NOTE: English article is available.

10.13では、従来のように内包アプリを起動するだけではダメそうでした。
自作AUを認識させたい場合、
  1. auval -a で自作AUが認識されないことを確認する
  2. 自作AU内包アプリをビルドする
  3. ログアウトまたはマシンを再起動する
  4. ログインする
  5. auval -aで自作AUが認識されていることを確認する
ログインし直すのがポイントでしょうか。あと、アプリを起動する必要は無いっぽいです。

逆に、自作AUをこれ以上認識させたく無い場合、
  1. auval -a で自作AUが認識されていることを確認する
  2. 自作AU内包アプリを削除する(ゴミ箱からも削除する)
  3. ログアウトまたはマシンを再起動する
  4. ログインする
  5. auval -aで自作AUが認識されないことを確認する
なお同じアプリが複数存在する場合、全て削除する必要がありそうです
例えば、DebugビルドとReleaseビルド、Archiveビルド(?)は
別々のディレクトリ(~/Library/Xcode/DerivedData/...)に生成されるため、
これらを全て削除しなければいけないようです。
(Xcode上でCleanを実行しても別Configurationのビルドは削除されないので注意が必要です)

2017年10月5日木曜日

vecLibが10.13でリンクできなかった

10.13上のXcode 9.0では
cannot link directly with /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/vecLib.tbd for architecture x86_64

と表示されビルドできないケースが有りました。

結局、vecLib.frameworkとvImage.frameworkにリンクしないようにすることで解決しました。
Accelerate.frameworkをプロジェクトに追加してない場合、
追加してリンクするようにした方が良いでしょう。
私のケースでは既にAccelerate.frameworkにリンクしていたので、vecLibとvImageを削除するだけで済みました。

2016年10月12日水曜日

.framework自作時のメモ

今回初めてframeworkを作ったので、その際の注意点をメモっておきます。

App Extensionで利用する際の配慮

AudioUnitやTodayなどのApp Extensionで利用する場合は[ターゲット名]-[General Info]-[Deployment Info]の"Allow app extension API only"にチェックを入れる。
チェックを入れないと、使用しているAPIに関わらず、フレームワーク利用側で
Linking against a dylib which is not safe for use in application extensions:
という警告が出てしまう。

参考: CocoaPods0.36をExtensionで使うときに出る警告を抑制する - yashigani?.days

公開するヘッダ

公開するヘッダは[ターゲット名]-[General]-[Headers]のPublicに入れておく。
と同時に、ターゲット生成時に作られるヘッダ(フレームワーク名.h)に
公開するヘッダを#importで列挙しておく。
publicにしたヘッダで#importしているヘッダもpublicにする必要がある点に注意。

なお、HeadersのPublic, Private, Projectの違いは
Public: The interface is finalized and meant to be used by your product’s clients. A public header is included in the product as readable source code without restriction.
Private: The interface isn’t intended for your clients or it’s in early stages of development. A private header is included in the product, but it’s marked “private”. Thus the symbols are visible to all clients, but clients should understand that they're not supposed to use them.
Project: The interface is for use only by implementation files in the current project. A project header is not included in the target, except in object code. The symbols are not visible to clients at all, only to you.
とのこと。

参考: XCode: Copy Headers: Public vs. Private vs. Project? - Stack Overflow

アーカイブされる場所

ArchiveするとビルドはされるがOrganizerは表示されないし、
どこにビルドされたのかよく分からない。
自分の場合はどうやら
~/Library/Developer/Xcode/DerivedData/[フレームワーク名-ランダム文字列]/Build/Intermediates/ArchiveIntermediates/SYFW/IntermediateBuildFilesPath/UninstalledProducts/macosx/
にフレームワークが生成されているようだったが、
IntermediatesとかUninstalledとか書いてるので
本当にここを参照して良いのかは分からない…。
どの環境変数で参照できるかは後日調べる。

クライアント側で使用する場合

ざっくり

  1. .frameworkファイルをプロジェクトへ追加
  2. フレームワーク埋め込み設定
  3. フレームワーク検索用パスを設定

が必要。

1:  .frameworkファイルをプロジェクトへ追加

通常のソースファイルと同様に.frameworkファイル(ディレクトリ)をプロジェクトへ追加する。

2: フレームワーク埋め込み設定

[ターゲット名]-[Build Phases]にて"+"ボタンを押下する。
"New Copy Files Phase"を選択する。
名前は適当に"Embed Frameworks"辺りにする。
"Destination"を"Frameworks"にする。
下部の"+"ボタンを押下しフレームワークを追加する。

3: フレームワーク検索用パスを設定

[ターゲット名]-[Build Settings]にて"framework search paths"で検索する
(フィルタはAll, Combinedが良さげ)
"Framework Search Paths" にフレームワークを内包するディレクトリを指定する。
(.frameworkそのものを指定してはいけない)


ちなみに、フレームワークを埋め込まなくても
~/Library/Frameworks, /Library/Frameworks/ /System/Library/Frameworks辺りに
フレームワークがあればリンクしてくれる。


-- 追記 --

古いプロジェクトに組み込む場合、Runpath Search Pathsに@loader_path/../Frameworksを追加する必要があるかもしれません。

参考: Library not loaded エラー?ここを見直そう - Qiita

2016年9月19日月曜日

古いXcodeプロジェクトで@synthesizeが自動で生成されない場合

Xcodeのproject navigator(ウインドウの左のペイン)でプロジェクトファイルを選択し、
file inspector(ウインドウの右のペイン)の[Project Document] - [Project Format]を"Xcode 6.3-compatible"に変更してビルドすると自動で補完してくれるようになりました。
自分の場合、この項目が"Xcode 3.2-compatible"になっていました。
本来は古いプロジェクトなら@synthesizeが書かれているはずなので、
この問題は誰かがその@synthesizeを消した時に起こるものと思われます。

なお、一旦6.3にして補完されることを確認した後でサイド3.2に戻すと、
warningが出なくなっているという不思議。

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を参考にすると良さげ。

UnitTestが未終了扱いになる場合はsleepを入れる

テストが速攻終わるような場合、
HogeTest.octest(Tests) did not finish
みたいなwarningが出て、テストが失敗してるわけではないんだけどグリーン表示でもないので今ひとつスッキリしない状況になることがあります。 Some of my unit tests tests are not finishing in XCode 4.4 - Stack Overflowを参考にすると、

「アプリをロードする前にテストが終わっちまうんだよなHAHAHA」

ということらしいので、

 [NSThread sleepForTimeInterval:1.0];
をteardown辺りに入れておくと良いようです。

「スリープさせると上手く行く」系の不具合の1つなんですかね。

"ERROR: unable to get the receiver data from the DB!"というログはキャッシュをクリアすれば出なくなる

参考: Solve a AFNetworking warning
~/Library/Caches/[bundle identifier] というディレクトリを削除すると出なくなった。
出るようになった原因はよくわからないが、WebViewを使っているのでネットワーク上のデータにアクセスしているせいかも。
ログ吐いてるのがメインスレッド以外のスレッドだった。
定期的にキャッシュを削除すると良いかも

2016年7月15日金曜日

古いbinary形式の.nibをXML形式の.xibに変換する

Xcodeのproject navigator(ウインドウの左のペイン)でnibファイルを選択し、
[File]-[Export...]メニューを選択します。

"File Format"ポップアップメニューで"Interface Builder Cocoa XIB"を選択して書き出します。



XML形式の.xibファイルとして書き出されます。

2016年5月7日土曜日

Today App Extensionを作ってみたかったメモ

App Extension Programming Guide: Creating an App Extensionを参考にToday App Extensionを作ることにした。
しかし、新規プロジェクト作成時のテンプレートにはApp Extensionという項目が無かった。

調査したところ、新規プロジェクト作成時のテンプレートには出てこないが、
新規ターゲット追加時のテンプレートにはApplication Extensionという項目が出てくるのでこちらを利用した。

参考: ios - Extension project templates not appearing in Xcode 6 - Stack Overflow

なお新規作成時のシートダイアログにて、"Enbed in Application"でNoneを選択すると、
ウィジェットシミュレータが起動してもウィジェットが表示されないという不具合が起こった。

とりあえず作成できたので、これでしばらく作ってみるつもり。

2016年5月2日月曜日

Xcode 7.3でビルドしたらHTTP通信できなくなった

Xcode 7.3に乗り換えて既プロジェクトをビルドしたところ、
Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.
という警告が出てHTTP通信できなくなりました。

iOS9でHTTP接続できない場合の対処法 | Nouris Blogによると、回避方法はinfo.plistにNSAppTransportSecurityという名前のディクショナリを追加し、そのディクショナリ内にNSAllowsArbitraryLoadsというキーを作りYESに設定すれば良いようです。
こちらのアプリでは今まで通り通信できることを確認しました。


ATS(App Transport Security)についてはNSAppTransportSecurity辺りでしょうか。

HTTPSを標準に、という狙いはなかなか気が早いですね。

試しにapple.comをhttpsでアクセスしてみたら問題なくアクセスできました。
やりますな〜。

2016年3月22日火曜日

hgリポジトリをgitリポジトリに変換する

hg から git に変換する - uzullaがブログを参考に変換しました。

当サーバ環境はCentOS 6.5 64bit、python 2.6.6、git 1.7.1 です。

打ったコマンドは上記記事ほぼそのままなので割愛しますが、
repo.or.cz/fast-export.gitに入っているhg-fast-export.shというツールを使います。

当方のpythonは2.6.6でしたが、特に問題なく変換できたようです。

コマンド打って使う分にはhgの方がとっつき易かったんですが、
xcode上からコミットしたり比較したりしたかったので
今回gitに変換しました。


まあ変換自体は上手くいったと思います。
ただ、Mac OS X 10.10 (git 1.9.3)にホストさせてMac OS X 10.11 (git 2.3.8)でcloneすると、
ファイル自身の文字化けはしてないにもかかわらず、
日本語ファイルがuntracked扱いになってしまいました。

現在原因解明中です。
svnでもバージョンの違いでこんな事あった気がするなあ。

2015年10月31日土曜日

アップルデベロッパーサイト(ADC)のツールダウンロードページが分かりにくくなった

xcodeやcommand line toolsなどがダウンロードできるページが消えたと思ったらちゃんとありました。
https://developer.apple.com/downloads/ (要ログイン)

APIリファレンスのページと同様に、どんどん使いにくくなっていきますなあ。

2015年7月6日月曜日

CFBundleDevelopmentRegionをJapaneseに変更してアプリを日本語化する

 2015/07/10追記: どうやらMainMenu.xibはローカライズしておく(対応する言語のxibを用意しておく)必要があるようでした。
Englishの他にBaseを追加することでCFBundleDevelopmentRegionの設定が効き、
各フレームワークで取得・表示する文字列がローカライズされるようです。
 

Xcodeでのターゲット設定にて、Infoタブ内に"Localization native development region"(Raw key/valueではCFBundleDevelopmentRegion)という項目があります。

例えばWebViewのコンテキストメニューを簡単に日本語にしたい場合、
この値を"en"から"ja"または"Japanese"にすると良いようです。
ポップアップから"Japan"を選択しても効果が無いので注意です。

多言語化したい場合は個別にnibが必要になりますが、
1つの言語しか対応させない場合にはこの方法が簡単だと思われます。

なお、CFBundleDevelopmentRegionについてはCore Foundation Keysを参照してください。

2015年5月7日木曜日

Xcodeの"Run Script"でCoffeeScriptをビルドさせようとした際のメモ

最終的なシェルスクリプトは以下の通り。

PATH=$PATH:/usr/local/bin:/Users/$USER/node_modules/coffee-script/bin

if type coffee; then
    coffee -bc -o $SCRIPT_OUTPUT_FILE_0 $SCRIPT_INPUT_FILE_0
else
    exit 1
fi
なお、node.jsとcoffeeはHomeBrewでインストールして使用しています。
"Run Script"設定の"Input Files"は"$(SRCROOT)/Resources/CoffeeScript/coffee.coffee"
"Output Files"は"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"で
ビルドしたアプリケーションバンドルのリソースディレクトリにcoffee.jsを埋め込めることを確認しました。

しかし、syntax highlightingが使えないのでXcode上でCoffeeScriptコードを書きにくい事や、
生成した.jsファイルをプロジェクトやバージョン管理に含める方針にしたため、
上記シェルスクリプトは使わず、vimで編集してその都度.jsにコンパイルする事にしました。

Xcodeの"Build Phases" - "Run Script"内で動的に生成したファイルをアプリケーションバンドル内に埋め込む


cp /tmp/foo.txt ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
という指定方法で動的生成したファイルをコピーできる模様。

なお、[[NSBundle mainBundle] resourcePath] に相当するものは
${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}

と書けるようなので、リソースファイルを埋め込む場合はこちらが楽かもしれません。

Xcodeの"Build Phases" - "Run Script"の入出力ファイル(input files/output files)

スクリプト内でinput files/output filesを参照したい場合、
input filesは上から順に$SCRIPT_INPUT_FILE_0, $SCRIPT_INPUT_FILE_1...、
output filesは同様に$SCRIPT_OUTPUT_FILE_0, $SCRIPT_OUTPUT_FILE_1...
で参照可能です。(参照先は失念しましたorz)