20220115のiOSに関する記事は6件です。

別のFirebaseプロジェクトにアクセスしたい場合

この記事を書いた理由 大体のアプリではクラッシュログとかを拾うためにFirebaseを組み込んでいるアプリが多いと思います。その場合は通常アプリ=Firebaseプロジェクトとなっていますが、例えば他のアプリとデータを共有したいとか別のFirebaseのプロジェクトにアクセスしたい場合が発生したので、共有のために貼っておきます。 ニーズが少ないのかあまり情報がなかったので、ちょっと苦労しました。と言っても数時間ではありますが。 やり方 今回は事情があってObjective-Cのコードですが、Swiftの人は置き換えてみてください。 流れとしては、別のプロジェクトを指定するためには、GoogleService-Info.plistをまるっと使います。「OtherApp.plist」とでもリネームしてプロジェクトに取り込んでください。 そして、「OtherApp.plist」へのファイルパスを指定して、FIRAppのインスタンスを作成します。 こんな感じです。 @property (nonatomic, retain) FIRAuth *auth; -(void)setup { // plistのパスを取得 NSString *filePath =[[NSBundle mainBundle] pathForResource:@"OtherApp-Info" ofType:@"plist"]; // plistを指定してFIROptionsを作成します FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath]; // 読み込んだ設定に名前をつけます。 [FIRApp configureWithName:@"OtherApp" options:options]; // 指定した「OtherApp」を指定してFIRAppオブジェクトを作成します FIRApp *app = [FIRApp appNamed:@"OtherApp" ]; // FIRAppオブジェクトを使ってFIRAuthオブジェクトを作成します self.auth = [FIRAuth authWithApp:app]; } 例えば、こんな感じ。 -(void)doHogehoge { [ self.auth signInAnonymouslyWithCompletion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { // 認証後に必要な処理(Firestoreへのアクセスとか)をここで書く }]; } 今回はデータを共有したかったのですが、Analyticsを一つにまとめたいとかにもいいかもしれません。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS】新型コロナ(COVID19)についてのアプリは作ってはいけないって話

今年の年末年始にアプリを作ってAppStoreに公開しようとしたら見事に玉砕したので供養として、またiOSアプリ開発ビギナーが同じ目にあって欲しくないと思い、投稿します。 はじめに 今年の年末年始に新型コロナウイルスについての簡単なアプリを作りました。どのようなアプリかというと、累計感染者数と重症者数、死亡者数等を画面に表示。体調管理や都道府県ごとの感染者数を調べてみることができるというアプリでした。 作成後、AppStoreに提出。次の日にAppStoreConnectで確認するとリジェクトされていました。 リジェクトとその内容 リジェクトされるのは、よくあること(?)なので特に驚きはしませんでした。なんなら、「お!やっぱ来たか」くらい。 問題はその内容 We found in our review that your app provides services or requires sensitive user information related to the COVID-19 pandemic. Since the COVID-19 pandemic is a public health crisis, services and information related to it are considered to be part of the healthcare industry. In addition, the seller and company names associated with your app are not from a recognized institution, such as a governmental entity, hospital, insurance company, non-governmental organization, or university. Per section 5.1.1 (ix) of the App Store Review Guidelines, apps that provide services or collect sensitive user information in highly-regulated fields, such as healthcare, should be submitted by a legal entity that provides these services, and not by an individual developer. Next Steps To resolve this issue, your app must be published under a seller and company name of a recognized institution. If you have developed this app on behalf of such an institution, please advise your client to add you to the development team of their Apple Developer account. If your client does not yet have an Apple Developer account, they can enroll for one as an organization through the Apple Developer website. Resources For additional details, please refer to the update on the Apple Developer website about Ensuring the Credibility of Health & Safety Information. 日本語にすると、以下のような文になります。 私たちは、あなたのアプリがCOVID-19パンデミックに関連するサービスを提供したり、機密性の高いユーザー情報を必要とすることをレビューで発見しました。COVID-19パンデミックは公衆衛生上の危機であるため、それに関連するサービスや情報はヘルスケア産業の一部であると考えられます。また、アプリに関連する販売者や企業名は、政府機関、病院、保険会社、非政府組織、大学など、公認された機関のものではありません。 App Store審査ガイドラインのセクション5.1.1 (ix)により、ヘルスケアなどの規制の厳しい分野でサービスを提供したり、ユーザーの機密情報を収集するアプリは、個人の開発者ではなく、これらのサービスを提供する法人によって提出されるべきとされています。 次のステップ この問題を解決するには、アプリを認知された機関の販売者名と会社名で公開する必要があります。このアプリをそのような機関に代わって開発した場合、クライアントのApple Developerアカウントの開発チームにあなたを追加するよう、クライアントに助言してください。あなたのクライアントがまだApple Developerアカウントをお持ちでない場合は、Apple Developerウェブサイトから組織として登録することができます。 リソース 詳しくは、Apple Developerサイトの「健康と安全に関する情報の信頼性を確保するために」をご参照ください。 はえ〜知らなかった? つまり、「COVID19についてのアプリは公認されている機関ではないとダメ」ということ。個人での開発では問答無用でOUTってことになります。 確かに、ご存じの通り新型コロナのパンデミックは緊急性の高いものなので、個人でバンバン開発できたら根拠のない情報に溢れてしまいますしね。 ガイドラインではどう書かれているか では、リジェクト内容の"Per section 5.1.1 (ix) of the App Store Review Guidelines"の中身を確認してみると、以下のように書かれてました (ix) Apps that provide services in highly-regulated fields (such as banking and financial services, healthcare, gambling, legal cannabis use, and air travel) or that require sensitive user information should be submitted by a legal entity that provides the services, and not by an individual developer. Apps that facilitate the legal sale of cannabis must be geo-restricted to the corresponding legal jurisdiction. 一応、日本語に訳すと以下のように (ix) 規制の厳しい分野(銀行・金融サービス、医療、ギャンブル、合法大麻の使用、航空旅行など)のサービスを提供するアプリや、ユーザーの機密情報を必要とするアプリは、開発者個人ではなく、サービスを提供する法人が提出する必要があります。大麻の合法的な販売を促進するアプリは、対応する法的管轄区域に地理的に制限されなければなりません。 今回、この「規制の厳しい分野」に新型コロナが含まれていることになります。 「規制の厳しい分野」ってなかなかアバウトな表現でわかりにくい気がしますが・・・ では、今後どうするのか? 今回の場合だと、完璧に個人開発なので、何も改善できない事になると思います。お蔵入りです。 4.2 Minimum Functionalityより詰んでます。 もし、会社等で代わりにリリースできるのならなんとかなるかも?そこについては、ご自身の環境などによって変わるので、ご自身の判断に任せます。 最後に 今回、作ったアプリが水の泡にならないように、この記事を書かせていただきました。 結果、私の作ったアプリはお蔵入りという形になりましたが、色々と得るものは技術的にも知識的にも多かったので、個人開発というのは大事であることが痛感させられました。また、ガイドラインはちゃんと読むことが大切であることがよくわかりました。 読みにくい文章でありながら、最後まで読んでいただきありがとうございます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS × アーキテクチャ】iOSにおける、GUI/システムアーキテクチャとは?

目的 GUIアーキテクチャ システムアーキテクチャ についてまとめること 流れ そもそも、アーキテクチャ とは? GUIアーキテクチャ の例 GUIアーキテクチャ とは? システムアーキテクチャ の例 システムアーキテクチャ とは? モバイルアプリ開発における問題点 5を解決するアーキテクチャ 0. そもそも、アーキテクチャ とは? アプリケーションを開発する上で、開発者同士の共通認識を行うためのもの 開発者同士の共通認識とは? → 3つある ① : クラスなどの要素の関係性整理 ② : 伝達順序の整理 ③ : 開発の規則性 根幹にあるものは? Presentation Domain Separation : プレゼンテーション領域の分離 という考え。 「システム本来の関心領域(ドメイン)を、UI(プレゼンテーション)から引き離す」 ということ。 プレゼンテーション( =View ), ドメイン( =Model ) を分けて考えましょうね。 というもの。 ※ プレゼンテーション と ドメイン については、下の補足にて説明があります。 種類(iOSの場合) 一般的にiOSアプリのアーキテクチャと呼ばれているものには、2種類存在する。 GUIアーキテクチャ と システムアーキテクチャ だ。 次の章からは、GUI/システムアーキテクチャについて、採用されているアーキテクチャの例をだしながら説明していく。 (それぞれのアーキテクチャについての説明は、また後日...) 補足 ■ プレゼンテーション・ドメイン とは? プレゼンテーション ( =View ): 「UIに関係するロジック, ユーザーが操作する画面」 どのようにレイアウトを行い、情報を装飾するか を考えている ドメイン ( =Model ): 「アプリケーションのユーザーが思い描く、"システム本来の関心領域"」 情報をどのようにモデリングし処理するか を考えている ■ プレゼンテーション と ドメイン を分けるメリット ・役割が分かれているため、理解しやすい ・それぞれを一つのオブジェクトとして扱えるため、コードの重複を防げる ・複数人での開発で、分業がしやすい ・テストコードが書きやすい 1. GUIアーキテクチャ の例 GUIアーキテクチャには以下のアーキテクチャが含まれる。 MVC :Model-View-Controller Presentation Model パターン (MVC+Presentation Model) MVVM :Model-View-ViewModel MVP :Model-View-Presenter Flux 2. GUIアーキテクチャとは Viewからの視点で、PDSを実践するため際の具体的なレイヤー構造をパターンとして示したもの。 GUIアーキテクチャの "欠点" 「UIか、それ以外か」 という分け方しかできないこと GUIアーキテクチャにおいて、「Model=UIに関係しない処理全て」となってしまう しかし、UIに関係しない処理 の中にも様々な種類が存在する。それを分けることなく、Modelという1つにまとめて考えるのは危険。 以下の2つは、本来 プレゼンテーション・ドメイン どちらにも当てはまらない。しかし、GUIアーキテクチャでは、「ドメイン( =Model )としてひとまとめにされる」 → 役割ごとに分類を行えていない ①:サーバ API からのデータ取得を試 み、そこで発生したネットワークエラーをハンドリングする ②:データをストレージに永続化する」 3. システムアーキテクチャ の例 システムアーキテクチャには以下のアーキテクチャが含まれる。 レイヤードアーキテクチャ Hexagonal Architecture Onion Architecture Clean Architecture 4. システムアーキテクチャ とは? "GUI"アーキテクチャの汎用性を増したもの さらに詳しくいうと、"システム"アーキテクチャは、"GUI"アーキテクチャよりも広い、UIという単位にとらわれることなくシステム全体の構造を示せるもの。 「システムアーキテクチャ > GUIアーキテクチャ」 なぜそう言えるのか? GUIでは行っていない、ドメインの先をどのように分けるのか ということを考えているから。 GUIアーキテクチャは、プレゼンテーションとドメインを分けて考える。 しかし、ここでのドメインとはUIに関係しない処理全てとなる。 「情報をどのようにモデリングし処理するか」を考えているドメイン が、このような曖昧な定義では開発を行う上で、開発者同士の混乱を招きかねない。 そこで、システムアーキテクチャでは、GUIアーキテクチャでは考えない、「ドメインの先でどのようにレイヤーを切り分けるべきか」や「システム全体をどのように接合すべきか」といったものを考える。 5. モバイルアプリ開発における問題点 モバイルアプリ開発における問題点は、「画面遷移」です。 1〜4 では、GUI/システムアーキテクチャについて説明を行った。 しかし、「モバイルアプリ開発においては重要であるにも関わらずどちらのアーキテクチャでもヒントを与えてくれない関心事」があります。 それが 画面遷移 です。 モバイルアプリは、Webアプリ と違い、UIコンポーネントが大きい。操作を指で行うためです。 一画面に多くの情報を載せることが難しく、画面遷移を繰り返すことで快適なユーザー体験を実現した。 しかし、「多くの画面遷移をどう設計するのか」は既存のアーキテクチャでは対処できない問題となっています。 次の章では、それを解決するためのアーキテクチャをいくつか示します。 6. 5を解決するアーキテクチャ Coordinatorパターン と MVVM-C Routerパターン と VIPER Micro View Contrller 参考文献 『iOSアプリ設計パターン』 (電子版: 税込 3200円)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SwiftUIで画面遷移を実装する

環境 Xcode13.2.1 Swift 5.5.2 基本的な画面遷移方法 1. NavigationLink 2. sheet 3. フラグによるViewの切り替え 1. NavigationLink NavigationLinkはiOSの基本的なpush遷移になります。 以下のように実装します。 NavigationLink(destination: 遷移先のView) { 任意のView(このViewをタップすると遷移先に指定したViewに遷移する) } 実装例 Viewのタップで遷移する方法 NavigationLinkの末尾のクロージャに追加したViewをタップすることで遷移するやり方です。 追加したViewは最初からタップ可能になっています。 struct ContentView: View { var body: some View { NavigationView { NavigationLink(destination: SecondView()) { Text("画面遷移") } } } } 遷移元 遷移先 NavigationLinkはNavigationView内に書いていないと画面遷移がされないので注意してください List表示でNavigationLinkを実装したい場合は以下のようにできます。 NavigationView { List { ForEach(users) { user in NavigationLink(destination: UserInfoView(user: user)) { Text(user.name) } } } } isActiveで遷移を判定する方法 Viewを追加して遷移させる以外にも、NavigationLinkにはisActiveという引数を持っており、この値がtrueになった時に画面遷移が実行されます。 以下のコードは、ボタンをタップした時にState変数のshouldShowSecondViewをtrueにしています。 NavigationLinkのクロージャをEmptyView()とすることで、上記で説明していたようなタップで遷移させるためのViewは何も表示されません。 こちらの遷移方法は、何か処理が完了した後に画面遷移させたい場合などに使うことが多い思います。 struct ContentView: View { @State private var shouldShowSecondView: Bool = false var body: some View { NavigationView { VStack { NavigationLink(destination: SecondView(), isActive: $shouldShowSecondView) { EmptyView() } Button { shouldShowSecondView = true } label: { Text("フラグ切替") } } } } } 遷移元に戻る方法 NavigationLinkでの画面遷移は自動的に遷移先に戻るボタンが表示されます。 戻るボタンを使わないコードでの実装は、環境変数dismissを使用します。 struct SecondView: View { @Environment(\.dismiss) var dismiss var body: some View { Button { // 任意の場所で呼ぶ dismiss() } label: { Text("シートを閉じる") } } } 2. sheet sheetは下からViewが表示されるモーダル表示です。 .sheet(isPresented: Binding<Bool>), onDismiss: (() -> Void)? = nil) { 遷移先のView } 引数 isPresented ここに指定した変数がtrueの時に遷移先のViewがモーダル表示されます。 onDismiss シートが閉じる時に実行されるクロージャです。何も処理がない場合は定義する必要はありません 実装例 struct ContentView: View { // 表示フラグ @State private var isShowingView: Bool = false var body: some View { Button { isShowingView.toggle() } label: { Text("シート") } .sheet(isPresented: $isShowingView) { SecondView() } } } 遷移元 遷移先 Buttonにsheetを定義して、タップ処理にisPresentedのフラグを変更する処理を実装しています。 このようにすることでボタンが押された時にtrueになるのでシートが表示されるようになります。 表示フラグに使用する変数は、値の変更を監視できるように@Stateを付けた変数である必要があります。そのため引数のisPresentedに定義する際は$を付与します。 @State private var isShowingView: Bool = false 遷移元に戻る方法 下にスワイプしてシートを閉じる dismissハンドラーを実行する dismissハンドラーはNavigationLinkの戻る実装と同じになります。 3. フラグによるViewの切り替え NavigationLinkなどの画面遷移メソッドは使わずにフラグを用いてViewを出し分ける方法です。 瞬時にViewが表示されるので、アニメーションを付けたい場合は別途実装する必要があります。 実装例 struct ContentView: View { @State private var isShowingView: Bool = false var body: some View { if isShowingView { SecondView() } else { Button { isShowingView.toggle() } label: { Text("フラグ切替") } } } } 今回はSwiftUIの基本的な画面遷移方法についてまとめました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iPhone】一定秒数で切り替わる壁紙スライドショーをつくる【ショートカット】

このショートカットは表面上正常に機能していますが、待機処理に関わるいくつかの問題があります(他のショートカットとの競合が見られます)。 新しいバージョンの記事を公開するまでしばらくお待ちください。本記事は後に削除される可能性があります。 このショートカットは発展途上です。改善に関するアイデアがあればどうかご遠慮なくコメントしてください。 2022年1月19日 本当に普通の壁紙スライドショー この記事は普通の壁紙スライドショーを探していたiPhoneユーザに向けられたものです。iPhone 壁紙 スライドショー とググったときに散見される、オートメーションを利用した擬似的な仕組みではありません。タイムアウトと再帰処理を利用しただけの本当に普通の壁紙スライドショーです。 ショートカットを入手する 上記のスクリーンショットを参考にしてショートカットを作成してください。あるいは、以下のリンクからダウンロードすることができます。 壁紙スライドショー(視差効果オン) 壁紙スライドショー(視差効果オフ) リンク切れなどが原因でダウンロードできない場合には、お気軽にコメントしてください。 バックグラウンドで実行する 手動で実行する場合 ショートカット App から直接実行してください(非推奨)。ただし、ショートカット App をタスクキルするとスライドショーは停止します。 もしくは、ホーム画面にアイコンを追加して実行してください(推奨)。実行時にバナー通知が表示されつづけますが、一度画面をロックしたあとはバックグラウンドで動作します。ホーム画面をタップしてバナーを消すこともできますが、スライドショーは停止します。 この場合も、ショートカット App をタスクキルするとスライドショーは停止します。 バックグラウンドで動作させつづける幾つかの方法 一度、画面をロックする。 ホーム画面の下部から上にスワイプする。 コントロールセンターから別の App を起動する。 “ ??? ????, ???? ???????.” と叫ぶ。 自動で実行する場合 オートメーションを利用してショートカットを実行させてください。 カスタマイズ 待機時間、壁紙のアルバムはご自身の環境や好みに適合させてください。 再帰のベースケースをお好みで追加することをお勧めします。 解説 スクリーンショットを撮影する理由 画面解像度を取得するため オーバレイ用の画像に利用するため 画面解像度を取得するため デバイスの設定 からも画面解像度は取得できますが、何故か実際の値の1/2の数値が返ってきます。 オーバレイ用の画像に利用するため 「壁紙に設定」は約1.142倍中央にズームした画像を壁紙に適用します。この機能は視差効果を有効にする場合には必要ですが、壁紙画像を画面の幅一杯まで拡げたい場合は必要ありません。 この問題は、適用する壁紙のサイズを画面解像度の約1.142倍にすれば解決するようでした。しかし、画像の周囲を黒塗りするなどといった機能はショートカットアプリにはありません。苦肉の策として、約1.142倍したスクリーンショットをオーバーレイ用の下地として利用する手段をとりました。 1.142という倍率はiOS15.2のiPhone11に固有である可能性があります。 注意事項 iPhoneの動作が重くなる、過剰に熱を帯びるなどの症状が発生した場合は、すぐにショートカットを停止してください。 余談 このたびはじめてQiitaに記事を投稿しました。機械翻訳のような文体になりました。トラブルシューティングの際に英語圏のフォーラムを翻訳してばかりだったことが原因かもしれません。 本記事を通じた知見の共有がQiitaコミュニティ(?)の一助になれば望外の喜びです。お読みいただきありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【RealityKit2】Object Captureを試してみよう!

はじめに iOSデベロッパーがObject Captureを試してみました。 ARはやっぱり面白い!と思いましたので、 まずはこの記事を見てとりあえずやってみるか、と思って頂ければ幸いです。 環境 Xcode Version 13.2.1 (13C100) Swift5(コーディングしてないので関係ないですが一応) Mac OS Monterey 15.1 ObjectCaptureとは? MacOS Montereyで追加されたRealityKit2の新機能です。 連続して撮影された写真の画像情報及び深度情報などを用いて、写真から3Dオブジェクト(.usdzファイル)を作成できるという画期的な機能です。 WWDC2021の時に発表された機能で、 ベータの時に悪戦苦闘しながらも当時試したことを思い出します。 手順 ObjectCapture用の連続写真をiPhoneで撮影する。 撮影した連続写真を用いてMacのPhotogrammetryプログラムを実行し、3Dオブジェクトを作成する どちらもAppleからサンプルプログラムが提供されているので、今回はそちらを使って3Dオブジェクトの作成を行います。 必要条件 特にMac側で必要なスペックが高いです。 iPhone 深度情報を用いるのですが、LiDARスキャナを積んでいないiPhoneでも可能です。 ですが、LiDARスキャナを搭載したモデルの方が正確な深度情報の取得が可能なため、結果が異なります。 ※iPadでもOKです。 Mac Macに関してはグラフィック側の要件が厳しく、 ・M1 Mac(もちろんM1Pro/MaxでもOKです) ・Intel Mac の場合は Intel CPU with AMD 4GB以上 が必要です。 AMD GPUを積んでいないIntel Mac(Intel Graphicsのみ)の場合は実行出来ません。 私もWWDC2021の時点ではAMDを積んでいないIntel Macしか持っていなかったので、知人のM1Macを借りて試してました。 ObjectCapture用iPhoneアプリで写真を撮影する 以下のリンクからObjectCaptureで使用するための写真を撮るサンプルアプリがAppleDeveloperサイトからダウンロード出来ます。 https://developer.apple.com/documentation/realitykit/taking_pictures_for_3d_object_capture プロジェクト名は「CaptureSample」です。 実行するとこんな画面になります。 (ベータの時はこんな白枠なんてなかったような、、、改善されていると思います) 右下のボタンで「マニュアルモード」と「自動撮影モード」を切り替えることが出来ます。 ・マニュアルモード:自分でボタンを押して写真を撮っていきます。 ・自動撮影モード:一定間隔でシャッターが切られ、自動で撮影が進んでいきます。 自動撮影モードが個人的には便利で使いやすいと感じました。 撮影する時にはいくつかのコツがあります。 ・オブジェクトが70%以上のオーバーラップを持つように撮影し全アングルから撮影する。(これは必須) ・形状が固形で撮影中に変形しないものが適している。 ・オブジェクトの向きを変える際に、形が変わらないように注意する. ・必要な枚数はオブジェクトの複雑さにより変わるが、多い方が良い。 詳細なコツはApple公式の説明を読むのが一番です。 https://developer.apple.com/documentation/realitykit/capturing_photographs_for_realitykit_object_capture/ 以下は「CaptureSample」のヘルプ画面ですが、そこにも記載されています。 いざ撮影してみます!!が、ここが一番大変かもしれません。 ・反射して影が出来ないように照明のセッティングが必要 ・背景は一貫した背景が望ましい。 などなど、推奨した条件を満たすのはきちんとした環境を整えないと難しいです。 ということで一旦、上記を無視して、対象を以下の水筒にして床に置いて撮影してみます。 撮影すると以下のようにフォルダ分けされて保存されます。 以降はMacでの作業になるのでファイルアプリなどからAirDropなどを使ってMacに送ります。 ※それぞれのフォルダが一つのプロジェクトで使用する画像群になっています。 連続写真を用いてMacのPhotogrammetryを実行し3Dオブジェクトを作成する 写真から3Dオブジェクトを作成するのをPhotogrammetryと呼ぶのですが、Photogrammetryのコマンドラインサンプルアプリを以下のAppleDeveloperサイトからダウンロードします。 https://developer.apple.com/documentation/realitykit/creating_a_photogrammetry_command-line_app しかしながら、macのコマンドラインプロジェクトを作ったこと・使ったことが無いiOSデベロッパーの当方は実行方法がわからないので、以下の方法でやりました。 それは、プロジェクト実行時のSchemeで必要なパラメータを渡してやる方法です。 コマンドラインサンプルアプリに必要なパラメータは以下です。 ・入力ファイル(連続写真)のフォルダのパス ・出力ファイルのパス 以下のような形で設定し、実行すればプログラムは走ります。 追記:コマンドラインアプリの実行方法2 こちらが正規の手順になります。 コマンドラインアプリをビルドするとXcodeのプロジェクトフォルダに実行ファイルが追加されます。 ・デバッグの場合 /Users/(現在のユーザー名)/Library/Xcode/DerivedData/(プロダクト名)-(ランダムな識別子)/Build/Products/Debug ・リリースの場合 /Users/(現在のユーザー名)/Library/Xcode/DerivedData/(プロダクト名)-(ランダムな識別子)/Build/Products/Release 上記フォルダの中に実行ファイルが生成されています。 単純に実行した場合、以下のようにinputフォルダとoutputフォルダを指定しろと怒られます。 OVERVIEW: Reconstructs 3D USDZ model from a folder of images. USAGE: hello-photogrammetry <input-folder> <output-filename> [--detail <detail>] [--sample-ordering <sample-ordering>] [--feature-sensitivity <feature-sensitivity>] ARGUMENTS: <input-folder> The local input file folder of images. <output-filename> Full path to the USDZ output file. OPTIONS: -d, --detail <detail> detail {preview, reduced, medium, full, raw} Detail of output model in terms of mesh size and texture size . (default: nil) -o, --sample-ordering <sample-ordering> sampleOrdering {unordered, sequential} Setting to sequential may speed up computation if images are captured in a spatially sequential pattern. -f, --feature-sensitivity <feature-sensitivity> featureSensitivity {normal, high} Set to high if the scanned object does not contain a lot of discernible structures, edges or textures. -h, --help Show help information. Saving session... ...copying shared history... ...saving history...truncating history files... ...completed. [プロセスが完了しました] なのでターミナルから実行します。 なお実行形式は以下のようになっています。 ./HelloPhotogrammetry <input-folder> <output-filename> 今回の場合は以下で実行しました(schemeでやった時と同じフォルダ指定) nonakajun@MacBook-Pro Debug % ./HelloPhotogrammetry /Users/nonakajun/work/xcode/AR/ARCaptureImage/input/suitou2 /Users/nonakajun/work/xcode/AR/ARCaptureImage/output/suitou3.usdz 得られる結果は同じです。 以上、ここまで追記でした。 結果として出力された3Dオブジェクト(.usdzファイル)が以下です。 こちらはgifです。 推奨条件を無視して適当に撮影した写真からでも、デコボコではありますが、3Dオブジェクトの生成が出来ました!! 床ともしっかり分離されたオブジェクトが出来ます。 ちなみにAppleのDeveloperサイトでナイキの靴の連続写真とそこから作成した3Dオブジェクトを見ることが出来ます。 https://developer.apple.com/jp/augmented-reality/object-capture/ 環境を整えるとこんなにも綺麗な3Dオブジェクトを写真から作ることが可能です。 最後に ObjectCaptureはやってみて非常に面白いです。 あとはARオブジェクトを表示する簡単なアプリでも作って人に見せるなどすると、結構感動してもらえますよ! Macのコマンドラインはしっかり勉強して正攻法のやり方で出来るようになったら加筆したいと思います。 追記しました。 初Qiita投稿で至らない点、間違っている点などあるかと思いますが、是非ご指摘頂ければ幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む