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のバグだろうから、アップルが治してくれないとどうしようもない。

2019年6月24日月曜日

Xcode10になったらFrameworkがnot foundになった

Swift3の時代に作ったソースを久しぶりにXcodeで開いたら、Bridging-Header.hで#importしてるTwitterKit3.4.0とOpenCVがnot foundと表示されるようになってしまった。
リリースしてるアプリだから当然動いてたし、この間いじった覚えもないため、原因としてはXcode10になったくらいしか心当たりがない。

かなり試行錯誤し、結局は プロジェクトの
TARGETS / Build Settings / Search Paths / Framework Search Paths
がおかしかったことがわかった。
読んで字のごとくFrameworkを検索するPathを書くところだが、

$(inherited)
$(PROJECT_DIR)
$(PROJECT_DIR)/Twitter-Kit-iOS

などとなっていたのを

$(inherited)
$(PROJECT_DIR)/Twitter-Kit-iOS
$(PROJECT_DIR)

と順番を入れ替えたところ治ってくれた。
外部Frameworkをプロジェクトにaddすると勝手に新しい pathを追加してくれるみたいなんだが、関係ないpathも消した。
そのディレクトリになければ順番に下に書かれたディレクトリまで検索してくれそうなもんだけど、うまくいかないようで。

なお、実際のフォルダの階層は以上のようになってる。

プロジェクトへのaddは以下のようにした。
アップル純正のが入ったFrameworksフォルダとかもあるけど、直下に入れろみたいな情報も見たのでその通りにしてみてる。

ところでビルドできない致命的エラーは消えたけど、以下のようなWarningが一個出て消えない。
/Users/ユーザ名/Dropbox/Develop/Swift開発/tukkomi/Twitter-Kit-iOS/TwitterCore.framework/Modules/module.private.modulemap:1:29: Private submodule 'TwitterCore.Private' in private module map, expected top-level module
エラー個所は
explicit module TwitterCore.Private {
}
とだけ書かれたところ。とりあえず動きゃいいか。

TwitterKitはもうサポートが終了されてしまったのでこれからはSwifterというのに乗り換えた方が良さそう。

2019年6月20日木曜日

Swift3のDispatch semaphore

同期処理や非同期処理などを制御する仕組み。
Objective-Cと書き方がだいぶ変わったみたいなんでまとめる。
まだよくわかってないんで、書きかけとする。

言葉の意味

dispatch = 使者や手紙などを送る
semaphore = 手旗信号

要するに処理待ちのカウンターみたいなもので、値がマイナスの間はスレッドが停止する。
希望の処理が完了したら値をプラスしてやり、それが0になったらスレッド再開。

書式

詳しくは公式サイトで。

semaphoreを作る

let semaphore = DispatchSemaphore(value: 0)

semaphoreを通知、または増やす


semaphore.signal()

semaphoreを待つ、または減らす


semaphore.wait()
_ = semaphore.wait(timeout: DispatchTime.distantFuture
semaphore.wait(wallTimeout: DispatchWallTime)

同期処理させたいコードを書くところ

DispatchQueue.global(qos: .background).async { ここ }

具体的書き方

  1. semaphoreを作る
  2. DispatchQueue.global(qos: ここ).async { }の引数に優先順位を書く。
  3. DispatchQueue.global(qos: .xxxxx).async { ここ }のクロージャ内に同期処理させたいコードを書く
  4. 処理が一件終了したらsemaphore.signal( )を実行して待ち行列を解消して次の処理に移る。
  5. クロージャの最後にどれくらい待つのかを書く(たとえば処理が終わるまでずっと(以前はFOREVERとかなんとか書いてたけど、今はdistantFuture(遠い未来)だそうだ)とか)

let semaphore = DispatchSemaphore(value: 0)

_ = semaphore.wait(timeout: DispatchTime.distantFuture)

非サポートのSwiftバージョンを上げる

数年前に作ったプロジェクトを久しぶりにXcode10で開いたらSwift3のコードだったようで、もうサポートしてないって言われちゃった。カレントバージョンはSwift5。
普通Swift5にコンバートしてくれるボタンが出るけど、もうそれすらサポートされてないようだ。
エラーとして示されるコードをいくつか直しても同じメッセージが出たままビルドができない。

たしかXcodeの設定でコードのSwiftのバージョンを記憶してるところあったと思って調べて直した。

場所はプロジェクトのトップ/TARGETS/Build Settings/Siwft Compiler - Language/Swift Language Version。
これで最新のバージョンを選んでやれば、コードはSwift5で書かれていることにされる。でも当然コードの書き換えをしてくれるわけじゃないので、出てきたエラーを一つ一つ直していく。
Swift3からだと、#selectorで指定する先のメソッドの頭に @objc を付けなきゃいけないとかが多かった。それくらいはエラーメッセージをクリックすると出る「Fix」ボタンでやってくれたけどね。

初期のSwiftは毎年のように細かい書き方が変更されてきたんで、困りますな。頭いい人たちが作ってるんだから、最初からもうちょっときっちり仕様を決めて欲しかったけど、もうしょうがねえ。

2019年6月8日土曜日

WWDC 2019

  • ユーザーインターフェースのフレームワークSwiftUI登場
    • 徐々にUIKitから置き換わるもののようで、iPhoneなどのプレビュー画面を隣に見ながら部品/コードを置いていき、それが即座にプレビュー/コードに反映される。
    • デモを見た感じではdelegateとかが複雑にからんでいたTableViewも、Listとしてかなり短いコードで実現していた。
    • これまでのStoryboardは徐々になくなるんだろうけど、すべてのUIをSwiftUIでいきなり置き換えられるのかしら? もちろん最新の各種OSじゃないとダメよね?
    • これまでSwiftは短期間でver5まで上げられ、仕様の変更にデベロッパは右往左往させられたけど、また6とかに上がるのかしら? 大きく変わるのは勘弁。
  • 各国語ローカライズが簡単に
    • 各国AppStore用のスクリーンショットも自動生成してくれるって。コリャ便利。
  • iPadのアプリがmacOSでも動くようになる(Project Catalyst)
    • iPadアプリをMacのネイティブアプリとして開発できるんだそうな
    • iPadOSとmacOS Catalinaという組み合わせなの?
    • これまではUIKitをmacOSで使えるようにするという話があったけど、UIKitとSwiftUIと両方なんだろうか?
    • iPhoneのアプリは動かない?
  • iPadOSが登場
    • 画面や操作をiPadに特化したもの。対応はiPad Air2以降なんで俺のがギリギリ対応。
    • これまでのiPhoneのアプリは使えるんだろうか?
    • 年間ライセンスにもiPadOSの項目が作られるという噂も。また別に12000円くらい取られるのはイヤでござるよ。Mac向けの開発にも通じるからってことだろうか? ただの噂で終わって欲しい。
  • macOS 10.15 Catalina
    • 2012年中期以降のMacに対応だって。うちのMac mini Late2012がこれもギリギリ対応! じゃあ来年〜再来年あたりにはMacとiPad両方買い換えないといけない?(ノД`)
  • iOS、iPadOSなどのベータ版を使用するには、macOSもベータ版にしなきゃいけないんだって。そんな個人で2つのデバイスをベータにはできんわな。

2019年6月5日水曜日

2ファクタ認証ってなんだ?

Apple Developerで2ファクタ認証ってのが必要になって、うまく設定できずに困ってる。
そもそも2ファクタ認証ってなんだよってことで調べてまとめる。

アップルサポートサイトの記述

2ファクタ認証とは何ですか?2ファクタ認証は、Apple IDの認証を二重化することでセキュリティを強化し、たとえパスワードが他人に漏れても、本人以外はアカウントにアクセスできないようにする認証方式です。パスワードに加えて、信頼できるデバイスか、SMSまたは音声通話で届けられる確認コードの利用を求めることで、アカウントを保護します。パスワードだけではアカウントにアクセスできないため、Apple IDと、Appleに保管されている個人情報のセキュリティが向上します。
これまでのパスワード入力の他に、Apple IDと結びついた別のMac、iOSデバイスやケータイなどに確認用コードを表示し(音声の場合もあり)、そのコードを入力させることでセキュリティを高めるってわけだな。
つまりIDとパスワードが盗まれても、それと結びついたデバイスに表示される確認用コードが得られなければ不正ができないということだ。
たしかに最近は何かするとiPhoneに4桁とか6桁とかの確認コードが表示されてそれを入力しなきゃならないケースが多い。

これまでの2ステップ確認とはなんじゃ?

2ファクタ認証前も同じようにiPhoneに確認コードが送られてきてたような気がするんだけど、違ったっけ?
アップルサポートサイトの記述によれば、信頼できるデバイスをApple IDに結びつける点は一緒だし、そこに確認用コードを表示して入力させる点も一緒だ。
アップルの内部的な処理は知らないが、結局ユーザのエクスペリエンスというか、表面上の違いはわからなかった。
もしわかったら追記する。

Developerアカウントに2ファクタ認証を設定

まず、個人用Apple IDとDeveloper用Apple IDは分けてある。
それはDeveloper Program参加時に「分けたほうがいい」といろんなサイトに書いてあったから。

2ファクタ認証が必須になるってよ

今年の初め頃、
アカウントの安全性を高めるため、2019年2月27日以降、デベロッパプログラムのAccount Holder(アカウントホルダー)がApple Developerアカウントおよび「Certificates, Identifiers & Profiles(証明書、ID、プロファイル)」にサインインするには、2ファクタ認証が必要になります。
と連絡が来てたのは知ってたけど、よくわかんないでほっといた。個人用IDの方は2ファクタ認証設定済みである。

証明書が切れるってよ

今度はその 「Certificates, Identifiers & Profiles(証明書、ID、プロファイル)の有効期限切れが迫ってるで」とメールが来たので、書いてあるリンクから更新しようとしたら、「Developer用 IDに2ファクタ認証を有効にしろ」と出て先に進めなくなった。
「詳しくは、サポートページ(英語)を参照」っていうんでクリックしたら日本語ページに飛んだ。フィッシング詐欺サイトかと不安になったけど、アドレスはまともなんで大丈夫だろう。
んで、そこの関連情報欄に「iCloudとApple Developerアカウントで、別々のApple IDを使用するにはどうしたらいいですか?」というズバリなことが書かれてたんで、Macでその通り試したんだが、途中から書いてある通りにならず断念。
具体的には以下の手順なのだが、3でつまずいてしまった。
  1. 「システム環境設定」>「iCloud」>「アカウントの詳細」>「セキュリティ」で、個人用Apple IDの2ファクタ認証を有効にします。
  2. Macの「システム環境設定」>「ユーザとグループ」で、デベロッパ用Apple IDで使用する新しいシステムアカウントを作成します。
  3. 「システム環境設定」>「iCloud」>「アカウントの詳細」>「セキュリティ」で、デベロッパ用の新しいシステムアカウントにサインインし、デベロッパ用Apple IDの2ファクタ認証を有効にします。←ここ! ここで新しいシステムアカウントのサインインが求められないの! よって、以下の処理はできなかった。
  4. 「システム環境設定」>「インターネットアカウント」>「iCloud」で、プライマリシステムアカウントにサインインし、Macにデベロッパ用Apple IDを追加します。
  5. これで、個人用とデベロッパ用のApple ID両方の確認コードをプライマリユーザーアカウントで受信できる設定になります。

2ファクタじゃなく、2ステップ入力を試す

WebでApple IDの情報にアクセスして2ファクタ認証を有効にするのかとも思ったが、「2ステップ認証」しか出て来ず、とりあえずそっちを有効にしてみようとしたら、「セキュリティ保護のため6月7日 xx時xx分xx秒までお待ちいただく必要があります」だとさ。今日が4日なので要するに丸3日も待たされる。なんなん?
サポートサイトによれば、「セキュリティ対策として、アカウント情報に重要な変更が行われば場合(パスワードのリセット、セキュリティ質問の設定など)は、設定を完了できないように待機期間を設けている」ようだ。そういえばセキュリティ質問忘れたんでリセットしたっけ。そのせいか。

ウェブのApple ID管理ページだと、「2ステップ確認 アップグレードは6月7日 xx:xx:xx以降に可能です」ってあるから、3日後以降に2ステップ確認→2ファクタ認証にアップグレードできるってことか?

新アカウントでも2ファクタ有効にできず


さっき作った新しいユーザアカウントでMacをログインしなおし、システム環境設定のiCloudから「2ファクタ認証」を設定しようとしても、できないって出て有効にできない。なんなん!?

ネットで調べても、
  • 2ステップ認証を切らないとダメ
  • 最初に2ステップ認証を設定しなきゃダメ
とか出てきて、よくわかんねえ。

3日間待った

ちょうど3日目にアップル様から「ご利用の Apple ID に 2 ステップ確認を設定できるようになりました。」ってメールが届いた。
そこからリンクされたApple ID管理のWebページでログイン(もちろん開発用アカで)して、アカウントページのセキュリティ項目にはすでに「2ファクタ認証にアップグレードする」とかなんとか書かれてるんで、そのボタンをクリック。
ところがそれでONになってくれるわけじゃなく、Macのシステム環境設定/iCloudでONにする方法が表示されるだけ。なんかだまされた気分。
しょうがないからシステム環境設定開き、iCloudでそのとおりにしたんだけど、iCloudが個人用アカでログインされてるから当然すでに2ファクタはONになってる。

アップルの方で表示された手順にはないけど、当然個人アカをサインアウトして開発アカでサインインするんだと思ってそうしたところ、サインインの段階で「2ファクタ認証にします」とか表示が出て、勝手にやってくれた。
そのかわり開発アカでのサインインは個人アカが有効になってるからそっちを無効にしてからみたいな表示が出た。開発アカの2ファクタ認証有効化だけが目的なので、これはこれでよし。個人アカを再度サインインさせておしまい。

セキュリティの強化はわかるけど、なんかいろいろめんどくさくなったよね。冒頭の開発用証明書の更新だって以前は毎年やる必要なかったのに。去年くらいからだよな?
手順が複雑だからこうしてブログとかにまとめておかないと忘れちゃう。