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表示しか対応してないって言ってるんだろうね?

参考