2016年12月24日土曜日

Xcode8.2.1変更点

なんか来てたのでアップデートした。
「Swiftのバージョンで誤ったWarningが表示される問題を解決した」だそうです。

ビルドするとよくわかんないメッセージがいっぱい出てりするのが改善されたんだろうか?

追記:よくわかんないメッセージの量はあんまり変わらないような…?

2016年12月21日水曜日

有料アプリ販売のための登録

今まで無料アプリばかりだったけど、今回AppStoreで有料アプリを売ることにした。
アプリの審査通ったのに「iTunes Connectで契約/税金/口座情報の設定がまだだズラ」てなことが書かれたメールが届いた。

さっそくiTunes Connectにログインし、「契約/税金/口座情報」の入力をする。
参考
アップル公式iTunes Connect デベロッパガイド

Contract Type(契約タイプ)がPaid Application(有料アプリ)になってて、(たしか初めてアプリを申請した時に登録した)自分の名前と住所が表示されてるので、右のRequestボタンを押す。

Review Agreementの画面になるので、書かれた内容を精読し…って、英語で長々と書かれてて読めるかい!
たぶん読み飛ばしても無慈悲なことされないと思うので、I have read and agree to the agreement presented above.(読んで上記に従うよ)にチェックを入れてSubmit。

今度はContract Info、Bank Info、Tax Infoとか書かれてSet Upボタンが並ぶので、Contact InfoのSet Upから入っていく。

Manage Your Contact Informationの画面になるので、下のSenior Managementなど5つ全てをContactにあるメニューから選ぶ。
要はマネジメントのリーダーや財務担当者は誰かを指定するわけだが、個人なら自分の名前を選んでやればいい。
そしてDone。

今度はBank InfoのSet Upなんだけど、以前に無料アプリを審査に出した時に、銀行情報は登録しちゃったのね。全銀コードとか入力したり、いろいろ面倒だった。
んで、今回はCurrent Bank Accountに登録したのが出てきてるし、Select a different Bank Account:に他の口座は出てこないし、同じ口座情報を再登録しようとしてもはじかれるので、Cancelを押して前の画面に戻った。(Saveは内容に変更があった時しか有効にならない)

銀行情報のSet Upボタンが青いままだけど、税金情報に移る。
Tax InfoのSet Upを押す。
アメリカ、オーストラリア、カナダでの税金情報のSet Upボタンがあるけど、アメリカのだけでいいんだってさ。

「アメリカの市民か? アメリカに住んでるか? アメリカに会社があるか?」当然NoでSubmit。

他に何かアメリカでビジネスしてる? これもNo。

お次は長々と書かれてるけど、アメリカと日本で二重に課税されないための入力なんだそうな。
あらかじめ値が入ってる欄もあるし、空欄でいいところもあるそうな。必要箇所だけ入れればいいようだ。
ただし、一度送信すると変更できないようなので十分注意のこと。(と言われても内容がよくわからん)

I declare that the individual or organization named in 〜をチェック。


Who is authorized to sign this certificate? のTitleには個人だったらPresident(社長)って入れればいいって。


スクロールして下の方に入力する情報。
赤いところが記入要。
さっきも説明した二重課税回避のためにW-8BENという書類をアメリカのAppleに提出するらしいのだが、それにEINという米国納税者番号をあらかじめ取得して記入しなければならず(?!)、以下の参考サイト1によると、その取得がとっても大変らしい。
書き方が間違ってると受け付けてくれず、「出し直せ」という返事もくれないんだとか。
参考サイトでは「だから代理業者に頼んだ方がいい」ということだが、みんなそんなことやってるの?? なんか2〜3万かかるみたいなんですけど。
参考サイト3の情報だと、個人事業者は納税者番号は不要なので「000000000」でいいらしいとも?

Submitを一度押すと、「Submit押すとiTunes Connectから直しきかねーから、それでもよけりゃSubmit押せや」っておっかない赤字のメッセージが出るみたい。
俺とりあえずEINとか入れないでSubmitしちゃったけど…Σ(((°Д°;))))ガクガク
Submit押してからどうすりゃいいんだ!? W-8BENとか、EIN取得のための書類がメールで来るの?

参考
  1. Kentaro Shimizu/EINの取得
  2. raizan2ame/iTunes Connectの登録作業を実施
  3. studio heat Lab./iPhoneアプリ販売準備その2
  4. iPhone プログラミング トピックス/有料アプリケーションの契約、税金、銀行情報の入力

これで良かったのか?

夜にSubmitして、朝iTunesConnectでアプリのステータス見たらAppStore見たら、Ready for saleになってちゃんと販売されてたよ!
ありがとー! うん、ありがとー!

iTunes Connectの有料アプリの項目がContracts In Effect(事実上契約した)になったからいいみたい。

リリースされてる〜🎵

でも結局アップルに書類とか提出してないし、もちろんEINなんか入力すらしてないから、二重課税されるかどうかわかんないよ!🤣

実際どうなのよ?

アップルの公式デベロッパガイドの「日本の税務情報の入力」を読むと、
  1. 米国で必要な税務情報を入力
    1. 本拠地が米国の場合は必要事項全て記入
    2. 本拠地が米国以外の場合は一連の質問に回答して適切な税務書類または証明書に進む
  2. ダイアログ下部にある文章中のlearn moreというリンクをクリックして表示された書類に情報を入力
  3. Appleが情報を処理後に追加書類の要件と提出書類を返送
  4. それに残りの情報を入力して印刷してAppleに郵送
    1. 日本国税庁の書類のオリジナルを正副2通送信要
    2. 米国の組織の場合はIRS(米国の国税庁だな)に書類提出要とあるが、日本だからいらないと思う
  5. Appleが書類を確認して日本国税庁に転送
  6. 日本国税庁から書類がAppleに返送されたら日本のAppStoreでの源泉徴収税率を更新
という流れのようである。

EIN(米国納税者番号)は取得せんでもええのんか? ほんまにええのんか?
そもそもこの情報が古いのか、learn moreなんてリンクはなかった。(ちゃんと更新してくれよ、アッポーさんよぉ)
この後PDFか何かが添付されたメールがAppleから届き、それを入力、印刷して送り返すことになるんだろうか?
何か動きがあったらまた追記する。

2016年12月14日水曜日

Xcode8.2変更点

iOS10.2とともにXcode8.2になったので、変更点をまとめとく。

MacAppStoreのキャプションを翻訳。

Xcode8.2はSwift 3、iOS10.2 SDK、watchOS 3.1、tvOS 10.1、そしてmacOS Sierra 10.12.2が含まれる。
  1. タッチ・バーは新しいアクションを得て、カスタマイズすることができます。
  2. シミュレーターは、シミュレーター・ウインドウの上にドラッグ&ドロップすることでアプリをインストールします。
  3. さらなるバグ・フィックスと安定性改善。


  1. タッチバーは新しいMacBookのですな。
  2. シミュレーターウィンドウにドラッグ&ドロップしてアプリをインストールとはなんぞや? プロジェクトファイルをドロップしてみたけどSafariが立ち上がってファイルを検索してるだけみたい? シミュレーター関係だからMacじゃないよな。
  3. バグフィクスされたのは良いことです。
とりあえずそんなところで。

2016年12月7日水曜日

Enum/Switch使用時はoptionalに注意

以下のようにEnumが定義されている時に、

enum fukidasiState {
    case 標準
    case 枠だけ
    case 透明

}


たとえば以下のようなswitch文を書く。
//currentの吹き出しを辞書から取り出す
let fd = fukidasiDic[currentFukidasiID]
            
//タップするたびに枠だけ、透明、不透明をスイッチ
switch fd?.fukidasiState {
    case .標準:
        (何かの処理)
    case .枠だけ:
        (何かの処理)
    case .透明:
        (何かの処理)
    }

しかし、
case .標準:
の行で「Enum case '標準' not found in type 'fukidasiState?'」というエラーが出てうまくいかない。
Xcodeで自動で修正候補を出してもくれない。
これはoptionalが関係するようで、以下のように( )!でくくってやるとうまくいく。

switch (fd?.fukidasiState)! {

値がnilになる場合に?を付けたり、使用時に!でアンラップしたりとなんだかわかりにくいoptionalだ。
Swiftを学習するならoptionalは重要な胆になるだろうね。

Enum以外、Switch以外でもエラーは出るけど、単純なものならXcodeで修正候補を出してくれるけど、今回のケースでは出してくれなかったのでだいぶ悩んでしまった。

optionalについてはSwift2.xでも仕様が変更されたり、いろいろめんどかった。早く仕様が固まってくれるといいが。

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年10月26日水曜日

特別編:消えたユーザ辞書を復活

プログラミングと関係ないけど、Mac、iOS関係なのでこちらに書いておく。

macOS Sierraにしたら、ことえり(今もことえりって呼んでいいの?)のユーザ辞書が消えやがりましたよ。
以前のOSでもこういう不具合に悩まされてた人がいたみたいだけど、自分はこれが初めて。
iCloudドライブ経由で同期されるため、iPadに残ってればそこからMacにも反映させられるって情報もあったんだけど、その通りやってもiPadの方のが逆に消えてしまってお手上げだった。

今回、運よくTime Machineでバックアップが取ってあったので、それを使って復活させたわけ。

場所はユーザ/ユーザ名/ライブラリ/Dictionaries。
そこにあるユーザ辞書とUserDictionaryDescription.plistの二つをTime Machineで復活させる。

そしてシステム環境設定のキーボード/入力ソース/日本語の一番下にある追加辞書:に上記のユーザ辞書をドロップすればいい。
念のためにMacを再起動したけどね。
とりあえずうまくいってくれて助かった。

つーかさ、Sierra 10.12.0にアップデートして消えて、ちょこちょこ自分で辞書登録始めてたんだけど、10.12.1に上げたらまた消えたんだよね。
ユーザ辞書のトラブルはずいぶん昔からあるんだから、Appleもなんとかせいや。

ユーザ辞書の書き出し

ユーザ辞書を書き出す場合も、上記を任意のフォルダにドラッグ&ドロップすればいい。その際、なぜか辞書はコピーされずに移動になってしまうので注意。
編集した後にまた戻してやらないとユーザ辞書が消えてしまうことになる。

書き出されたユーザ辞書はテキストファイルになるので、それを開いて編集し、また戻してやればいい。

iCloudとの同期

上でも説明したライブラリのDictionariesフォルダ。
これのCoreDataUbiquitySupportフォルダを消して、iCloudを有効にしたままMacを再起動すると、iCloudからユーザ辞書がダウンロードされて復活するようだ。
一応うまくいったが、iPadの方で登録したのとまた違うようだ。
正直わからん。

2016年10月20日木曜日

コードで作ったオブジェクトが動かない時はARCを疑え

Storyboardで配置したUI部品(ボタンとかラベルとか)じゃなく、コードの中で作った部品が機能せず、「なんでじゃー!」と発狂したことなら皆さん何回かあると思います。

これって、本来はプロパティ(インスタンス変数)に保存しておかなけりゃいけないものを、関数の中だけのローカル変数に保存したばっかりに、関数を抜けた途端にARCが働いてガベージコレクションされちゃうからなのよね。
(実際にガベージコレクションするタイミングはARC任せだけど)

エラーやウォーニングが出るわけじゃないし、部品自体は画面に表示されたままだから、なんでじゃー! ってなるんだけど、iOSの仕組みを考えるとなるほどということになる。

UI部品ばかりじゃなく、音を鳴らすとかの場合にも、関数の中でサウンド関係のインスタンスを作って鳴らしたはずが鳴らなかったりするのは、やはり鳴り終えるまでガベージコレクションされない変数(要するにプロパティ)として保持しておかなきゃいけないのよね。

Storyboardで作ると自動的にプロパティが作られるので実感わかないけど、要はそういうこと。

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月21日水曜日

Swift3を使わない方法

Xcode8からデフォルトの言語がSwift3.0になったけど、いろいろ大きく変わるようで資料も少ないし、コンバーターかけても動かないコードが続出したり。

いずれ3.0を覚えなければいけないにしても、とりあえず今までのSwiftで書くやり方があった。

プロジェクトのTARGETS、Build Settings、Swift Compiler - Version、Use Legacy Swift Compiler VersionをYESにしてやるだけ。
これでSwift3を回避できる。
Xcode8以前は2.2だったけど、2.3に上がってはいると思う。

Swift 3 DEATHよ

Xcode8でSwift 3になったので、そっちへの気づいた変更点を書いていくですよ。
コードのトランスレーターダとSwift 2.4だかも選べるけど、3にしない理由はないと思うので、3のだけ書きますよ。

ざっと見たけど、いろいろ変わりやがったな。
全てをチェックしてらんない。
関数の引数にラベルを付ける方向で、NSのサフィックスを取る方向で、関数名を短くしたり、関数名と引数のラベルをセットで意味を持たせたり…
書くのが楽になったり、わかりやすくなったりしてるのかどうかわかんないけど、ちょこちょこ変えないでほしいよね…

今までのアップデートだと、トランスレーターでちょっとした変更点は直してくれたけど、今回トランスレーターかけてもエラーになるところが山のように出たよ!!
何のためのトランスレーターだよ、この野郎!!
みなさん覚悟しましょう(≧∇≦)

indexPathのプロパティをいじる時は as NSIndexPathとしないといけない

let row = indexPath.row - alienPicsKeysArray.count

let row = (indexPath as NSIndexPath).row - alienPicsKeysArray.count

関数の第1引数のラベルがない場合、_ を付ける?

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

UIColorの指定がcolor()がいらなくなった

vc.bgSkyImageView.backgroundColor = UIColor.clearColor()

vc.bgSkyImageView.backgroundColor = UIColor.clear

列挙型の指定が先頭小文字になった

UIView.setAnimationCurve(UIViewAnimationCurve.EaseInOut)

UIView.setAnimationCurve(UIViewAnimationCurve.easeInOut)

Booleanのプロパティがis〜になった

vc.talkView.hidden = true
vc.cameraBtn.enabled = true

vc.talkView.isHidden = true
vc.cameraBtn.isEnabled = true

NSTimerがただのTimerに

どうやら全体的にNSのprefixがいらなくなったようだ。
var urouroTimer = NSTimer()

var urouroTimer = Timer()

関数名が変わった

finishTimer = NSTimer.scheduledTimerWithTimeInterval(rnd,
                    target: self,
                    selector: #selector(Cennina.finish),
                    userInfo: nil,
                    repeats: false)
            }


finishTimer = Timer.scheduledTimer(timeInterval: rnd,
                    target: self,
                    selector: #selector(Cennina.finish),
                    userInfo: nil,
                    repeats: false)
            }


CGRectMakeとかが CGRectとかに

CGPointMakeなんかもそう。
ラベルも必ずつくようになったのね。
vc.ufoImage.frame = CGRectMake(0, 0, 200 * vc.倍率, 200 * vc.倍率)

vc.ufoImage.frame = CGRect(x: 0, y: 0, width: 200 * vc.倍率, height: 200 * vc.倍率)

レイヤーのaddAnimationがaddに

vc.view.layer.addAnimation(transition, forKey: nil)

vc.view.layer.add(transition, forKey: nil)


Switch分の書き方

optionalな値を判断するcaseの値の前に?が。めんどくせえ!
switch month {
        case 1: //1
            msgJanuary(day)
        case 2:
            msgFebruary(day)
        default:
            print()
        }

switch month {
        case ?1: //1
            msgJanuary(day!)
        case ?2:
            msgFebruary(day!)
        default:
            print()
        }

UserDefaultsの書き方

setする値が何でもsetだけで良くなったのだね。
読む時は型によって.object とか .boolとか指定しないといけない。
let ud = NSUserDefaults.standardUserDefaults()
if let _ = ud.objectForKey("currentStage")
ud.setBool(soundFlag, forKey: "soundFlag")
ud.setObject(currentStage.rawValue, forKey: "currentStage")

let test = ud.objectForKey("currentStage")

let ud = UserDefaults.standard
if let _ = ud.object(forKey: "currentStage")

ud.set(soundFlag, forKey: "soundFlag")
ud.set(currentStage.rawValue, forKey: "currentStage")

let test = ud.object(forKey: "currentStage")

Info.plistをローカライズする

注意:結論から言うとうまくいきませんでした。

iOS10、Xcode8からプライバシー関連の設定が増え、例えば画像ライブラリにアクセスするコードを書く場合に、あらかじめInfo.plistの必要な項目にユーザーに伝える使用目的を明示するメッセージを書かなければいけなくなった。
(書いたメッセージがアクセス時にアラートで表示される)

ま、そりゃいいんだけど、そこに日本語用、英語用なんて項目はないんで、Info.plist自体をローカライズして日本語用、英語用を作ることになる。
やり方としてはInfo.plistを選んで、右側のインスペクタからLocalize...ボタンを押して云々なのでまあわかるだろう。

でもそれやってビルドしようとしたら、
error: could not read data from 'パス/アプリ名-Info.plist': The file "アプリ名-Info.plist" couldn't be opened because there is no such file.
というエラーが出てビルドできなかった。
メッセージの内容としてはInfo.plistが見つかんないから開けねぇぞってことだけど、ちゃんとplistファイルはある。

調べたところ、Xcodeの以前からのバグで、パスがおかしいんだそうな。
プロジェクトのパッケージ内容を開いてproject.pbxprojを開き、中の該当部分を絶対パスから相対パスに書き直すといいとあったんで見たけど、どうも最初から相対パスになってるっぽい。(参考リンクもう一つ)
一度Localizeのチェックを外し、再度チェックすると直るとか書いてあったんだけど、試してもダメ。

それ以外の情報もないようなので、メッセージは英語と日本語両方入れておく。ダサダサ〜。
やむを得ずこうなった
後で解決方法がわかったら直します。
こんなとこで止まってリリースを遅らしちゃなんねぇ!!

2016年9月20日火曜日

ローカライズをテストする

日本語のほか、世界各国の言語に対応できるわけだが、シミュレータ及び実機でテストする際、いちいちホームの設定画面から言語とリージョンを選んで切り替えてた。

でもそんなことしなくてもXcodeの設定で一時的に変更することができたのな。知らんかったわ。
メニューの Product / Scheme / Edi Scheme...(⌘+<)で開くウィンドウの、RunのOptionsの

  • Application Language
  • Application Region

を変更してからビルドしてやればいい。

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が直ってくれるまでは切り替えて使うしかないか…。アップルのバカ!