ラベル 変なメッセージ の投稿を表示しています。 すべての投稿を表示
ラベル 変なメッセージ の投稿を表示しています。 すべての投稿を表示

2019年11月27日水曜日

Xcodeアップデート時のトラブル(ファイルが消えない)

Xcode11.0がリリースされた時だったと思うんだけど、Xcode10.xからの自動アップデートが途中で止まってしまう現象に悩まされた。
Xcode10.xを削除してから新規で11.0をインストールするといいと聞き、ゴミ箱を空にしようとしたものの、Xcodeが使用中だから空にできないとつれないお返事。

Xcodeのパッケージを開き、中のファイルを少しずつ消していったところ、かなり深い改葬にあった
GameCenterUIService.app
というアプリが悪さしていることがわかり、これだけを取り出したところ、他のXcodeのファイルは全て空にでき、Xcode11.0は無事インストールできた。

しかし、このファイルだけがどうしても消せない。
このアプリのパッケージを開くと、
ca.lproj
というフォルダの中に
InfoPlist.strings
があるだけ。
中身は
bplist00— _ CFBundleDisplayNameo Servei d UI del Game
  Center
  ! Z
とだけ書かれてる。

ちなみにファイル名をコピーしようとするとなぜか勝手に「InfoPliót.strings」に名前が変わり、「名前を変更しようとしています。」というパスワードを求めるダイアログが出ることがある。これもわけがわからない。

ca.projフォルダからInfoPlist.stringsを取り出して捨てようとしても、
いくつかの必要な項目が見つからなかったため、操作を完了できません。
(エラーコード-43)
と出てゴミ箱にすら入れられない。
別のフォルダに移動させようとするとコピーされる。(コピーされたものは捨てられる)

macOS 10.15 Catalinaをセーフブートして試してもダメ。
今のところゴミ箱が空にできないだけでさしたる問題はないが、解消されてもいない。

結局クリーンインストールで解決

このためにやったわけじゃないんだけど、システムがかなり不安定だったんでクリーンインストールしたら、さすがにゴミ箱を空にできた。
お疲れ様でした。ちゃんちゃん。

2019年6月26日水曜日

デバイスがロックされてると出て実機確認できない

Xcode cannot launch アプリ名 on 〇〇のPhone because the device is locked.

Xcode9になったあたりから、上記のようなメッセージが表示されて実機確認できないことが増えた。
iOSの設定 / 一般 / リセット / 位置情報とプライバシーをリセット してやり、デバイスを繋ぎ直すと治る。
しかし、MacのiTunesが起動して「このコンピュータを信頼しますか?」みたいなやり取りをすることになるし、その後もリセットされた内容についてアプリごとにいちいち「フォトライブラリにアクセスしようとしています。許可しますか?」「位置情報を利用しようとしています。許可しますか?」と再回答しなければならず、面倒くさい。

他のやり方として、Xcodeの Window / Devices and Simulators でConnectedにあるデバイスを右クリックし、Unpair Deviceし、再度つなぎ直すと、デバイスの方で「信頼しますか?」メッセージとかは出るけど、Macの方はこれ以上作業が必要ないので少し便利。

根本的な原因はXcodeのバグだろうから、アップルが治してくれないとどうしようもない。

2018年12月3日月曜日

変なエラー/Unknown selected data source for Port スピーカー (type: Speaker)

[avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port スピーカー (type: Speaker)

「スピーカーに対して、不明のデータソースが選ばれた」ってことか。

iOS12、Swift4.2、Xcode10になってから、上記のメッセージがずらずらと出るようになった。何も操作してないのに0.何秒かおきに次々と出る、もしくは数回出て止まったり。
ただWarningみたいなもので、実行上問題は出ていない。

音を鳴らすアプリではあるのだが、まだ音に関しての操作もコードもないViewControllerを実行中に出るので、コードの変更があったというよりはXcodeの設定を変更しなけりゃいけないのかもしれない。

ネットで調べると、Swift4.2でAVAudioSessionの関係で変更があり、try文を記述してどうのこうのと書いてあるが、音の操作関係のコードがないところでいっぱい出てるので、直しようがない。そもそもAVAudioSessionのコード書いてないし。

データソースが不明ということで音源ファイルが原因っぽいが、使ってるのはそれぞれmp3、m4r、m4aのフォーマットの音源なのだが、Xcodeの設定をどこかでいじらねばいけないのか?

原因はAdMob

広告にGoogleのAdMobを表示させてるんだけど、それが悪さしていたようで、AdMob表示させないようにしたらメッセージが出なくなった。

Google Mobile Ads SDK Developers掲示板でもその件が話されている。いつの投稿か日付がわかんないんだけど、最新の日付が2018/9/18頃らしいので、まあその少し前くらいだろう。
AdMob内でAVAudioSessionを使用してて、それの改修が遅れてるんだろう。
ちなみに現時点で最新のAdMobSDK 7.36.0(2018/9/10リリースらしい)にしてみたけどダメだった。
うざいメッセージだけど、実用上問題ないし、俺が悪いわけじゃないからいいや。さっさと直してほしいけどね。

Googleって高い給料もらってるすごいエンジニアばかりだと思うんだけど、こういうのを直すのがすごい遅い。直されないことも多いし。変な入社試験で人を選んでるせいでエンジニアが足りないの?

2018年8月11日土曜日

Found an unexpected Mach-O header code: 0x72613c21

問題

Xcode9の画面。
以前のバージョンでも出てた模様。
正常に動いていたアプリをAppStoreに提出すべくArchiveをし、Validate...しようとしたら
Found an unexpected Mach-O header code: 0x72613c21
という妙ちきりんなメッセージが出てニッチもサッチも行かなくなった。

意味は

訳すと「予期しない Mach-O ヘッダーのコードを発見した」である。
Mach-O(マーク・オー)はmacOSの前身であるNESTSTEP由来のコンパイラが生成するオブジェクトファイル/実行ファイルのファイルフォーマットだそうだ。(カーネルの名前がMachだからだな)
さらにMachHeaderはCPUの種類、ファイルの種類などの情報が書かれたヘッダのようだ。
要するに想定外の 0x72613c21 という情報がヘッダに書かれてるということだろう。

メッセージで検索すると 0x72613c21 の部分も含めて全く同じものが出ているようだ。人によって数値が変わるわけじゃないのだな。

どうやらこれはFrameworkをインストールした際の設定などがうまくいってないっぽい。
自分の場合TwitterKitと、画像処理のためのオープンソースライブラリのOpenCVをインストールしているので、それが関係していそう。

対処

Logファイルを見ても、エラーメッセージの後にDVTFilePathがどうのというのがいくつも出ているけど、さっぱりわからなかった。

./Users/YourFile/Library/Developer/Xcode/DerivedData の削除をしてもダメ

XcodeでProductのClean、Clean Build Folder...をしてもダメ。

解決した

TwitterKitの公式サイトに書かれていたインストール方法が、以下のようだった。
  • TwitterKitをEmbedded Binariesに
  • TwitterKitとTwitterCoreをLinked Frameworks and Librariesに
TwitterKitが2つ出てきておかしいとは思いつつ、Embedded 〜 に追加すると自動的にLinked 〜 にも追加されるんで、下の方ではTwitterCoreしか追加してなかったのだが、それが良くなかったようだ。


結果的にEmbedded 〜 の方を削除し、Linked 〜 の方にだけあらためてTwitterKitを追加したところ、無事Validate...が通った。
Embedded 〜 に残しておいても通ったけど、Linked 〜 にTwitterKitが2つ重複して入るため、気持ち悪いから消した。

原因

こちら(stack overflow)の回答を見たところ、以下のような記述があった(英語で)。
Mach-O型のFrameworkが「Static(静的)ライブラリ」である場合、それをEmbed(埋め込み)フレームワークに入れるべきではありません。 Mach-Oタイプが「Dynamic(動的)ライブラリ」の場合は、Embedフレームワークに配置する必要があります。
TwitterKitがStatic LibraryなのかDynamic Libraryなのかよくわからんのだけど、結果的にEmbedded Binaries に入れず、Linked Frameworks 〜 に入れるべきだったのだな。

とにかく解決したようなので助かった。こんなん、ネットがなかったら絶対わからんかったもん。
今後やはりEmbedded 〜 にも入れないといけない不具合が出るかもしれないけど、そしたらまた追記/訂正します。

2018年4月20日金曜日

Outlet、Actionの接続ができない:Could not insert new outlet connection

問題

Outletが接続できなくなるエラーが発生。
Actionもダメみたい。


対処方法

以下のように自分で@IBOutletや@IBActionのコードを入力し、そこに対して接続すれば使える。

@IBOutlet weak var test: UIBarButtonItem!

根本的解決方法はあるのか?

ただし根本的な解決にはなっていないので、以下を試してみた。

プロダクトのClean

⌘+Shift+K

DerivedDataの削除

DerivedDataはプロダクトのビルドフォルダーにある中間ファイルで、 /ユーザ名/Library/Developer/Xcode/DerivedData/ にある。
Xcodeから ⌘+Option+Shift+K でその一部を削除できる。
よりちゃんと削除するにはDerivedDataフォルダ内の該当プロダクトのフォルダもしくは、DerivedDataフォルダごと削除してもいい。
プロダクトをXcodeで開けば再作成されるので問題はない。

Storyboardのリファレンス削除と再登録

Main.storyboardをRemove Referenceだけし、すぐにプロジェクトにドラッグで戻す
こちらのページ参照

接続先のファイルのリファレンス削除と再登録

たとえばViewController.swiftに接続できないなら、それを上記Storyboard同様にRemove Referenceだけしてまた戻す。
念のため、戻す前にXcode終了、DerivedDataを削除、Xcode再起動後にプロダクトcleanなどを行なった。

Xcode関係plistをいじる

/ユーザ名/Library/Preferences/com.apple.dt.Xcode.plist に対し、コマンドラインもしくはXcodeで開いて変更を加える。

その1

こちらのページ参照
plist中の IDEIndexDisable の値が1になってたら0に戻すというもの。
ユーザ名/Library/Cashces/com.apple.dt.Xcode と、 ユーザ名/Library/Saved Application State/com.apple.dt.Xcode.savedState の2ファイルをゴミ箱に捨てて「ゴミ箱を空にして」からじゃないと、値が元に戻ってしまいうまくいかなかったようだ。

その2

こちらのページ参照
その1に近いが、 com.apple.dt.Xcode を削除し、plistのDisable値を削除、Enable値を1に設定しているようだ。

ターミナルで以下3つを実行する。
rm -rf ~/Library/Caches/com.apple.dt.Xcode
defaults delete com.apple.dt.Xcode IDEIndexDisable  
defaults write com.apple.dt.Xcode IDEIndexEnable 1

しかしcom.apple.dt.Xcodeを削除した段階でIDEIndexDisableがすでにないらしく、
Domain (com.apple.dt.Xcode) not found.
Defaults have not been changed.
などと出たので、2番目はいらないのかも?

Target MembershipのチェックOFF/ON


ユーティリティエリアにあるTarget Membershipにアプリ名のところに✔が入ってるが、これをOFF → ONしてみる。
再度Index処理が開始される。

Xcodeの再インストール

Xcodeを削除し、AppStoreから再インストールしてみた。

XcodeとMacの再起動

そのまんま。

しかし、いずれをやってもダメだった。
人によってうまくいく場合、いかない場合があるようだ。
他のプロジェクトでは問題ないようなので、プロジェクトファイルのどこかが壊れちゃったんだろうね。

このままじゃ不便なので、今後も継続して調べる。わかったら追記する。

2018年2月23日金曜日

変なメッセージ/Month 13 is out of bounds

2017年12月以降にmacOS HighSierraで開発してると、Month 13 is out of boundsってよく出るんだって。
うちでも出たわ。

要するに「13月は範囲外じゃ」ってメッセージなんだけど、べつにDateの関係とかいじってない。
CoreFoundation内のバグらしいって。
でもメッセージ出る以外にうちでは悪さしてないようなんで、そのまま様子見。
てか、さっさとバグなおせよな、Apple。

2017年11月8日水曜日

変なメッセージ: You are currently using version x.xx.x of the SDK.

AdMobを使ってると、時々以下のメッセージがコンソールに出る。
これはSDKが最新版じゃないからアップデートしてちょということなので、そうすればいい。
ただ、書いてあるアドレスはリリースノートなので、実際のダウンロードは
https://developers.google.com/admob/ios/download
から。
まあ書いてあるアドレスのページからも行けるけど。

<Google:HTML> You are currently using version 7.24.1 of the SDK. Please consider updating your SDK to the most recent SDK version to get the latest features and bug fixes. The latest SDK can be downloaded from https://goo.gl/UoiJ8F. A full list of release notes is available at https://developers.google.com/admob/ios/rel-notes.

変なメッセージ:[BoringSSL] Function boringssl_context_get_peer_sct_list: line 1754 received sct extension length is less than sct data length

アプリ作ってたら、エラーもWarningもなく正常に動くのに、以下のようなメッセージが出てる。

[BoringSSL] Function boringssl_context_get_peer_sct_list: line 1754 received sct extension length is less than sct data length

【直訳】
[BoringSSL] 関数boringssl_context_get_peer_sct_list:1754行が受信したsctエクステンションの長さがsctのデータ長より短い

わかんねーよ!
BoringSSLは、オープンソースで開発されているセキュリティ通信プロトコル(SSL)である、OpenSSLのセキュリティや不具合を改善するためにGoogleが出した派生版で、その関係のメッセージ。
Googleの広告システムAdMobを入れとくと出るらしく、特に問題が起きてなければ無視しちゃっていいようだ。

2017年9月25日月曜日

Xcode 9でArchive時に変なチェックが

Xcode9でアプリを審査提出すべくArchiveしていたら、これまでと手続きが少し変わり、ValidateおよびUploadの段階でこのような同じメッセージが出たので覚書。

App Store distribution options

Include bitcode for iOS content
Allows the App Store to build your app to take advantage of hardware, software or compiler changes.
iOSコンテンツのビットコードを含める
App Storeがあなたのアプリケーションを構築して、ハードウェア、ソフトウェア、またはコンパイラの変更を利用できるようにします。
Upload your app's symbols to receive symbolicated reports from Apple
Crash logs and other diagnostic information from your customers will be symbolicated and viewable within Xcode.
Appleのシンボル化されたレポートを受け取るために、あなたのアプリのシンボルをアップロードしてください。
お客様のクラッシュログやその他の診断情報は、Xcode内で象徴的に表示されます。
最初のチェックのビットコードとは、アプリをコンパイルする時に、最終的に近藤マシン語臣に変換する前段階で、中間コードのようなものに変換するんだそうな。それのことのようで、含めておくといいことあるなんて読んだ。
なんのこっちゃよくわからんけどね。
最初bitcoinって書いてあるのかと思って、驚いた(笑)

次のチェックはおそらくクラッシュ情報なんかをアップルに送信していいかどうかだろう。今までは勝手に送信されてたんじゃないかって思うけど、コンプライアンス上明示し、選択できるようにしたんじゃないかと。

両方ともチェックされたままでいいと思う。

Re-sign "App name"

"App name" needs to be re-signed for App Store distribution.
Select one of the following signing options to continue.
あなたのAppは、App Storeの配布のために再署名する必要があります。
続行するには、次の署名オプションのいずれかを選択します。
App Storeで配布するための署名を自動で管理するか手動でするかの選択。これも上の自動のままでいいだろう。

Distoribution completed with warnings

その後のいつもの手順でUploadは終わったみたいなんだけど、また変なメッセージが出た。
iTunes Storeのオペレーションに失敗したと。
1024x1024のPNGフォーマットのマーケティングアイコンが含まれてないからApp Reviewかベータ App Reviewに提出できないと。
プロジェクトのImages.xcassetsのアイコンのところに1024ptのアイコンを登録する欄が増えとる…orz
他にもiPhoneとiPadでそれぞれ1x〜3xの20ptのアイコンの欄が…。めんどくせえ。
ScreenShot同様に、アイコンもでっかいの一個アップロードして、小さいのはそれを縮小して対応するようにできないのかね? 21世紀なのに…グチグチ…。

アイコン追加してアップロードし直して無事審査提出できたわい。
そのかわりiOS11やiPhone Xへの対応なんかが超テキトーだから、リジェクトされるかもね?(笑)
そんなもんにいちいち対応してられるか! 毎度毎度仕様を変えやがって!

2017年8月9日水曜日

変なメッセージ/dyld: Library not loaded:

昨日、Macの不調からかキーチェンアクセス中のiOS Develop証明書が消えてしまったらしく、頑張って再作成した。

その後、ちゃんと動作することを確認したプロジェクトが、今日になって以下のメッセージを出して落ちるようになった。

dyld: Library not loaded: @rpath/libswiftAVFoundation.dylib

ほんとはもっと長く続いてるんだけど、要するにライブラリがロードできないらしい。
ネットで調べてプロジェクトの設定をいじってみたけど直らない。一つだけじゃなく、他のいくつかのプロジェクトが同じ状態。

結局、プロジェクトをCleanしたらどうかという情報があったのでしてみたら、あっさり直ってくれた。

昨日証明書が消えた状態で起動して状態を見ていたプロジェクトだったから、そのせいだろうか。証明書再発行後にはちゃんと動くことを確認したんだけどな。
解せねえ…。

2016年12月3日土曜日

LandscapeでimagePickerがうまく表示されない

PortraitとLandscapeの両方に対応したアプリ作ってる。
写真ライブラリから選ぶためのUIImagePickerControllerが、公式にはPortrait表示にしか対応していないらしく、Landscapeで表示しようとすると強制的にPortrait表示になってしまう。(iPhoneだけ。iPadではうまくいく)
また、プロジェクトの設定でLandscape以外許可しない状態で表示しようとすると、クラッシュしてしまう。
こういうアプリで
こうしたいのに

こうなっちゃう!?
今まで気にしたことなんかなかったけど、LandscapeのimagePickerって普通になかったっけ? iPadだけでiPhone持ってないから知らなかっただけ?

UIImagePickerControllerのAPIリファレンスには以下のように書かれている。

Important
The UIImagePickerController class supports portrait mode only. This class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified, with one exception. You can assign a custom view to the cameraOverlayView property and use that view to present additional information or manage the interactions between the camera interface and your code.

和訳(by おいら)
重要

UIImagePickerControllerクラスは、縦画面モードだけをサポートします。 このクラスは現状のままで使われることを目的として、サブクラスとすることをサポートしません。 このクラスのためのビューの階層はprivateで、例外的に修正されてはいけません。 あなたはカスタムビューをcameraOverlayViewのプロパティに割り当てることができて、追加情報を提示するか、カメラインターフェースとコードの間の相互作用を管理するために、そのビューを使うことができます。


どうやらUIImagePickerControllerをサブクラスにしたカスタムクラスを作ることも禁止されているらしい。禁を破って作ると、リジェクトされるという噂もあるらしい。
でもネット情報だとカスタムクラス作ったり、overrideして実現しちゃってるみたい。

ViewController.swift あたりのclassの外に以下を書いておけばいい。
extensionは既存クラスを書き換えたり、繼承なしで機能を拡張するためのもの。

extension UIImagePickerController
{
    override open var supportedInterfaceOrientations:UIInterfaceOrientationMask {
        return .all
    }
}


ちなみにSwift2.xでは以下の書き方だった。
extension UIImagePickerController
{
    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return .All
    }
}

Swift3.0からsupportedInterfaceOrientationsの定義が変更になったらしく、override open var〜で書かないと
method does not override any method from its superclass
なんてエラーが出ちゃう。
関数だったものが変数になったのね? なんだかよくわかんないけど。

無事に表示できたけど、このことが理由でリジェクトされないといいけどな。まあ海外のデベロッパー含めてやってるみたいだから大丈夫なのでは?
そもそもなんでLandscape表示もできるのに、Portrait表示しか対応してないって言ってるんだろうね?

参考

2016年9月26日月曜日

UIImagePickerControllerは自分で閉じる

フォトライブラリから画像を取得するコードをSwift 3.0で書いてるんだけど、うまくいかなかった。

Delegateの設定

if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
     let imagePicker = UIImagePickerController()
     imagePicker.delegate = self
     imagePicker.sourceType = .photoLibrary
     present(imagePicker, animated: true, completion: nil) //イメージピッカー表示
} else {
     print("フォトライブラリが使えません")
}

上記で
imagePicker.delegate = self
と宣言するために、頭のところでUIImagePickerControllerDelegateと設定するだけじゃダメで、以下のようにUINavigationControllerDelegateも設定してやらないとエラーが出てしまう。

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { ~ }

UIImagePickerControllerのviewは自分で閉じよう

イメージピッカーで画像を選択したら、以下のdelegateメソッドが呼ばれるわけだが、
[Generic] Creating an image format with an unknown type is an error
というメッセージが出るばかりでイメージピッカーが閉じて画像をimageViewに表示してくれない。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage?
    imageView.image = image
}

と思ったら、
picker.dismiss(animated: true, completion: nil)
ってやって自分でイメージピッカーを閉じてやらにゃいかんのね。
今までObjective-Cでやってた時は自分で閉じてくれてたのに。
なんだろ、複数選択とかに対応したとかかね?
なおピッカーが閉じたところ、隠れてたimageViewには選択した画像がちゃんと表示されてた。
それでも[Generic] Creating an image format with an unknown type is an errorのメッセージは出るんだけど、これはXcode8になってから余計なメッセージが出る現象の一つかもしれないので、実用上問題なければ無視すればいいと思う。

2016年9月19日月曜日

変なメッセージ:Xcode8でまだ出るまだ出る…

余計なメッセージを出さないような設定にしても出ちゃうメッセージを載せてく。

Painter Z index: (でかい数値) is too large (max 255)

iOS10シミューレタ、iOS9シミュレータ、XcodeからビルドしたiPad実機で確認
Painter Z index: 4294967169 is too large (max 255)Painter Z index: 4294967199 is too large (max 255)Painter Z index: 4294967170 is too large (max 255)Painter Z index: 4294967170 is too large (max 255)Painter Z index: 4294967169 is too large (max 255)Painter Z index: 4294967169 is too large (max 255)Painter Z index: 4294967170 is too large (max 255)Painter Z index: 4294967199 is too large (max 255)Painter Z index: 4294967199 is too large (max 255)Painter Z index: 4294967170 is too large (max 255)
MKMapViewを表示してると出る。
特にPinを刺し、ある一定以上地図をズームしてる時に、以下のようにずらずらと出る。
Paintっていうからには画面描画の塗りのことかね?
んで、Z indexっていうんだから、X軸、Y軸じゃなくてZ軸の値で。
つまりは地図を表示する過程で妙な値をMKMapViewに渡してしまい、MKMapView側が「デカすぎんぞ!」って警告してるんだと思う。
つまりは俺は悪くない! 悪いのはきっとXcode!

きっとXcode8のバグの一種で、普段なら問題なく、表示されないような些細なメッセージが出ちゃってるんだろう。
追々出ないようになるんじゃないスか?

warning: section "__textcoal_nt" is deprecated

warning: section "__const_coal" is deprecated

それまで出なかったのに、審査に出そうと思ってアーカイブしたら出たWarning。
以下のようなメッセージがいっぱい出てる。
warning: section "__textcoal_nt" is deprecated
        .section __TEXT, __textcoal_nt, coalesced, pure_instructions
                 ^      ~~~~~~~~~~~~~~
note: change section name to "__text"
        .section __TEXT, __textcoal_nt, coalesced, pure_instructions
                 ^      ~~~~~~~~~~~~~~
warning: section "__const_coal" is deprecated
        .section __TEXT, __const_coal, coalesced
                 ^      ~~~~~~~~~~~~~
note: change section name to "__const"
        .section __TEXT, __const_coal, coalesced
                 ^      ~~~~~~~~~~~~~
deprecatedってことは、バージョンが上がって非推奨のやり方になったよってことだけど、どこの何が非推奨なのかてんでわかんないっス。
まあWarningだから無視しとく。(^◇^)ハハハハ。

プライバシー設定をplistにしとかないと落ちる

シミュレータで落ちる!

iOS10、Xcode8になってから、プライバシーに関する機能を使う際に、Info.plistにあらかじめ宣言(みたいなこと)しとかないと、シミュレータで落ちてしまうようになった。

たとえばフォトライブラリにアクセスするようなAPIを使ったら、こんなん出て落ちた。
[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.
アプリがクラッシュしたのは、プライバシーに敏感なデータにアクセスしようとしたためです。アプリのInfo.plistは、ユーザーにアプリがどのようにこのデータを使うかについて説明している文字列値で、NSPhotoLibraryUsageDescriptionキーを含まなければなりません。
だそうです。

 落ちないようにしましょう

アプリ名-Info.plistにPrivacy - から始まる項目を追加する(探すとメニューで出てくる)。
そこに、フォトライブラリにアクセスする際に表示させるAlertのメッセージを書き込んでおしまい。

そうすると最初のアクセス時に以下のように出て、無事クラッシュせずにアクセスできるようになった。
かあんたん(≧∇≦)
でも、もともとフォトライブラリにアクセスするような場合って、iOS側が確認のアラートを表示してくれてたよね。
メッセージ部分を入力しなければ、デフォルトでいつものメッセージを表示してくれるんだけど、メッセージがないと審査の段階で自動的にアップロードしたビルドが拒否されちゃう。
一応英語で書いたけど、他言語対応はどうやるのかね?
しかしめんどくさくなったねぇ。

Info.plistに設定が必要になったらしい機能の一覧はこちらのサイト。

Info.plistの候補からまとめてみた(iOS10、Xcode8時点)
  • Privacy - Bluetooth Peripheral Usage Description
    • Bluetoothを使うとき
  • Privacy - Calendars Usage Description
    • カレンダーにアクセスするとき
  • Privacy - Camera Usage Description
    • カメラを使うとき
  • Privacy - Contacts Usage Description
    • 住所録を使うとき
  • Privacy - Health Share Usage Description
    • ヘルスの機能を使うとき
  • Privacy - Health Update Usage Description
    • ヘルスのアップデートを使うとき
  • Privacy - HomeKit Usage Description
    • ホームキットを使うとき
  • Privacy - Location Always Usage Description
    • 位置情報をアプリ裏でも常に使うとき
  • Privacy - Location Usage Description
    • 位置情報を使うとき
  • Privacy - Location When In Use Usage Description
    • 場所に着いた時点(?)の位置情報を使うとき
  • Privacy - Media Library Usage Description
    • メディアライブラリを使うとき
  • Privacy - Microphone Usage Description
    • マイクを使うとき
  • Privacy - Motion Usage Description
    • モーション機能を使うとき
  • Privacy - Music Usage Description
    • ミュージックにアクセスするとき
  • Privacy - Photo Library Usage Description
    • 画像ライブラリにアクセスするとき
  • Privacy - Reminders Usage Description
    • リマインダーにアクセスするとき
  • Privacy - Siri Usage Description
    • Siriを使うとき
  • Privacy - Speech Recognition Usage Description
    • 音声認識機能を使うとき
  • Privacy - TV Provider Usage Description
    • TVプロバイダ機能(そんなのあるの?)を使うとき
  • Privacy - Video Subscriber Account Usage Description
    • ビデオ購読機能を使うとき

2016年9月18日日曜日

変なメッセージ:Xcode8、iOS10でいっぱい出た

iOS10、Xcode8にしたところ、特にシミュレータを使った時に、これまで出なかったわけのわかんないメッセージが100行以上もずらずら出てしまった。

こんなのや⇩
2016-09-19 00:34:50.662934 SkyReporter[2273:1024925] [DYMTLInitPlatform] platform initialization successful2016-09-19 00:34:50.830564 SkyReporter[2273:1024768] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles2016-09-19 00:34:50.831165 SkyReporter[2273:1024768] [MC] Reading from public effective user settings.
2016-09-19 00:35:12.281089 SkyReporter[2273:1024768] Metal GPU Frame Capture Enabled2016-09-19 00:35:12.281607 SkyReporter[2273:1024768] Metal API Validation Enabled2016-09-19 00:35:12.355170 SkyReporter[2273:1024966] [LogMessageLogging] 6.1 <private> 

こんなの⇩
objc[1207]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices (0x120acb910) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices (0x1208f5210). One of the two will be used. Which one is undefined.2016-09-18 18:12:50.341636 SkyReporter[1207:83865] bundleid: com.galakuta09.SkyReporter, enable_level: 0, persist_level: 0, propagate_with_activity: 02016-09-18 18:12:50.372739 SkyReporter[1207:83865] subsystem: com.apple.siri, category: Intents, enable_level: 1, persist_level: 1, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
デバッグ用のNSLogとかが埋もれてしまって非常に困る。

メッセージが出る理由

どうやらXcode8の設定が変なために、普段は表示されない各種情報が表示されているようだ。
これを設定すればよし
XcodeのProduct / Scheme / Edit Scheme...メニュー(⌘+<)の、左側のカラムがRun、上の選択肢がArguments、で表示されるEnvironment Variablesに、
Nameを「OS_ACTIVITY_MODE」、Valueを「disable」に設定してやることでほとんど出なくなってくれる。ありがたい。

このありがたい情報はこちらのサイトから。ありがたやありがたや。

でも、今度は逆に実機確認時にNSLogとかの表示が全く出てくれなくなった。
⌘+<ですぐに表示できる設定だから、Xcode8が直ってくれるまでは切り替えて使うしかないか…。アップルのバカ!

2016年9月15日木曜日

変なメッセージでた:Assigning to 'AppDelegate *__strong' from incompatible type 'id _Nullable'

iOS10リリースに伴い、Xcode8にしたら、

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

って書いたところに以下のWarningが出たよ。

Assigning to 'AppDelegate *__strong' from incompatible type 'id<UIApplicationDelegate> _Nullable'

互換性のないタイプの'id<UIApplicationDelegate> _Nullable'から'AppDelegate *__strong'にアサイン(割り当て)しようとしている
ってことだな。

クラス間で使うグローバル変数みたいなものをAppDelegateクラスに作っといて、それにアクセスするためのおまじないで、iOS9までは問題なかったんだけど。

appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

どうやら型のチェックを厳密にするようになったためらしく、上記のようにキャストしてやったらWarning消えただよ。めでたしめでたし。

iOS10とXcode8でプロビジョニングファイルを求められた

iOS10リリースに伴い、Xcode8をインストールしたら、実機確認で
アプリ名 requires a provisioning profile. Select a provisioning profile for the "Debug" build configuration in the project editor.
Code signing is required for product type 'Application' in SDK 'iOS 10.0'

って2つのエラーが出て起動しなかったよ。
要はiOS10.0に合ったプロビジョニングファイルを使えってことだと思う。

ざっとネットで調べたところ、General、TARGETS、アプリ名のSigningってところにエラーマークが出てた。


Automatically manage signingにチェックを入れて、Enable Automaticボタン押したら二つともエラーが消えてくれた。
アプリが2年以上前の製作だったので、もう切れた古いプロビジョニングファイルに結びついてたのかしら。
Xcode7では問題なく動いてたんだけどな?
んで、手動で管理すべきところを自動にしたということで。

なんにせよ新OS、新Xcodeリリース時は何かと面倒くさい。
リリース直前だったアプリもXcode8でいろいろ誤動作してるし(ノД`)

2016年9月5日月曜日

変なメッセージ:This application is modifying the autolayout engine〜

 OpenWeatherMapを使って気象情報をもらう処理が時間がかかることがあるので、
 [NSThread detachNewThreadSelector:@selector(getCurrentWeatherData) toTarget:self withObject:nil];
というように別スレッドで処理するようにしていた。
iOS7、8の頃は良かったが、9になったら以下のメッセージとともにずらずらとオブジェクトの中身みたいなメッセージが表示されるようになった。
This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes.  This will cause an exception in a future release.
バックグラウンドのスレッドでオートレイアウトをいじってると、将来痛い目にあうぞという意味だと思う。
気象情報をラベルなんかに入れる時に、オートレイアウトの設定で文字数に応じてサイズを変更してくれたりするようなので、その関連だろう。

以下のようにdispatch_async()で処理してやったらエラー出なくなった。

Objective-Cのコード
dispatch_async(dispatch_get_main_queue(), ^{
        ここにコードを書く
    });

そもそも、別スレッドの並列処理にしなくても大丈夫そうなので、普通にgetCurrentWeatherDataメソッド呼ぶようにしちゃったけどねw

2016年7月1日金曜日

All interface orientations must be supported〜とか出る

以前リリースしたアプリをアップデートしようとしたら、以下の2つのWarningが出てしまった。

warning: All interface orientations must be supported unless the app requires full screen.
warning: A launch storyboard or xib must be provided unless the app requires full screen.

ネット翻訳したら、
アプリがフルスクリーンを必要としない限り、すべてのインターフェースの向きがサポートされなければなりません。
アプリがフルスクリーンを必要としない限り、ラウンチストーリーボードまたはxibは提供されなければなりません。

だそうだ。よくわからん。
どうも、iOS9になってSplitViewとかいろいろ対応したせいで、原則的にすべての向き(ポートレート、ランドスケープ)の画面をサポートしなければいけないらしい。
しかしあくまでもフルスクリーンを必要としない限り。
というわけで、TARGETSのところのRequires full screenをチェックして再ビルドしたら消えてくれたよ。
めんどくせぇな。