2019年9月28日土曜日

バージョン表記にご注意

以前リリースしたものが些細なバグを治したものだったのでVersion 1.01だったのね。
んで、今度リリースするのを1.1にしてXcodeからvalidateかけたらエラーが出やがった。Invalid Bundleだって。前のよりも高い数字を入れろっていう。

前のが1.0.1のつもりだったんで、1.1ならいいだろうと思ったんだけど、よく考えたら1.01と1.1じゃ数学的には同じだな。AppStoreConnectでは単なる文字列としてじゃなく数字として見てるみたい。
一応公式にはメジャーバージョン・マイナーバージョン・些細な修正みたいな感じで数字を作れって推奨してるようだ。1.2.10みたいに。

AppStoreConnectじゃもうversion1.1として新バージョンを作り始めちゃってて、それを消したりバージョンを変えたり変更ができない。
しょうがないからXcodeのプロジェクトのVersionを1.1.1にしたらvalidateもuploadも通って、一応審査には出せた。
最終的に審査でリジェクトされるかもしれないけど、様子見。

もし1.01と1.1を本当に同じものとして見てるなら、1.1でBuildナンバーを1.01の時より増やせば行けるかもしれない。もしリジェクトされたら試すー。

って言うか、誤った情報の取り消しや編集をさせろよ…💢

2019年9月26日木曜日

iOS13はモーダル画面表示が変更された


iOS13はモーダル画面を表示する際、全面を覆うのではなく上の一部に隙間を残し、指で下にスライドすると画面が閉じるような仕様になった。
これは強化されたマルチタスクを扱う際の変更じゃないかと思うんだが、デフォルトがこれなので、iOS13 & Xcode11であらためてビルドすると今までのアプリもそうなってしまうようで困る。

直し方は簡単で、vcに遷移先のViewControllerが入っているとすると、以下のようにプロパティ modalPresentationStyle.fullScreen を指定するだけでいい。

vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)

簡単はいいけど、これをデフォルトにしなくてもいいじゃねえかって思うんだけどね。よけいな作業増やしやがって。

iOS13でAVAudioPlayerが落ちるようになった

以下のようなコードでBGMやSEを鳴らすアプリをリリースしてたのだが、iOS13にアップデートしたら音を鳴らす所で落ちるようになってしまった。
もっと詳細には try player = AVAudioPlayer(contentsOf: url) 
Thread 1: EXC_BAD_ACCESS (code=1, address=0x48) - broken with 
というエラーコードで落ちた。リリースしていたアプリが落ちるのだから、iOS13のせいだ。

import UIKit
import AVFoundation

class ViewController: UIViewController {
var player = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
do {
if let audioPath = Bundle.main.path(forResource: "BGM", ofType: "mp3") {
let url = URL(fileURLWithPath: audioPath)
try player = AVAudioPlayer(contentsOf: url)
}
} catch {
print("ERROR")
}
self.player.play()
}
}

調べたところ、頭でインスタンス変数として宣言している
var player = AVAudioPlayer()
var player:AVAudioPlayer!
とoptionalにしたところ、落ちなくなった。

変数作る際に初期化コードを書いても初期化されなくなる仕様変更があったんだろうか? そうなるとAVAudioPlayer以外でも同じ問題出てくる?

参考サイト


2019年9月22日日曜日

Xcode11リリース

2019/9/20にiPhone用にiOS13が、1日遅れの顰蹙でXcode11がそれぞれリリースされた。
iPadの方は新しくiPadOSになるということで、リリースはもうちょっと後らしい。
iOS13はダークモードがある以外は見た目にはあまり変化がない。

以下、とりあえず気づいた点だけ。

デバイス欄にiPhone、iPadに加え、Macが!


iPadOSとmacOSで共通のアプリを作れるような話もあるが、まさかmacOS 10.15 Catalinaにしたら一本のコードでiPhone、iPad、Macで共通のアプリなんて作れたりする?
それとも表示されてるだけで、iPadOSかmacOS用のテンプレートじゃなきゃここがenableにならんか?

SwiftUI

これまでのAutoLayoutのStoryboardとプロジェクトを作る段階で選択になる。
作成時、User Interfaceのメニューで選択

ひな形からプロジェクトを作成するとこれまでのViewControllerの代わりにSceneDelegate.swift、ContentView.swiftというファイルが作られている。

SceneDelegateはUIWindowSceneの状態が変化した時のdelegateメソッドが並んでる。これがUIViewControllerのviewDidLoadとかの代わりになるのかはよくわからん。

ContentViewの方が実際に画面デザインのコードを記述するファイルとなるようだ。
中に書かれたContentView構造体はSwiftUI用のviewプロトコルを継承した構造体の定義になっている。まだよくわかんないけど、ここに書くってことさえ覚えときゃいいか。

SwiftUIを勉強しようとしたのだが、コードと1対1のプレビューが出てこない。これMacもCatalinaに上げないといけないんだって(今はβだけ)。リリースまでおあずけ。コードを試すだけしかない。

単にAutoLayoutのconstraints設定を新しくするようなものでなく、UI部品の配置までコードとともに見えるようになるわけだな? ActionやOutletの接続はどうなるのやら。プレビューが見られるようになった場合、segueで繋がれたViewController同士の関係性とか見られるのかね?
Storyboardと併用できないようなので、早めに覚えてしまいたい。
詳しいことがわかったら勉強がてら別にまとめる。

ボタンアイコンを大量に搭載


Storyboardで右上の「+」ボタン(UI部品を選ぶ所)を押すとボタンなどのアイコンデザインが大量に出てくる。今までほんの少ししか搭載されておらず、あとは自作するしかなかったシステムアイコンだが、ようやくこれで統一が図れる。
StoryboardにドラッグするとImageViewとして貼られる。名前を指定すればコード中からも使える。

Swift UIを選択した場合は「+」ボタンの中にこの一覧がないんだが、別に見られるのかしら? まあ、UIButtonとかのImage名を入れるとこのメニューに名前が出てくるけどね。
アイコン画像サイズは最小しかない?

RealityKit

ARのテンプレートにRealityKitというContent Technologyが選択できるようになった。
RealityComposerというXcode内のアプリを使ってARに表示する物を編集できるようなのだが、まだよくわからない。
テンプレートをそのままRunするとタッチした正面に3Dの立方体を1個表示するアプリができる。
Composerでその質感とかを変えられるようなのだが、変えるとエラーが出るのでよくわからん。

2019年9月17日火曜日

LaunchImage(スプラッシュ画面)の大きさは適切に

様々なサイズの画面に対応させるべく、StoryboardのAutoLayoutを設定していても、シミュレータや実機で画面上下が黒帯になってしまうことがある。
iPhone8とかじゃきれいに表示できたのに、iPhoneXじゃこのとおり
これはLaunchImage(スプラッシュ画面とも。要するに起動時に表示される画像)の設定が未対応のため。
これをLaunchScreen.storyboardできちんとAutoLayoutのConstraintsを設定してやればいい。
AutoLayout未対応の頃のアプリだとLaunchScreen.storyboardがないが、New FileのUser InterfaceにLaunch Screenがあるから、それを追加すればいい。
あとはTARGETS / General / App Icons and Launch Imagesの Launch Screen Fileを今作ったLaunchScreenにしてやる。