iOS

...now browsing by category

 

Frameworkのテストコードで”Library not loaded: @rpath/libswiftCoreAudio.dylib”

木曜日, 8月 27th, 2015

iOSでFrameworkのテストコードを書いたのですが、テストを実行しようとすると、ビルドは成功するのですが、テスト実行時に以下のエラーが出てテストが行われませんでした。

2015-08-27 08:35:04.489 xctest[1176:62057] The test bundle at /Users/who/Library/Developer/Xcode/DerivedData/XxxFramework-gpqmrnxhtltpenbdidiiwacuonzd/Build/Products/Debug-iphonesimulator/xxxTests.xctest could not be loaded because an unanticipated error occurred.
2015-08-27 08:35:04.490 xctest[1176:62057] Detailed error information: Error Domain=NSCocoaErrorDomain Code=3587 “The bundle “xxxTests” couldn’t be loaded because it is damaged or missing necessary resources.” (dlopen_preflight(/Users/who/Library/Developer/Xcode/DerivedData/XxxFramework-gpqmrnxhtltpenbdidiiwacuonzd/Build/Products/Debug-iphonesimulator/xxxTests.xctest/xxxTests): Library not loaded: @rpath/libswiftCoreAudio.dylib
Referenced from: /Users/who/Library/Developer/Xcode/DerivedData/XxxFramework-gpqmrnxhtltpenbdidiiwacuonzd/Build/Products/Debug-iphonesimulator/xxx.framework/xxx
Reason: image not found) UserInfo=0x7f9a39422c50 {NSLocalizedFailureReason=The bundle is damaged or missing necessary resources., NSLocalizedRecoverySuggestion=Try reinstalling the bundle., NSFilePath=/Users/who/Library/Developer/Xcode/DerivedData/XxxxFramework-gpqmrnxhtltpenbdidiiwacuonzd/Build/Products/Debug-iphonesimulator/xxxTests.xctest/xxxTests, NSDebugDescription=dlopen_preflight(/Users/who/Library/Developer/Xcode/DerivedData/XxxxFramework-gpqmrnxhtltpenbdidiiwacuonzd/Build/Products/Debug-iphonesimulator/xxxTests.xctest/xxxTests): Library not loaded: @rpath/libswiftCoreAudio.dylib
Referenced from: /Users/who/Library/Developer/Xcode/DerivedData/XxxxFramework-gpqmrnxhtltpenbdidiiwacuonzd/Build/Products/Debug-iphonesimulator/xxx.framework/xxx
Reason: image not found, NSBundlePath=/Users/who/Library/Developer/Xcode/DerivedData/XxxxFramework-gpqmrnxhtltpenbdidiiwacuonzd/Build/Products/Debug-iphonesimulator/xxxTests.xctest, NSLocalizedDescription=The bundle “xxxTests” couldn’t be loaded because it is damaged or missing necessary resources.}

*** Test session exited(1) without checking in. If you believe this error represents a bug, please attach the log file at /var/folders/nt/x60j01ps3r3dds9ldvppd5xm0000gn/T/com.apple.dt.XCTest-status/Session-2015-08-27_08:35:01-Z4Gt8p.log

  • framework内でAVFoundationにリンクしています。
  • CoreLocationを使用しています。
  • サンプルアプリに組み込んだframeworkは正常に動作していました。

cleanしたり、再起動したりしたのですが、改善しませんでした。色々試した結果、以下のBuild Settingsを変更したところ、正常に動くようになりました。

Embedded Content Contains Swift Code = NO -> YES

ですが、これで動くようになった理由がわかりません。
新しくframeworkを作るとデフォルトでNOになっているのは確認しました。

Xcodeプロジェクトの.gitignore

土曜日, 1月 10th, 2015

色々な案があって迷ったけど、一番自分に合っているのをまとめておく。


# Mac
.DS_Store
*.swp
!.gitkeep

# Xcode
build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
*.xcworkspace
!default.xcworkspace
xcuserdata
profile
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate

# VCSのメタデータが含まれ、コミットしてしまうとmergeが困難になるなどの問題が発生する
# http://stackoverflow.com/questions/18340453/should-xccheckout-files-in-xcode5-be-ignored-under-vcs
*.xccheckout

#CocoaPod
Pods/*

ベースはXcodeでiOSアプリ開発をする時の.gitignoreを使わせてもらった。

Podfile.lockは迷ったけど、Xcode&gitで開発する時の.gitignoreのコメント欄にikesyoさんが書いた以下の文を参考にして、gitで管理する事にした。

lockファイルが存在する場合、そこに書かれているバージョンを参照してダウンロード・インストールするので、複数人の間でバージョンを固定できます。

ライブラリのバージョンアップはpod update(新しいバージョンが利用できる場合、lockファイルも更新されます)、新しいバージョンが出ていないか確認したい場合には pod outdatedを使えばいいですね。

【2015/09/17】
*.xccheckoutを追加

AutoLayoutでUIScrollViewのPagingを画面の回転に対応させる

金曜日, 7月 18th, 2014

UIScrollViewでPagingをONに設定している場合、制約のかけかたによっては、画面を回転させてUIScrollViewの大きさが変化すると、Paging時の移動量も変化してしまいます。そのため、中のコンテンツのページの幅が固定されていると、ページの区切り位置が合わなくなってしまいます。

縦画面だと2ページ目の位置が正しいけど・・・

iOSシミュレータのスクリーンショット 2014.07.18 21.32.03

iOSシミュレータのスクリーンショット 2014.07.18 21.32.14

横画面にすると2ページ目の位置がずれてしまう
iOSシミュレータのスクリーンショット 2014.07.18 21.46.15

iOSシミュレータのスクリーンショット 2014.07.18 21.46.22

この場合の解決方法としては、以下の2通りの方法が考えられます。

  1. 中のコンテンツのページの幅を、UIScrollViewの幅に連動して変化させる。
  2. UIScrollViewの幅を固定する。

今回は中身を変えずに済む2番の方法で考えてみました。

UIScrollViewに対して、幅を固定する制約、Y座標を画面の真ん中に固定する制約を付けます。
スクリーンショット 2014-07-18 21.51.32

スクリーンショット 2014-07-18 21.51.12

横画面にしても2ページ目がちゃんと画面の真ん中に表示されました。
iOSシミュレータのスクリーンショット 2014.07.18 21.32.24

iOSシミュレータのスクリーンショット 2014.07.18 21.32.29

サンプルコードはこちら

MagicalRecord : Attributeの名前とimportする時の名前が違うときの設定

土曜日, 7月 5th, 2014

Core Data ModelでAttributeに付ける名前ですが、NSManagedObjectのメソッドやプロパティと同じ名前は付けることが出来ません。例えばdescriptionやcopyなどですね。でもそれだとWeb APIなどから読み込んだデータをimportする場合に、使えない名前と同じだと困ります。

何かしら方法がないかなと調べた所、Attributeには別の名前を付けておいて、userInfoにimportする時の名前を設定しておく方法を見つけました。設定するのはKeyが”mappedKeyName”で、Valueにimportする時の名前です。例えばAttributeは”catchcopy”、importする名前が”copy”だとすると以下のように設定します。

スクリーンショット 2014-07-05 23.13.07

これを設定しておくと、NSObject+MagicalDataImport.mのMR_lookupKeyForAttribute:で”mappedKeyName”に設定した名前が取得されます(設定されていないとAttributeの名前が取得されます)。

試しに以下のコードで試してみると、

    Entity *entity = [Entity MR_createEntity];
    
    NSDictionary *dict = @{@"copy": @"Hey, Jack!"};
    
    [entity MR_importValuesForKeysWithObject:dict];

無事に取得出来ました。

entry=<Entity: 0x8c5a450> (entity: Entity; id: 0x8c5a480 <x-coredata:///Entity/t3EC7B28C-474E-44E0-9836-F59A4DDDF34E2> ; data: {
    catchcopy = "Hey, Jack!";
})

MagicalRecord : Core Data の Attribute が NSArray の場合の書き方

土曜日, 7月 5th, 2014

AFNetworkingで読み込んだWeb APIデータなどを取り込む処理で、要素が配列だった場合にどうすればいいか調べました。

Core Data ModelでAttributeを設定する時に、Typeを”Transformable”に設定する。この時、Nameは空欄にする。NSArray、NSDictionary、NSString、NSDate、NSNumber、NSDataなどNSCoding Protocolを実装しているものに変換する場合はこのように空欄でOKらしい。

スクリーンショット 2014-07-05 20.51.31

試しに要素をNSArrayにして読み込ませてみます。

    Item *item = [Item MR_createEntity];
    
    NSDictionary *dict = @{@"names": @[
                                   @"aaa",
                                   @"bbb",
                                   @"ccc",
                                   ],
                           };
    
    [item MR_importValuesForKeysWithObject:dict];
    
    NSLog(@"item=%@", item);

ちゃんとNSArryとして取り込まれているようです。

(lldb) po item
<Item: 0x8f23d80> (entity: Item; id: 0x8f23db0 <x-coredata:///Item/tBCCB18AF-3F30-45E8-A59C-B3E77196FB9A2> ; data: {
    names = "(\n    aaa,\n    bbb,\n    ccc\n)";
})

(lldb) po item.names
<__NSArrayI 0x8f20a90>(
aaa,
bbb,
ccc
)


(lldb) po item.names[0]
aaa

(lldb) po item.names[1]
bbb

(lldb) po item.names[2]
ccc

(lldb)