2016年6月24日金曜日

Gitでバージョン管理

よくわからんのでまとめとく。
間違ってたらすまなんだ。

Gitってなんだ?

ジットと読み、Linux発でソースコードのバージョンを管理するための仕組み。
ソースコードの差分、ディレクトリ構造などの変更履歴を取っておくことで、変更前に戻すことができる。
XcodeではXcode 4から実装している。

リポジトリ

ファイルやディレクトリの状態を記録する場所。

  • ローカルリポジトリ
    • 一人で開発してる場合、端末上に作る
    • Xcodeではプロジェクト作成時の保存ダイアログ上で「Create Git repository on My Mac」にチェックを入れることで作る。(デフォルトでチェックされてる)
  • リモートリポジトリ
    • 複数で開発してる場合、サーバ上に作る
    • Xcodeでの作り方はよくわかんないんで略

コミット

リポジトリに変更履歴を記録すること。
1の次に2、2の次に3といった形で順番に記録される。
XcodeではメニューのSource Control/Commit...。
ソースファイル名の横にMとかAとか付いてるのがコミット可能なファイル。
Commitの画面で、どこをどう直したかなど、コメント入力必須。

ブランチ

大きな変更がある際など、コミットの流れを分岐させること。
3でブランチした場合、3’の流れが新たに作られ、3’を4’に変更しても、3の流れの方は影響を受けない。
分岐させたブランチはマージ(merge/合流)させることができる。
最初のコミットで作られるのがマスター( master)というブランチ。この例で言えば「’」のつかない1〜3の流れ。

チェックアウト

今いるブランチを出て、別のブランチに移ること。

プッシュ/プル

  • プッシュ
    • リモートリポジトリに対して変更を書き込む
    • XcodeではSource Control/Push...
  • プル
    • リモーとリポジトリから変更を読み込む
    • XcodeではSource Control/Pull...
リモートリポジトリについてはよくわかんないので略。

2016年6月14日火曜日

アプリリリース方法

前にもどっかにまとめたはずなんだけど見つかんないし、iTunesConnectやXcodeのデザインも変わってると思うので、あらためて簡単に。
細かいところがちょこちょこ変わるので、2016年12月現在の方法に更新しました。

新規App

iTunesConnectにログインし、新規App登録を開始する。
2016年12月現在
  • 名前
    • アプリ名です。
  • プライマリ言語
    • 他言語対応の場合、Englishにしといた方がいいらしい。
  • バンドルID
    • これはXcodeで設定したのを見て入れること。→ 登録ダイアログ中のリンクにあるDeveloper Portal(次項参照)で、事前登録が必要。登録後、プルダウンメニューに表示されるのでそれを選ぶ。
  • SKU
    • 他のアプリとかぶらないものならなんでもいいけど、俺は英文字+通し番号にしてる。

Developer Portalでの事前登録

  • App ID Description
    • アプリ名を英文字で入れる
  • App ID Prefix
    • チームIDが表示される
  • App ID Suffix
    • Bundle IDにXcodeで設定したBundle Identifier(ドメインを逆さにして入れたアレ)を入れる。間違っちゃダメ。間違うとこの設定はたぶんゴミとして残る。そうなったら無視するしかない。
上記Prefix、Suffix、アプリ名の順に「.」でつなげたものがApp IDになるらしい。

  • App Services
    • アプリで必要とするサービスがあればチェックする。
    • Apple Pay、HealthKit、iCloud、SiriKitとか、そういうやつね。この項目は後から再編集できる。

APP STORE情報

  • App情報
    • AppStore上のカテゴリなどを入れる
  • 価格および配信状況
    • AppStoreの価格などの設定
      • 価格をプルダウンメニューから選ぶ
      • 開始日、終了日は最初は変更できないっぽい
    • Volume Purchase Program
      • 教育機関とかがまとめ買いした場合に割り引くかどうか
    • Bitcode自動再コンパイル
      • よくわからんのでデフォルトのままでいいか

iOS APP

左側に「1.0 提出準備中」ってなってるのを開くと、スクリーンショットとかの登録ページに移る。
書いてある内容を読んで必要なものを記入、アップロードしていくこと。

  • バージョン情報
    • App プレビューとスクリーンショット
      • AppStoreで表示する説明画像をiPhoneおよびiPad用を登録する。最も大きい画面サイズのデバイス(iPhoneなら5.5インチのもの)を一種類登録すれば全部のサイズで有効になる。
    • 概要
      • AppStoreでのアプリ説明文
    • キーワード
      • AppStoreでの検索用
    • サポートURL
      • アプリをサポートするためのサイトやSNS
    • マーケティングURL(オプション)
      • なんのこっちゃ?
  • iMessage App
    • 必要な場合だけ
  • Apple Watch
    • 必要な場合だけ
  • ビルド
    • 一番最後にやる。Xcodeからアーカイブしたアプリをアップロードしてからここを設定する(次項参照)
  • App 一般情報
    • App アイコン
      • 1024×1024じゃないとダメ
    • バージョン
      • 1.0からね
    • 年齢制限指定
      • 暴力表現や性的表現があるかなどの項目に答えていく
    • Copyright
      • 著作権表示。テキトーに。
    • 通商代表連絡先情報(韓国App Storeのみなので普通はいらない)
      • 英語で入力。番地は逆さに(山田町1丁目2番地なら1-2 Yamadacho)
      • 電話番号は先頭に国番号を付け、市外局番の頭の0を取ったものにしないといけない。たとえば080-12345678だった場合、+81-80-12345678となる。
    • Routing App Coverage File(オプション)
      • アプリがサポートする地理的領域をファイルで指定だって? 使ったことない。
  • Game Center
    • 必要な場合だけ
  • App Reviewに関する情報
    • 連絡先情報
      • 名前と電話番号とメルアド
        • 電話番号は先頭に国番号を付け、市外局番の頭の0を取ったものにしないといけない。たとえば080-12345678だった場合、+81-80-12345678
    • デモアカウント
      • 審査の時に使う全部の機能が確認できるアカウント情報。デフォルトでチェックされてるから不要なら外す。
    • メモ
      • アプリ審査時に役立つ情報。なければ空欄で。
  • バージョンのリリース
    • 自動でリリースするか、手動でリリースするかなど。普通は自動で。
並行してXcodeからアップロード作業をする。

Xcodeでアーカイブとアップロード

  • メニューProduct/Scheme/Edit Scheme...(これいらないかも?)
    • Build ConfigurationをDebug → Releaseに
  • メニューProduct/Archive
    • 右のカラムのValidate...
    • provisioningを選択し、Validate。SuccessfulになったらDone
  • 右のカラムのUpload to App Store...
    • provisioningを再度選択し、Upload
    • これでiTunesConnectにアップロードされる。
    • アップロード後、手直しして再アップの場合、XcodeのGeneral/IdentityのBuildナンバーを変えないとダメ。
    • Upload SuccessfulになったらDone
数分するとアップロードがiTunesConnectに反映され、iTunesConnectのビルドに出るようになる。
最近は反映された際にメールで知らせてくれるようだが、なかなか出ない場合はiTunesConnectのページを再読み込みするといいようだ。

審査提出

iTunesConnectで必要な項目を全て書き込み、スクリーンショットなどもアップロードしたら、一番上の「審査に提出」。

最後に、
  • 中で暗号使ってないか?
  • 使ってる画像とかがちゃんと著作権クリアしてるか?
  • ターゲット広告使ってないか?(IDFAとか言うらしい)
    • GoogleのAdMobはターゲット広告なのでここをチェックした
などと聞いてくるのでそれぞれ答える。

最近は一両日中に結果を出してくれるなど、かなり早く審査してくれるようだ。

最後に一言…

Xcodeから審査提出できるようにせいや!
いちいちiTunesConnectと行ったり来たりは面倒なんじゃあ!!!
ああすっきりした。

すべてのiPhoneに対応させない

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

解像度が多すぎる

アンドロイドスマホほどじゃないとは思うが、iPhoneは解像度とアスペクト比のバリエーションが多い。
執筆時現在、以下の画面サイズに対応させなければいけない。
  • RetinaのiPhone4sで640×960
  • 縦にサイズが伸びたiPhone5が640×1136
  • iPhone6では4.7インチで750×1334
  • 最新のiPhone6 Plusでは5.5インチで1242×2208

このうちiPhone4sだけは縦が短いので、うまく画面を作らないと、それ以外の画面で横がはみ出したり上下に黒い帯を表示させることになってしまう。

正直、いちいちこんないっぱい対応してられるか! と思う。
これにiPadの対応までするとなるとますますだ。(iPadはアスペクト比が一緒だからレイアウト変更などは一種類で済むが)
俺のせこいアプリなんかはiPhone4sの解像度でだけ作って、iPhone6s Plusだろうがスケーリングモードで拡大して表示してくれるとありがたい。
要はiPhoneのアプリをiPadで使う時みたいに、多少表示が粗く見えても2倍とかに拡大してくれればいいのだ。

そういう風に作れないだろうか?
さらに、それでアップルの審査をパスできるだろうか?(最低iPhone5のサイズに対応せんと怒られるのではないか?)

対応させないためには

みなさん頑張って各解像度に対応させてるのか、検索してもスケーリングモードで表示させる方法があまり出てこない。
どうやらアプリ起動時に表示されるLaunch Screen(スプラッシュスクリーンともいうのだな)をどの解像度(機種)の分をインストールするか/しないかで対応解像度を選べるらしい…ということだけ風の便りで聞いていた。


そこでLaunch ScreenにiPhone4s(3.5インチ)用のLaunchScreenだけ入れiTunesConnectにアップロードし、スクリーンショットも3.5インチ画面のみをアップロードしてみた。
しかし「審査提出」ボタンを押すと「アプリが他のサイズ用に対応してるから、それ用のスクリーンショットもアップロードしろ」と出てしまった。

チェックボックス全てOFFにしてみる

最低限のLaunch Image
XcodeのLaunchImageの画面でスクリーンショットの入ってない枠が残ってるせいかと思い、LaunchImageのインスペクタでチェックボックスを全てOFFにしてみたが、やっぱりiTunesConnectで同じエラーになる。

もしかしたらちゃんとしたやり方あるんだろうとは思うけど、近い将来サポートされなくなる3.5インチにこだわって作っててもしょうがないのであきらめることにした。
あ〜、全部の解像度対応してやりますよ! このヤロー!(TДT)(iPadを除く)

やっぱりサポートされなくなった

2016/6/14のアップルのイベントでiOS10について発表があり、iPhone4sが非対応になったようだ。
これで、若干のアスペクト比の違いはあれど全て縦長になったので(iPadを除く)、デザインはしやすくなったかな。

iPadのスケーリング表示はどうなる?

iPadってiPhoneしか対応してないアプリを使う場合、現状ではiPhone4sの解像度をスケーリング表示させてるけど、これからはどうなるんだろうな。
iPhone5の解像度をスケーリング表示するようになるの?

iPad対応版を作るんであれば、どのみち今までどおり縦長なiPhone、正方形に近いiPadの両方のデザインを作らないといけませんな。こっちはもう早くからあきらめてる。

2016年5月19日木曜日

iAd廃止だってね

2016年6月30日でiAdと関連広告サービスが廃止されるという英文メールがアップルから届いた。
薄々は聞いてたけど、書かれてるように「すでにご存知と思いますが」ってことはなかったぞ。

うちのアプリ、たしかiAd表示できない時はGoogleのAdMobも使うようにはしてるけど、全部対応させてたかしら?

アップルはあんまり儲からなかったんだろうね。もうちょっといろんな表示に対応したりして他の広告サービスを凌駕すればよかったのに。
あとiPadでiPhone用アプリを表示した時にiAdが表示されないとか不具合もあったのが痛い。少なくともうちの環境では表示されなかった。

広告サービスの規約が厳しくなったりしてるようだし、あんまり広告表示させたくないのかも。
本当は無料アプリに広告のパターンじゃなくて、百円でもいいからお金を払ってもらう方が健全だと思うんだけどね。

なお、iAd廃止直前の6月23日にiAd付で審査提出したアプリが、翌日無事に審査通過してリリースされた。
ギリギリまで受理してくれるんだね。

2016年3月29日火曜日

アプリ名のローカライズ

日本語のアプリ名の付け方。

1 XcodeのPROJECT/Info/LocalizationにJapaneseを追加

Storyboardなんかのローカリゼーションファイルを作るというダイアログが出るので、作ってやる。

2 InfoPlist.stringsというファイルを作る

 Supporting Filesの中に新たなInfoPlist.stringsというファイルを作る。(ファイルの種類はiOS/ResourceにあるStrings File)
右側のインスペクタのLocalizeボタンを押して、種類でJapaneseを選ぶ。

InfoPlist.stringsの中に
CFBundleDisplayName = "(日本語アプリ名)";
とやれば完成。
実機でコンパイルすればアプリ名が設定した日本語名になってるよ。

2016年3月25日金曜日

Xcode7.3、Swift2.2の変更点

iOS9.4、OSX 10.11.4などのリリースにより、Xcodeが7.3、Swiftが2.2になり、仕様変更があった。プロジェクトを開いたら、いっぱいWarningが出たよ。
まあほとんど自動的に修正してくれるようだが。
今はまだ非推奨(deprecated)の段階なので、そのままでもコンパイルしてくれる。

まずソフトウェアアップデートで表示された変更点を和訳。

Xcode 7.3の変更点


  • XcodeのiOSとOS Xのplaygroundは、対話的で、ユーザー生成のイベント(例えばボタン・クリックとiOSジェスチャー)に反応します。
  • コード補完機能は、より知的な提案(APIの範囲内で単語の最初の文字に基づいたオプションを含む)を提供します。
  • デバイスウィンドウは、一つのiPhoneに対して複数のApple Watchデバイスの間での切り替えをサポートします。
  • SwiftとObjective-C両方の記述を評価するとき、デバッガーは必要なフレームワークを自動的にインポートします。
  • ビューデバッギングは、さらなるインスペクター情報、コンテキストメニューとアシスタントエディター・オプションを追加します。
  • 静的アナライザーは、nullabilityとObjective-Cの属性に関連した、より潜在的問題を確認します。

Swift2.2の変更点


  • Swift.orgからダウンロードされるSwift toolchainsは、プリファレンスのupdated Componentsタブから簡単に選択できます。
  • 新しく#file、#line、#columnと#functionの記述を追加。
  • スライスタイプの新しいremoveFirst()とremoveLast()メソッドを含む、標準ライブラリの改善。
  • 条件付きビルドのオプションは、現在のSwiftバージョンに基づく同じファイルの範囲内で、はっきりしたコードブロックを編集することができます。
  • メソッドのObjective-C selectorを参照する、新しい#selector記述。
  • 失敗可能なクラス・イニシャライザは、スーパークラスのイニシャライザを呼ぶ前に、「nil」を返すことができます。
  • 改善されたコンパイル時診断メッセージ。
  • 例えば++、--文と、C言語スタイルのループ文を、将来リリースされるSwift 3に備えて非推奨化。
よくわかんないのもあるけど、まあいいや。
次に、自分のプロジェクトで引っかかった点のまとめ。

selectorの記述で、Objective-C式が非推奨になる

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

新(Flatwoodsはコードが書かれたクラス名)
finishTimer = NSTimer.scheduledTimerWithTimeInterval(rnd,
                target: self,
                selector: #selector(Flatwoods.finish),
                userInfo: nil,
                repeats: false)


ちゃんとクラス名も入れろってことか。

加算、減算演算子の++、--が次期Swift3から使用不可に


actionCounter++



actionCounter += 1

for文も変わった


for (var i = 0; i < 10; i++) {
    print(i)
}

for i in 0..<10 {
    print(i)
}

旧のi++が将来的に使えなくなるとしてWarningが出るのは当然として、C言語形式の書き方も将来的に廃止になるからとしてfor in形式に書き換えさせられる。

2015年12月17日木曜日

画面遷移時のトランジションエフェクトで変なメッセージ出る

別画面をトランジションエフェクト付きで開こうと、次のコードを実行したら、毎度変なメッセージが出ちゃうですよ。
一応トランジションは実施される。(遷移前のviewの透明部分に先に遷移後のviewの画像が出ちゃうとか細かい不具合は見られるけど)

alienVC.modalTransitionStyle = UIModalTransitionStyle.FlipHorizontal
self.presentViewController(alienVC , animated: true, completion: nil)

遷移先の画面で
self.dismissViewControllerAnimated(true, completion: nil)
ってやって前の画面に戻る時にも同じメッセージが。

毎度出るメッセージ<_UIFlippingLayer: 0x14cf13c90> - changing property magnificationFilter in transform-only layer, will have no effect

和訳すると、
「トランスフォーム専用のレイヤーで拡大フィルターのプロパティーを変更しました。エフェクトできません」
とかそんな感じか?

これ、上みたいにコードで開く場合だけじゃなく、Segueで開く/戻る時にも出るんだよね。
UIFlippingLayerについてのメッセージだから、FlipHorizontalのエフェクトが関係するんだろうね?
UIModalTransitionStyle.FlipHorizontal.CrossDissolveにすると出ない。
海外のサイト見たら、CATransformLayerでも同様のメッセージが出てるようで、「無視することがオススメ」なんて回答されてることも。
うざいっちゃうざいけど、よくわかんないし、大きな実害も出てないから当面無視するしかないか。