20191028のSwiftに関する記事は7件です。

【Swiftビルドエラー解決】This app could not be installed at this time. 

はじめに

よおXcodeにハマった王国騎士ロボットVTuberのKoshiだ?? (@Koshi_VTuber)

macOS Mojave
Xcode Version 11.1 (11A1027)

問題

ビルドした時、このような画面が出て、Simulator上でアプリを起動できなかった。

スクリーンショット 2019-10-28 20.23.52.png

This app could not be installed at this time.
現在、このアプリをインストールできませんでした。

???
Detalesをクリック

スクリーンショット 2019-10-28 20.24.37.png

Failure Reason: Could not install at this time.
失敗の理由:現時点ではインストールできませんでした。

Recovery Suggestion: Could not hardlink copy
回復の提案:コピーをハードリンクできませんでした

??????

試したこと

Xcodeでビルドしようとしたら "This app could not be installed at this time." というエラーが出て失敗する状態からの脱出

altを押しながらproduct > clean build Folder

×だめ。

解決法

シミュレーターをリセットする。
Simulatorを起動し、
Hardware -> Erase All content and settings...
プロジェクトをクリーンアップします。

shift+ cmd+K
shift+ opt+ cmd+K

これで問題が解決するはずが、

おかしい

スクリーンショット 2019-10-28 20.50.46.png

仕方なくlogを覗く

〜/ Library / Logs / CoreSimulator /
の中にある。

スクリーンショット 2019-10-28 21.08.29.png

Simulator.log

Oct 28 20:15:39 AnoMacBook-Pro Simulator[629] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:22:32 AnoMacBook-Pro Simulator[982] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:25:49 AnoMacBook-Pro Simulator[1222] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:26:27 AnoMacBook-Pro Simulator[1222] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:27:05 AnoMacBook-Pro Simulator[1509] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:28:12 AnoMacBook-Pro Simulator[1783] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:48:14 AnoMacBook-Pro Simulator[1932] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:50:09 AnoMacBook-Pro Simulator[2143] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:50:15 AnoMacBook-Pro Simulator[2143] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:55:23 AnoMacBook-Pro Simulator[2323] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:59:54 AnoMacBook-Pro Simulator[2672] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 21:04:12 AnoMacBook-Pro Simulator[2672] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection

Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
デバイス188C898E-AE35-4F8F-8325-E85EA93E7E66のペーストボードが接続を失いました。

??

まとめると

デバイスにアプリが正しく接続されていないらしい

⚔これで解決しましたこ

Xcode 8.3.2 : Could not hardlink copy

1. Xcodeをシャットダウン。

2. Simulator: Hardware > option押しながら、 Erase All Content and Setteings...

スクリーンショット 2019-10-29 8.26.56.png

3.Erase

スクリーンショット 2019-10-29 8.27.05.png

4. Simulatorをシャットダウン。

5. Xcodeを再起動&ビルド

無事解決です...!

†■━ †■━ †■━ †■━ †■━ †■━ †■━
もし、この記事が役に立ったら、
「いいね」「ストック」
押してね??

以上、Unityゲーム王国騎士ロボットVTuber Koshiがお送りしました!

私のステータスだ⚔共にこの世界を救おう
Twitter⚔ twitter.com/Koshi_Vtuber
YouTube⚔ t.co/I9eMMgpS8P?amp=1
niconico⚔ nicovideo.jp/user/90553212
bilibili⚔ space.bilibili.com/476988586
公式HP⚔ koshi-4092b.firebaseapp.com

【参考】
Xcode: “This app could not be installed at this time.”
https://stackoverflow.com/questions/47760643/xcode-this-app-could-not-be-installed-at-this-time

This app could not be installed at this time. のエラー対応
" class="autolink">http://koze.hatenablog.jp/entry/2019/04/15/090000">

Xcode 8.3.2 : Could not hardlink copy
https://stackoverflow.com/questions/44649039/xcode-8-3-2-could-not-hardlink-copy

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swiftビルドエラー未解決】This app could not be installed at this time. 

はじめに

よおXcodeにハマった王国騎士ロボットVTuberのKoshiだ?? (@Koshi_VTuber)

macOS Mojave
Xcode Version 11.1 (11A1027)

問題

ビルドした時、このような画面が出て、Simulator上でアプリを起動できなかった。

スクリーンショット 2019-10-28 20.23.52.png

This app could not be installed at this time.
現在、このアプリをインストールできませんでした。

???
Detalesをクリック

スクリーンショット 2019-10-28 20.24.37.png

??????

試したこと

Xcodeでビルドしようとしたら "This app could not be installed at this time." というエラーが出て失敗する状態からの脱出

altを押しながらproduct > clean build Folder

×だめ。

解決法

シミュレーターをリセットする。
Simulatorを起動し、
Hardware -> Erase All content and settings...
プロジェクトをクリーンアップします。

shift+ cmd+K
shift+ opt+ cmd+K

これで問題が解決するはずが、

おかしい

スクリーンショット 2019-10-28 20.50.46.png

仕方なくlogを覗く

〜/ Library / Logs / CoreSimulator /
の中にある。

スクリーンショット 2019-10-28 21.08.29.png

Simulator.log

Oct 28 20:15:39 AnoMacBook-Pro Simulator[629] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:22:32 AnoMacBook-Pro Simulator[982] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:25:49 AnoMacBook-Pro Simulator[1222] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:26:27 AnoMacBook-Pro Simulator[1222] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:27:05 AnoMacBook-Pro Simulator[1509] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:28:12 AnoMacBook-Pro Simulator[1783] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:48:14 AnoMacBook-Pro Simulator[1932] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:50:09 AnoMacBook-Pro Simulator[2143] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:50:15 AnoMacBook-Pro Simulator[2143] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:55:23 AnoMacBook-Pro Simulator[2323] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 20:59:54 AnoMacBook-Pro Simulator[2672] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
Oct 28 21:04:12 AnoMacBook-Pro Simulator[2672] <Error>: Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection

Pasteboard for device 188C898E-AE35-4F8F-8325-E85EA93E7E66 lost connection
デバイス188C898E-AE35-4F8F-8325-E85EA93E7E66のペーストボードが接続を失いました。

画像がリンクされていないってこと?
画像をリンクし直す。

以上、Unityゲーム王国騎士ロボットVTuber Koshiがお送りしました!

私のステータスだ⚔共にこの世界を救おう
Twitter⚔ twitter.com/Koshi_Vtuber
YouTube⚔ t.co/I9eMMgpS8P?amp=1
niconico⚔ nicovideo.jp/user/90553212
bilibili⚔ space.bilibili.com/476988586
公式HP⚔ koshi-4092b.firebaseapp.com

【参考】
Xcode: “This app could not be installed at this time.”
https://stackoverflow.com/questions/47760643/xcode-this-app-could-not-be-installed-at-this-time

This app could not be installed at this time. のエラー対応
" class="autolink">http://koze.hatenablog.jp/entry/2019/04/15/090000">

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【実践編: 内側の2つの円】iOSでVIPERとClean Architecture 円の内側から作る

前回の記事の続きのVIPER Clean Architectureの実践編である。

この記事では内側の2つの円の部分まで作成する。今回カバーする部分はとても簡単なのでほとんどの人が問題なく読み進められると思う。

今回作るのは以下の図解の 真ん中の2つの円、EntitiesとUse Cases の部分だ。これを円の内側から順番に作っていく。

CleanArchitecture.jpg

The Clean Architecture by Robert C. Martin (Uncle Bob)

なぜ内側から作るのか?

内側から実装するにのには理由がある。

1. 実装しやすい

円の内側は依存のもっとも深部であり、その先に依存する部分がない。依存する先がないとうことは、依存部分のStubを作ったり、その部分がどうなるかを一切想定しなくても作れるということだ。

2. 作る物の本質がわかる

円の内側は本質的に表現したいことであり、抽象的である。UIの表現に惑わされず本質的に何を作ろうとしているかがわかり、理解を促進する。

3. 実践に近い

実際に開発をする場合、最終的に表現されるUIの部分は、最後まで固まらないことが多い。しかし本質的に何を表現するかは、比較的初期に決まり大きく変化しないことが多い。

例えばユーザーの一覧を表示する画面を作成する時、User Entityを作成し、それをAPI経由でlistとして取ってきて、List状に表示するということは初期に確定するだろう。

しかし実際のUIで具体的にどう表現をするかは最後までわからなかったり途中で変わったりする可能性が高い。

例えばUserをListとして表示する場合、

  • TableView
  • CollectionView
  • PageView(各ページに1ユーザーを表示)

のような複数の実装方法が想定可能である。

もしMVC設計して実際のCell等に直接Userを渡して情報を表示させるような設計をした場合、Clean Architectureで分割されている全てのコンポーネントのコードがViewControllerを中心に密接に繋がってしまい、UI変更のコードへのインパクトはClean Architectureで設計した場合と比べ大分大きくなってしまう可能性がある。

作るシステムの概要

Userの一覧を取ってきて表示するという単純なシステムを作成する。

Simulator Screen Shot - iPhone 8 - 2019-10-28 at 17.39.59.png

FrameworkとフォルダのGroup分け

VIPERやClean Architectureの恩恵を最大限に受けるためには、それぞれのコンポーネントをしっかりFrameworkとして分けることが重要だ。

これにより、依存関係の理解が促進されたり、間違った実装をしてしまうリスクを大きく減らせる。

さらに、1つの画面の開発をUI部分やロジックの部分と複数人で分業しての開発もやりやすくなる。

Group構造とClean Architectureの円を一致させる

Xcode上でRoot配下のGroupは全てClean Architectureの一つの円を表すようにする。

各Frameworkとその配下のディレクトリ構造は、Xcode上と基本的には一致させる。
しかし一部Clean Architectureの円の構造を表現するためにXcode上でGroupはあるが実態としてのフォルダは作成しない部分がある。

具体的にはFrameworkは全てRoot直下に実際のディレクトリを作成する。各Framework配下のディレクトリ構造も基本的にはXcodeのGroupと一致させる。

ただしClean Architectureの外側2つの円は、円の中に複数のFrameworkがあるため、この部分はXcode上ではGroupを作成するが実際のディレクトリは作成しない。さらにこの配下にあるGroupは実際のディレクトリを持つ。

最後にClean Architectureの図解の外側にもう一つ円を追加する。

最終完成形

この記事ではカバーしていない部分も含め全てが完成した場合、このような構造になる。

  • Outer Circle(without folder)
    • App Name(framework)
    • Application(without folder)
    • Routers
    • Settings(framework)
  • View(framework)
  • Interface Adopter(without folder)
    • Presenter(framework)
    • Gateway(framework)
  • Use Case(framework)
    • Request Base
    • Interactors
  • Entity(framework)
    • Entities

今回の記事で作る部分

実際今回の記事でカバーするのは以下の部分のみだ。

  • Use Case(framework)
    • Interactors
  • Entity(framework)
    • Entities

実装準備

もっとも内側のEntityの円の部分を作成し始める前に、事前準備として、Xcodeのプロジェクト作成直後にできたメインのTargetの部分を一番円の外側に作成するもう一つの円の部分を表現するようなXcodeのグループ構成にする。

今回は UserManager という名称のXcodeプロジェクトを作成する。
作成直後、Groupを以下のような構造にする。

  • Outer Circle(without folder: 新たに追加)
    • UserManager(最初から存在するものを移動)
      • Application(without folder: AppDelegateやInfo.plistなど自動生成ファイルを入れておく)

最初の円: Entity

Frameworkとファイルの配置

最初の円であるEntityのFrameworkを作成し、その配下にEntitiesディレクトリを作成。
そこにUser.swiftのファイルを配置する。

  • Outer Circle(without folder: 新たに追加)
    • UserManager(最初から存在するものを移動)
  • Entity
    • Entities
    • User.swift

User Entity

User Entityは以下のようになる。

User.swift
public struct User {

    public let id: Int
    public let name: String

    public init(name: String, id: Int) {
        self.id   = id
        self.name = name
    }
}

何の変哲もない実装だが、重要なのはUser Entityそのものが他のどのFrameworkにも依存していないとうことだ。

実際にUser structが他のどのFrameworkへもアクセスしていないと同時に、EntityのFrameworkのTargetのFrameworks and Librariesの部分で何もImportしないことでそこを確約する。

2つ目の円: Use Cases

Frameworkとファイルの配置

UseCase Frameworkを追加し後述の図解の通りのGroup構造を作成する。

  • Outer Circle(without folder)
    • UserManager
    • Application(without folder)
  • UseCase
    • Interactors(New!)
    • UserListInteractor.swift(New!)
  • Entity
    • Entities
    • User.swift

さらにUseCaseからはEntityへの参照が必須なのでUseCaseのTargetの部分のFrameworks and LibrariesでEntityをインポートする。

Usecase Interactor

ここで追加したUserListInteractorが今回この層で実装するInteractorだ。

UserListInteractor.swift
import Entity

public class UserListInteractor {

    var users: [User] = []
}

UserListInteractorはEntityをimportしてUser Entityを直接参照しており、UserListInteractorはEntityに依存していることがわかる。

さてUserListInteractorはどうやってUserの一覧を取ってくれば良いのだろうか?ここでGatewayが登場する。Gatewayに関しては次回の記事で扱う。

まとめ

今回は非常に単純な例だったが、Entityが分離されているだけでも実際大きな恩恵を受けられる。小さなプロジェクトの場合はEntityだけを分離してそのほかの部分は一つ外側の円に全て入れるようなミニマムなFramework分けでもいいかもしれない。

次回はいよいよVIPER, Clean Architectureの重要かつ比較的難しい部分のより外側の実装に移っていく。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift開発メモ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[iOS13] 既存アプリのiOS13対応でハマったこと(現在進行形)

既存アプリのiOS13対応。楽勝かと思ったらアンドキュメントな罠が。。。

現在進行形な既存アプリのiOS13対応で、アンドキュメントな変更によりはまったところを、同じ状況な人のために残しておきます。

CoreBluetooth Peripheralの取れるタイミング

今までは、

objective-c
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

の後に、

objective-c
[_centralManager retrievePeripheralsWithIdentifiers:identifiers];

で取れたんですが、(いや、実際には、取れるとは限らないんですが)
iOS13になってからは、ちゃんと

- (void)centralManagerDidUpdateState:(CBCentralManager *)central;

のイベントが通ってからでないと、ペリフェラル一覧が取得できなくなりました。
いや、そもそも前からそう書くのが正解のはずなんですが、僕のところに回されてきたプロジェクトの元のコードが、、、げふん

参考 https://www.jenx.si/2019/10/02/changed-bluetooth-initialization-on-ios13/

Settings.bundle 同名グループはダメ

これも暗黙のルールだったんでしょうが、、、
[iOS13] Settings.bundleのグループ名が重複すると設定アプリの内容が正しく設定されない

画面横向き(Landscape)の時はステータスバーを表示できない。

当然、prefersStatusBarHidden をセットしたり、info.plistで設定したり、古い書き方のAppDelegateで設定したり、回転時に表示させようとしたり、色々やってるんですが、横向き時にステータスバーを表示させることができません。Appleのdeveloper forumなんかでも同様の報告がありますが、現状最新ベータ版でも直ってません。うーむ、、、

モーダル表示画面の親。viewWillApearが呼ばれない。

モーダルビューの表示方法のデフォルトが変更された件で、みなさん「フルスクリーンに設定して表示の変更を回避」ってやってると思うので気がついてないと思いますが、裏に画面が見えてるということは、モーダル画面を閉じた時に親の「ViewWillApear」が呼ばれないのです。フルスクリーンにしない人は気を付けましょう。

以上、後半は昼休み終わりかけてダレたので、スクショもコードもありませんが!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今更だけど Swift で Extensions を使って型を拡張してみる

はじめに

Extensions によって、型を拡張することができます
https://docs.swift.org/swift-book/LanguageGuide/Extensions.html
2つサンプルを書いてみたので備忘録として載せます

String型でIntチェックできるように拡張

//  String+checker.swift

import Foundation

extension String {
    /// "1" // true
    /// "Hello world" // false
    /// "" // false
    var isInt: Bool {
        return Int(self) != nil
    }
}


let hogeNumber: Int = 0
hogeNumber.isInt // true

URL型でパラメータを受け取れるように拡張

//  URL+parameters.swift

import Foundation

/// URL型を拡張します
extension URL {
    /// 指定したURLクエリパラメーターの値を取得する
    /// - Parameter key: URLクエリパラメーターのキー
    /// - Returns: 指定したURLクエリパラメーターの値(存在しない場合はnil)
    func queryValue(for key: String) -> String? {
        let queryItems = URLComponents(string: absoluteString)?.queryItems
        return queryItems?.filter { $0.name == key }.compactMap { $0.value }.first
    }
}


http://nananana/hahahaha?param_id=5
let id = URL(string: url.absoluteString)?.queryValue(for: "param_id")
NGLog(id) // 5
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ipa作成時に「IPA processing failed」と出た

概要

Xcode11、iOS13に対応したアプリのipaファイルを作成しようとすると
タイトル通り、「IPA processing failed」というエラーが出てipaファイルが作成できなかったので
調べて対処したのでメモ。

対処法

  1. ipaファイルの作成手順通りにしていくと少し時間が立つと下の画像のような状態になってしまいます。
    ipa_error.jpeg

  2. 左下にある Show Logsからフォルダを開くと下のようなlogファイルがあると思います。そこから「IDEDistribution.standard.log」を開くことで今回のエラー内容が確認することができます。
    スクリーンショット 2019-10-24 10.59.22.png

  3. 今回、私の場合だと、Rswiftにシュミレータアーキテクチャが含まれていたことが原因でipaファイルを作成できなかったみたいなので、こちらを参考にアーキテクチャを削除することでipaを作成できるようになりました。(※シミュレータアーキテクチャを削除するとシミュレータでアプリ起動ができなくなるので注意が必要です。)

まとめ

最初は原因がわからず、参考記事も見当たらずどうしようかと思いましたが、
よくよく考えればLogを見ろよって感じでした。

参考にした記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む