tag:blogger.com,1999:blog-80677322125122619152024-03-06T10:39:13.123+09:00アプリ開発ブログ(仮)雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.comBlogger226125tag:blogger.com,1999:blog-8067732212512261915.post-5746117421438306652021-04-11T13:22:00.003+09:002021-04-11T13:22:35.668+09:00Google AdMobで、Info.plistの入力項目が増えた<p> AdMob SDK8.3.0をインストールしようと<a href="https://developers.google.com/admob/ios/quick-start?hl=ja">公式ガイド</a>を見て進めていたら、<a href="https://galakutaapp.blogspot.com/2021/02/google-admob.html">先日8.0の時</a>にはなかったInfo.plistに追加する項目がいっぱい増えていて驚いた。</p><p><span style="font-family: courier;">SKAdNetworkIdentifier</span>として<span style="font-family: courier;">cstr6suwn9.skadnetwork</span>という値を追加することは以前と同じだが、それ以外にも現時点39個もの<span style="color: red;">「SKAdNetworkItems キーの値を Google に提供したその他の購入者」なるものを選択して入力せよ</span>というのだ。もうなんのこっちゃいである。</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcRLk3-7aKg45ALq8M1Xmg_Ydf8GTrMTK51x7KBNbV1MBfadhDQVBH9dW6qxi9VgZ3U_jGgw4bPWIePWdW_XKAmK_SkvmJmgOBPpzLVmrNsObGXCxJpc88ZJuESPJh6RtuKCbyjDUicW8/s902/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2021-04-11+13.19.15.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="533" data-original-width="902" height="378" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcRLk3-7aKg45ALq8M1Xmg_Ydf8GTrMTK51x7KBNbV1MBfadhDQVBH9dW6qxi9VgZ3U_jGgw4bPWIePWdW_XKAmK_SkvmJmgOBPpzLVmrNsObGXCxJpc88ZJuESPJh6RtuKCbyjDUicW8/w640-h378/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2021-04-11+13.19.15.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">AdMobのスタートガイドより</td></tr></tbody></table><br /><p><span></span></p><a name='more'></a>リストが出てくるページを見るとAmazonとかFacebookとか出てくるので企業名なのだろうが、他は目にしたことのない名前ばかり。<p></p><p>選択して入力といっても、当然コードサンプルをコピペして不要なものを消すしかないわけだが、何が不要かもわからないのでそのまま全部使うことにした。Info.plistをSource Codeとして開いて追加すればすぐだし。</p><p>でもまあ意味がよくわかんないよね。AdMobに広告を載せる代理店みたいなものの一覧なのかね?</p>雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com1tag:blogger.com,1999:blog-8067732212512261915.post-17446360286851716892021-02-16T23:02:00.004+09:002021-04-11T13:22:52.387+09:00Appのプライバシーの入力が必須になる<p> Apple Developerからメール(当然英語)でも来てたけど、2020/12/8からApp Storeでアプリを公開、アップデート時などに新たに「Appのプライバシー」という項目を入力する必要ができた。</p><p>アプリを使う上で、いろんな情報を収集してるか/してないか、しているならそれはどんな情報で、何のために収集してるか…ってことを入力するわけ。</p><p><span></span></p><a name='more'></a>プライバシーに関してうるさくなる昨今、しょうがないとは思いつつも、めんどくせーとも思うわけだ。<p></p><p>俺のアプリの場合、せいぜいAdMob広告のSDKが若干の情報を収集しているだけなので、それについて選択肢から選ぶこととなる。</p><p>以下のページを見て入力した。少し数が多く手間だけど、そんなに難しくはない。</p><p></p><ul style="text-align: left;"><li><a href="https://developers.google.com/admob/ios/data-disclosure">AdMobの公式サイトでのお知らせ</a></li><li><a href="https://zenn.dev/kazushige/articles/9afa10b36d6828">AdMob利用時の「Appのプライバシー」の入力方法虎の巻</a></li></ul><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnumeGXjSSi0AyY8yQ402PwRaCGa3y_ma_AITwbA8a9JXXQCto0GcynGJAlAKmk61GOXwIvsGVsrpqfcvsoxWhJTa4LcEAAqtv1Gf1sQY12ZJ8TY-GKrSN69BXgLsrhoRmWEvj0w5BAno/s1206/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2021-02-16+22.13.27.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="663" data-original-width="1206" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnumeGXjSSi0AyY8yQ402PwRaCGa3y_ma_AITwbA8a9JXXQCto0GcynGJAlAKmk61GOXwIvsGVsrpqfcvsoxWhJTa4LcEAAqtv1Gf1sQY12ZJ8TY-GKrSN69BXgLsrhoRmWEvj0w5BAno/w640-h352/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2021-02-16+22.13.27.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUyPD9Oz0ISHJ9o05thCzeh8vR2Hp1TFktqFRRycEuKN0UwZFC6u_PVuOfr7lbQkgeItiYsTKd6bIodzo859C0070Uk1sGvoPYx0X0kFSUUi6wF6ixBF3OUvmReBToQ4fjojgwC5skJbU/s810/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2021-02-16+22.20.05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="810" data-original-width="612" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUyPD9Oz0ISHJ9o05thCzeh8vR2Hp1TFktqFRRycEuKN0UwZFC6u_PVuOfr7lbQkgeItiYsTKd6bIodzo859C0070Uk1sGvoPYx0X0kFSUUi6wF6ixBF3OUvmReBToQ4fjojgwC5skJbU/w484-h640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2021-02-16+22.20.05.png" width="484" /></a><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiRLU8TVg9OJF-WxruGGh6EfsPb3eky90U_qqP4r51g_U0MGNXXBT3uSWKmK-ywXuRx_v0Hnk-mlG2L6kNnn5i9HSghHX7Pl0ovpe8bEvYmCdWN52IYbuNhK_SThIyDXI8ZMtJLqeD90I/s1174/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2021-02-16+22.23.07.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="875" data-original-width="1174" height="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiRLU8TVg9OJF-WxruGGh6EfsPb3eky90U_qqP4r51g_U0MGNXXBT3uSWKmK-ywXuRx_v0Hnk-mlG2L6kNnn5i9HSghHX7Pl0ovpe8bEvYmCdWN52IYbuNhK_SThIyDXI8ZMtJLqeD90I/w640-h478/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2021-02-16+22.23.07.png" width="640" /></a></div></div><br /><p><br /></p>雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-74382136334315452312021-02-07T01:31:00.004+09:002021-04-11T13:23:15.349+09:00Google AdMobの仕様がいつの間にか変更されてた<div>過去にObjective-Cで書いたアプリを久しぶりにメンテしようと思い、AdMobのSDKを最新の8.0.0に上げた。(注意:7.69.0でも同じ問題出てほっといたもの)</div><div>ところが起動してタイトル画面が出てすぐにスレッドエラーだかが出て止まってしまった。<br />公式のインストールガイドどおりにやってるのだがダメ。</div><div><br /></div><div>インストールするFrameworkも少し増えてるし、公式ガイドで<span style="font-family: courier;">GoogleMobileAds.framework</span>となってるのがダウンロードしたフォルダでは<span style="font-family: courier;">GoogleMobileAds.<span style="color: red;">xc</span>framework</span>になっていて戸惑ったが、後者をそのままインストールしていいようだ。</div><div><br /></div><div><span><a name='more'></a></span>後述するとおり<span style="font-family: courier;">GADBannerViewDelegate</span>が細かく変更されてたようで、それを直して<span style="color: red; font-family: courier;">⌘+Shift+k</span><span style="font-family: inherit;"><span style="color: red;"> でクリーンビルド</span>したらエラーが消えてくれた。</span></div><div>クリーンビルドするまで何やっても動かなかったんで、<b>これ重要!</b></div><div><span style="font-family: inherit;"><br /></span></div><div>んで、以下のように画面サイズに応じてバナーの横幅を指定してやるんだって。</div><div><p style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;">//新しいアダプティブバナーのコードが以下(AdMob公式より)</p>
<p style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;"><span style="color: #2b839f;">CGRect</span><span style="color: black;"> frame = </span><span style="color: blue;">self</span><span style="color: black;">.</span><span style="color: #2b839f;">view</span><span style="color: black;">.</span><span style="color: #2b839f;">frame</span><span style="color: black;">;</span></p>
<p style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;">//iOS11.0以上の時の処理</p>
<p style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;"><span style="color: blue;">if</span> (<span style="color: blue;">@available</span>(iOS 11.0, *)) {</p>
<p style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;"><span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span>frame = </span>UIEdgeInsetsInsetRect<span style="color: black;">(</span><span style="color: blue;">self</span><span style="color: black;">.</span>view<span style="color: black;">.</span>frame<span style="color: black;">, </span><span style="color: blue;">self</span><span style="color: black;">.</span>view<span style="color: black;">.</span>safeAreaInsets<span style="color: black;">);</span></p>
<p style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;">}</p>
<p style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;"><span style="color: #2b839f;">CGFloat</span> viewWidth = frame.<span style="color: #2b839f;">size</span>.<span style="color: #2b839f;">width</span>;</p>
<p style="background-color: white; color: #a31515; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;"><span style="color: green;">//バナーサイズ設定</span></p>
<p style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; margin: 0px;">adMobBanner<span style="color: black;"> = [[</span>GADBannerView<span style="color: black;"> </span>alloc<span style="color: black;">]</span>initWithAdSize<span style="color: black;">:</span>GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth<span style="color: black;">(viewWidth)];</span></p></div><h2 style="text-align: left;"><span style="font-family: courier;">GADBannerViewDelegateが変わってた</span></h2><div><span style="font-family: courier;">これまで</span></div><div><span style="font-family: courier;">- (void)<span style="color: red;">adView</span>DidReceiveAd:(GADBannerView *)bannerView</span></div><div><span style="font-family: courier;">とやってたのが、</span></div><div><span style="font-family: courier;"><b>- (void)<span style="color: red;">bannerView</span>DidReceiveAd:(GADBannerView *)bannerView</b></span></div><div><span style="font-family: courier;">になってる。(これが現在の正解ね)</span></div><div><span style="font-family: courier;"><br /></span></div><div><span style="font-family: courier;">細かく言うと、AdMobの<a href="https://developers.google.com/admob/ios/banner?hl=ja#objective-c_4">リファレンスサイト</a>でもサンプルコードが</span></div><div><span style="font-family: courier;">- (void)<span style="color: red;">adView</span>DidReceiveAd:(GADBannerView *)<span style="color: red;">adView</span></span></div><div><span style="font-family: courier;"><span style="caret-color: rgb(255, 0, 0);">などと書かれてたり、いろいろ混在している。</span></span></div><div><span style="font-family: courier;"><span style="caret-color: rgb(255, 0, 0);">いつ頃変わったのかわかんないけど、こういうのもメンテナンスしてほしいよな。いい給料もらってる天才ばかり集まってるだろうに。</span></span></div><div><span style="color: red; font-family: courier;">adView</span><span style="font-family: courier;">DidReceiveAdでもエラーもWarningも出ないし、コード入力時のサジェストも出ないからわからんわ。</span></div><div><span style="font-family: courier;"><br /></span></div><div><span style="font-family: courier;">ということで、delegate関係は全部<a href="https://developers.google.com/admob/ios/api/reference/Protocols/GADBannerViewDelegate">SDKのページ見て</a>直したわ。</span></div>雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-1840790088649939672020-10-02T13:54:00.003+09:002021-04-11T13:23:33.376+09:00iPhoneバッテリー交換手順<div style="text-align: left;"> 2018年に買ったiPhone8のバッテリーがヘタってしまったので交換する。</div><span><a name='more'></a></span><div style="text-align: left;"><br /></div><div style="text-align: left;"><ol style="text-align: left;"><li>設定/バッテリー/バッテリーの状態で確認</li><ol><li>「お使いのバッテリーは著しく劣化しています」とのこと。うちのは最大容量83%だって</li></ol><li>すぐ下の「サービスオプションについ…」をタップするとAppleのサポートサイトに飛ぶ</li><li>「電話番号をご連絡ください。Appleサポートからお客様に今すぐお電話いたします。」をタップ</li><li>配送修理のページに飛び、Apple IDに登録済みの製品一覧が出るので、対象のiPhoneを選択。専門の業者が引き取りに来てくれる日時を指定</li><ol><li>折り返しの電話はなく、iMessageとメールで確認があったのみ</li></ol><li>事前にバックアップを取る</li><li>「iPhoneを探す」をOFF</li><li>「メッセージ」(iMessage)をOFF</li><li>確認メールが届く</li><ol><li>「Apple Pay と Suica カードを組み合わせてお使いの場合は、アカウントの残高が 0 円になっていることを確認してください。」</li><ol><li>修理/機種変の場合、WalletアプリでSuicaを一時iPhoneから削除すればいいと。残高はiCloudに情報が残るので、新機種で再登録すれば簡単に戻るって</li></ol><ol><li><span style="background-color: #fcff01;"><a href="http://appsuica.okbiz.okwave.jp/faq/show/1537?category_id=66&site_domain=default">Suica | Pay</a>公式ページ</span>。Suica ID番号が変わる場合があるって</li></ol></ol><li>本体以外送らないので、事前に取り外すもの</li><ol><li><b>SIMカード</b></li><li>外箱、保護ケース、保護フィルムなど</li></ol></ol></div><div style="text-align: left;"><br /></div><div style="text-align: left;">他のクレジットカードも削除しておいた方がいいのかな?</div><div style="text-align: left;">現時点、消費税込みで5940円だった。</div><div style="text-align: left;">5〜7日で終わるという。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">中のデータは全部消えるという。</div><div style="text-align: left;">パスコードとTouch IDでロックはしてあるけど、バックアップ取ったら中身全部消去しておいた方がいいようだ。Appleの場合は新品と交換してくることもあり得るし。(<a href="https://support.apple.com/ja-jp/HT201557" style="background-color: #fcff01;">デバイスを配送する場合(配送修理)</a>)</div><h3 style="text-align: left;">グチ</h3><div>おととし買ったiPhone8なんだけど、iOS13にアップデート後からバッテリーの減りが早くなった印象で、Suica使って旅行中、たしか30%くらいから急に切れて改札出られなくなったことがあった。それ以来旅行時は外部バッテリー必須。</div><div>そしてこないだiOS14になってからさらにひどくなり、radikoとカメラちょっと使っただけで1時間ももたずに切れてしまった。ツイッターやる程度ですぐ100 → 60 → 30とかなってまた切れちゃったり。</div><div>もっと前に買ったiPad Air2は全然平気なのに、こんなに早くヘタるのかな? ハズレのバッテリーを引いちゃったのかもしれないけど、OSメジャーアプデのたびにヘタるのはなんか納得いかない。</div><h2 style="text-align: left;">返ってきた</h2><div>土曜の夕方引き取りに来てもらったiPhoneだが、月曜に「受領しました。修理開始します」とのメールが来て、火曜日午前中にもう返ってきたよ。早い。</div><div>ちゃんと最大容量100%になってる。良かった良かった。</div><div><br /></div><div>Macから復元する際パスワードを求められたけど、AppleIDのと別設定だったため戸惑った。覚えておいて良かった。</div><div><br /></div><div>メールはサーバ内に残ってるメールがずらずら読み込まれて1000件以上未読ができた。これはOS再インストールしたりすると時々起きる。</div><div>要するに未読、既読、削除なんかの情報がサーバ上にない。だから同じApple IDの各機種間でそれらが共有できてない。いちいち全ての機種でメール削除するのめんどくさいんだよね。</div><div>IMAPサーバを使えばいいらしいが、使ってるniftyは有料サービスなんでやめた。</div>雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-42991527473082315842020-05-05T03:16:00.001+09:002021-04-11T13:23:47.939+09:00Xcode以外でAppStoreにアップロードする<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_kTSxWP-AM4-Ohmj1WaV-Gse34k8B7MfrpKduUxaFQ0dmBp6PCXAdLZlZa18zl3GHnJiSds_rIB8LUb0i5GNoUN9dfSr1VbnABbF8BeKdST5LKWCDIwtNkBUQ8oSI7SEmEDihuFCyR9E/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2020-05-05+3.12.57%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="809" data-original-width="995" height="520" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_kTSxWP-AM4-Ohmj1WaV-Gse34k8B7MfrpKduUxaFQ0dmBp6PCXAdLZlZa18zl3GHnJiSds_rIB8LUb0i5GNoUN9dfSr1VbnABbF8BeKdST5LKWCDIwtNkBUQ8oSI7SEmEDihuFCyR9E/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2020-05-05+3.12.57%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mac App Storeより</td></tr>
</tbody></table>
久しぶりにいじっててApp Store Connectにアクセスして気付いたんだけど、Xcode以外にもAppStoreにアプリをアップする方法があるんだな。<br />
<div>
<span><a name='more'></a></span>App Store Connectのアプリリリース時の設定画面からの<a href="https://help.apple.com/app-store-connect/#/devb1c185036">ヘルプへのリンク</a>で以下のものが挙げられてる。</div>
<div>
<ul>
<li>Xcode</li>
<li>altool(コマンドライン)</li>
<li>Transporter(Mac用専用アプリ)</li>
</ul>
<div>
上2つはいいんだけど、<a href="https://apps.apple.com/jp/app/transporter/id1450874784?mt=12">Transporter</a>なんてアプリが出てるの知らなかった。アプリだけじゃなく、ミュージック、映画、テレビ番組、ブックをそれぞれのStoreに送信できるんだって。</div>
</div>
<div>
使い方はドラッグ&ドロップだけだとか。本来Xcodeでもこれくらい簡単になるべきだけどね。アップロード前にValidateとか、いろいろ必要でめんどいじゃん。</div>
<div>
失敗すると嫌だから当面は勝手知ったるXcode使うけどさ(笑)</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-44336388093256462222019-11-29T13:05:00.002+09:002021-04-11T13:24:04.388+09:00Blenderで3Dモデルを作ってXcodeで使う無料だけど高機能な3DアプリのBlender。ARなんかで表示させるモデルを作りたくて勉強してる。<br />
<br />
細かい使い方、作り方はともかく、Xcodeに取り込んで使う旨で引っかかった点、気づいた点を書く。<br />
<h3>
<span><a name='more'></a></span>Xcodeに適したフォーマット</h3>
Xcodeに持ってきて使うにはCOLLADA(.dae)というフォーマットにエクスポートするのがいい。<br />
<h3>
座標軸が異なる</h3>
<div>
Blenderは左右方向がX軸、奥行き方向がY軸、上下がZ軸。</div>
<div>
Xcodeでは左右方向がX軸、上下がY軸、奥行き方向がZ軸になる。</div>
<div>
そのままXcodeに読み込むと90度補正する必要があるようなので、Finderで拡張子.scnassetsのフォルダを作り、それをXcodeのプロジェクトにadd。そこに.daeのファイルを入れてやるようにすれば「Always use the Y-up axis」というチェックがオンになって自動補正してくれるようだ。</div>
<h3>
モディファイアは「適用」する</h3>
円から作ったモデルはそのままだと厚みの情報がないのか、マテリアルで色をつけても、書き出しても変なところが透けて見え、非常に奇妙な表示になってしまう。<br />
あらかじめ「厚み付け」モディファイアを「適用」させておく必要がある。<br />
<h3>
ライトと色</h3>
Xcodeに持ってくるにあたって、Blenderのデフォルトで付いているライトを削除した場合、Xcode上であらためてライトを追加しないとかなり暗く表示されてしまう。<br />
当然と言えば当然なのだが、マテリアルの色を赤とか青とか原色にしておくと、ライトがなくても明るく表示されるので不思議。<br />
ライトを追加した後も、ライトのColorを白くし、Intensity値をかなり上げないといけない場合も。<br />
ライトの種類はomniが一番自然な発色のようで、物体の裏側に影ができる。<br />
ambientは均一な光で色はちょっと不自然だが、物体の裏側に影ができない。<br />
こういうのは組み合わせて使うといいのかな? この辺はまだ勉強中。雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-37426877510335580372019-11-27T22:34:00.000+09:002020-05-05T00:57:42.218+09:00Xcodeアップデート時のトラブル(ファイルが消えない)Xcode11.0がリリースされた時だったと思うんだけど、Xcode10.xからの自動アップデートが途中で止まってしまう現象に悩まされた。<br />
Xcode10.xを削除してから新規で11.0をインストールするといいと聞き、ゴミ箱を空にしようとしたものの、Xcodeが使用中だから空にできないとつれないお返事。<br />
<br />
Xcodeのパッケージを開き、中のファイルを少しずつ消していったところ、かなり深い改葬にあった<br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>GameCenterUIService.app</b></span><br />
というアプリが悪さしていることがわかり、これだけを取り出したところ、他のXcodeのファイルは全て空にでき、Xcode11.0は無事インストールできた。<br />
<br />
しかし、このファイルだけがどうしても消せない。<br />
このアプリのパッケージを開くと、<br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>ca.lproj</b></span><br />
というフォルダの中に<br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>InfoPlist.strings</b></span><br />
があるだけ。<br />
中身は<br />
<div style="background-color: white; font-stretch: normal; line-height: normal;">
<span style="font-size: 14px;"><span style="font-family: "courier new" , "courier" , monospace;"><b>bplist00— _ CFBundleDisplayNameo Servei d UI del Game</b></span></span></div>
<div style="background-color: white; font-stretch: normal; line-height: normal;">
<span style="font-family: "courier new" , "courier" , monospace;"><b><span style="font-size: 14px;"> Cente</span><span style="font-size: 14px;">r</span></b></span></div>
<div style="background-color: white; font-stretch: normal; line-height: normal;">
<span style="font-size: 14px;"><span style="font-family: "courier new" , "courier" , monospace;"><b> ! Z</b></span></span></div>
<div>
とだけ書かれてる。</div>
<div>
<br /></div>
ちなみにファイル名をコピーしようとするとなぜか勝手に「InfoPli<span style="color: red;">ót</span>.strings」に名前が変わり、「名前を変更しようとしています。」というパスワードを求めるダイアログが出ることがある。これもわけがわからない。<br />
<br />
ca.projフォルダからInfoPlist.stringsを取り出して捨てようとしても、<br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>いくつかの必要な項目が見つからなかったため、操作を完了できません。</b></span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>(エラーコード-43)</b></span><br />
と出てゴミ箱にすら入れられない。<br />
<div>
別のフォルダに移動させようとするとコピーされる。(コピーされたものは捨てられる)</div>
<div>
<br /></div>
<div>
macOS 10.15 Catalinaをセーフブートして試してもダメ。</div>
<div>
今のところゴミ箱が空にできないだけでさしたる問題はないが、解消されてもいない。<br />
<h2>
結局クリーンインストールで解決</h2>
</div>
<div>
このためにやったわけじゃないんだけど、システムがかなり不安定だったんでクリーンインストールしたら、さすがにゴミ箱を空にできた。</div>
<div>
お疲れ様でした。ちゃんちゃん。</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-12234518641572441232019-10-10T12:58:00.000+09:002019-10-10T12:58:15.174+09:00ダークモードの回避<div class="separator" style="clear: both; text-align: center;">
<img border="0" data-original-height="800" data-original-width="450" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg7rHfUnRu-a5felER0tVazW-fLNPireO8sbnpt8V4IIRk8ylGl-HD_Fzdt6ppijfDj8Rbw4TRA-bbBPcfmKZ-2F8Qa_8d6dYj2ZlqUTITKz7EYQxt8Xyn_d2LCW87VIvDlZrUxYsBStE/s400/IMG_2541%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" width="225" />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrY1L9oHz9q6_frSz1G_4bY7Qy-UqRZ2gie8iLqPWgKn-zylgAHCB9dz8mHsoasuFMX9tXe5gusoQ4AI8wZh3Ahx4CEzv0m6SaAKDXw7t7MV4WMXu_FXI8o5iPTlqkHMhqiZPE-pYoMZA/s1600/IMG_2542%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" imageanchor="1" style="text-align: center;"><img border="0" data-original-height="800" data-original-width="450" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrY1L9oHz9q6_frSz1G_4bY7Qy-UqRZ2gie8iLqPWgKn-zylgAHCB9dz8mHsoasuFMX9tXe5gusoQ4AI8wZh3Ahx4CEzv0m6SaAKDXw7t7MV4WMXu_FXI8o5iPTlqkHMhqiZPE-pYoMZA/s400/IMG_2542%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" width="225" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: 0.9em;">左が正常なのに、ダークモードだと右の表示になる</span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: 0.9em;">Labelの文字が白くなり、TextViewの背景が真っ黒に</span></div>
<br />
<div>
iOS13とXcode11、macOS 10.15 Catalinaにした後にアプリを審査に出したら、表示が見づらいからってリジェクトされた。</div>
<div>
なんじゃこりゃ、TextViewの背景色なんていじった覚えないぞ!? と思ったが、iOS13から付けられた(余計な)機能、ダークモードのせいだった。</div>
<div>
どうやら新しく提出したアプリから影響するらしい。</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMpl0rcD0GLkpkcSMMGW1laihYVLEYDdbyhluDTb9PB6qO6FSSLKKgf5g2qAMSdHQ2ISB46xwhBJ8Ii4L1cKhxjAREjo5PvfXiXYER3cFv-epfMHf-p_ne7Z_i8Ze2_hL_pISGCti-_jE/s1600/IMG_2540%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="800" data-original-width="450" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMpl0rcD0GLkpkcSMMGW1laihYVLEYDdbyhluDTb9PB6qO6FSSLKKgf5g2qAMSdHQ2ISB46xwhBJ8Ii4L1cKhxjAREjo5PvfXiXYER3cFv-epfMHf-p_ne7Z_i8Ze2_hL_pISGCti-_jE/s400/IMG_2540%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" width="225" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbayNVhkYXSDpdhI-GJz3VCp2xxNDmBazijpS31n-mWR2p5MevXoOUEdpZkj4lw5fVHLqP2j84dUxlfAe3zkh_j7DvzOBw0Wjw6OjbjpBU4lqyo-tYsffjJHJs2JYOA2zk8A3KdP7zuNM/s1600/IMG_2539%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="450" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbayNVhkYXSDpdhI-GJz3VCp2xxNDmBazijpS31n-mWR2p5MevXoOUEdpZkj4lw5fVHLqP2j84dUxlfAe3zkh_j7DvzOBw0Wjw6OjbjpBU4lqyo-tYsffjJHJs2JYOA2zk8A3KdP7zuNM/s400/IMG_2539%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" width="225" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-size: 0.9em;">UISegmentedControlの色もこのとおり</span></div>
<h2>
回避方法</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLZCAc-BI1185ycIWDaWR0ImNP_UFsQeeKbGlnpg73IbMpSvapNaXFctnFIuW29e2NF5hPrH_oojRnQh9zJqvM1ZwHcY-0YV_f7pCY-F_oIkIE5yDxBS-zU4A4NQFuq_W4gTeHBIv_AFg/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-10-10+12.23.10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="64" data-original-width="421" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLZCAc-BI1185ycIWDaWR0ImNP_UFsQeeKbGlnpg73IbMpSvapNaXFctnFIuW29e2NF5hPrH_oojRnQh9zJqvM1ZwHcY-0YV_f7pCY-F_oIkIE5yDxBS-zU4A4NQFuq_W4gTeHBIv_AFg/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-10-10+12.23.10.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Info.plistのUser Interface Style を Light にすればアプリ丸ごとこれまでのライトモードで動いてくれる。</div>
<div>
親方様(アップル)としてはダークモードへの対応を推奨してるんだろうけど、また今度ね!</div>
<div>
しかしどうしてこう、いちいちデベロッパーに無理な負担を強いるかなあ…。</div>
<div>
</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-1246779925183942272019-10-02T19:17:00.003+09:002019-10-02T19:18:18.424+09:00ARAnchorの追加と削除以下はARKit3とSpriteNodeで作る、XcodeのARのテンプレート(AR空間にインベーダー👾の絵文字スプライトを表示させるやつ)を基に直したもの。<br />
<h2>
ARAnchorの追加</h2>
<div>
Scene.swiftの方でARAnchorの位置を決めて</div>
<div>
<span style="background-color: white; font-family: "menlo"; font-size: 14px;">sceneView.</span><span style="background-color: white; color: #2b839f; font-family: "menlo"; font-size: 14px;">session</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">.</span><span style="background-color: white; color: #2b839f; font-family: "menlo"; font-size: 14px;">add</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">(anchor: )</span></div>
<div>
すると、ViewControllerのARSKViewDelegateメソッド</div>
<div>
<span style="background-color: white; color: #0f68a0; font-family: "menlo"; font-size: 14px;">view</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">(</span><span style="background-color: white; color: blue; font-family: "menlo"; font-size: 14px;">_</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;"> view: </span><span style="background-color: white; color: #2b839f; font-family: "menlo"; font-size: 14px;">ARSKView</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">, nodeFor anchor: </span><span style="background-color: white; color: #2b839f; font-family: "menlo"; font-size: 14px;">ARAnchor</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">) -> </span><span style="background-color: white; color: #2b839f; font-family: "menlo"; font-size: 14px;">SKNode</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">?</span></div>
が呼ばれるので、そこで貼りたいSpriteNodeをreturnしてやると、それがAnchorに貼られるという変則的なやり方になっている。<br />
<div>
実際にどうやってanchorにspriteを貼ってるのかは知らない。<br />
<h3>
Scene.swift</h3>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
//カメラ前方の位置にSpriteを表示するためのanchorを貼る</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">func</span> <span style="color: #0f68a0;">addAlienAnchor</span>(sceneView: <span style="color: #2b839f;">ARSKView</span>) -> <span style="color: #2b839f;">Void</span> {</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">if</span> <span style="color: blue;">let</span> currentFrame = sceneView.<span style="color: #2b839f;">session</span>.<span style="color: #2b839f;">currentFrame</span> {</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: blue;">var</span><span style="color: black;"> translation = </span>matrix_identity_float4x4<span style="color: black;"> </span><span style="color: green;">//世界座標と向きを表す4*4の行列</span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//前方の多少ランダムな位置を決定</div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//行列の3列目のz値に-0.4なら前方0.4m</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> x:<span style="color: #2b839f;">Float</span> = 0</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> y:<span style="color: #2b839f;">Float</span> = 0</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> z:<span style="color: #2b839f;">Float</span> = -4</div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>translation.<span style="color: #2b839f;">columns</span>.3.<span style="color: #2b839f;">x</span> = x</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>translation.<span style="color: #2b839f;">columns</span>.3.<span style="color: #2b839f;">y</span> = y</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>translation.<span style="color: #2b839f;">columns</span>.3.<span style="color: #2b839f;">z</span> = z</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//カメラの向いてる方向に対しての表示位置を計算</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> transform = <span style="color: #2b839f;">simd_mul</span>(currentFrame.<span style="color: #2b839f;">camera</span>.<span style="color: #2b839f;">transform</span>, translation)</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//セッションに新しいARアンカーを追加</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> anchor = <span style="color: #2b839f;">ARAnchor</span>(transform: transform)</div>
<div style="font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="background-color: white; white-space: pre;"> </span><span style="background-color: yellow;">sceneView.<span style="color: #2b839f;">session</span>.<span style="color: #2b839f;">add</span>(anchor: anchor)</span> <span style="background-color: white; color: green;">//sceneViewのsessionにアンカー追加</span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//アンカー追加によってViewControllerのdelegateが呼ばれる</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<br /></div>
<h3>
ViewController.swift</h3>
<div>
引数anchorがこれからspriteを貼るanchor。</div>
<div>
<br /></div>
<div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">func</span> <span style="color: #0f68a0;">view</span>(<span style="color: blue;">_</span> view: <span style="color: #2b839f;">ARSKView</span>, nodeFor anchor: <span style="color: #2b839f;">ARAnchor</span>) -> <span style="color: #2b839f;">SKNode</span>? {</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="caret-color: rgb(0, 128, 0); color: green;">//省略するが、ここにAnchorに貼りたいSpriteNodeを作り、returnで返す</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">return</span> spriteNode</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
}</div>
<h2>
ARAnchorの削除</h2>
</div>
<div>
新たなARAnchorを貼るとき、または貼るSpriteNodeを作った時、anchorを管理用の変数に入れておき、削除が必要になったらそれを削除すると、それに貼り付いているSpriteNodeもろとも削除される。</div>
<div>
<div style="color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="background-color: yellow;">sceneView<span style="color: black;">.</span>session<span style="color: black;">.</span>remove<span style="color: black;">(anchor: anchor)</span></span></div>
<div>
<br /></div>
貼る時も削除する時も、sceneView.sessionに対してのメソッドを使ってるわけだ。</div>
</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-39919355675232681372019-10-02T12:46:00.001+09:002019-10-02T12:48:38.963+09:00ARKitのカメラの露出を変えたい(今は無理っぽい)以下は最新のiOS13、ARKit3でのお話。今後のことは知らん。<br />
<h2>
やりたいこと</h2>
<div>
夜の外とか暗いところでARKitで撮影すると、普通のカメラ撮影に比べてやたら暗いので、露出がコードから変えられないものか。</div>
<h2>
調べる</h2>
<div>
最初に、今のところ調べた結果ではカメラの撮影設定(オートフォーカスとかも)をいじれるAPIは公開されていないようだ。</div>
<div>
<br /></div>
<div>
明るい所ではシャッター速度を変えて露出を調節しているようだが(絞りまで変えているかは知らない)、暗い所ではスローシャッターの限界が1/60秒みたい。</div>
<div>
ちなみにARカメラのシャッター速度は以下のコードでわかる。</div>
<div>
<br /></div>
<div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">if</span><span style="color: black;"> </span><span style="color: blue;">let</span><span style="color: black;"> currentFrame = </span>sceneView<span style="color: black;">.</span>session<span style="color: black;">.</span>currentFrame<span style="color: black;"> {</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> 露光時間 = 1 <span style="color: #2b839f;">/</span> currentFrame.<span style="color: #2b839f;">camera</span>.<span style="color: #2b839f;">exposureDuration</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: #2b839f;">print</span>(<span style="color: #a31515;">"露光時間 1/</span>\(露光時間)<span style="color: #a31515;">"</span>)</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<br /></div>
たとえば晴れた昼間カーテンをした部屋の中だと1/60や1/90、青空だと1/4484、太陽に向けると1/10000。暗い押入れに向けた場合1/60だった。</div>
<div>
あんまりスローシャッターにすると手ぶれで物体の検出に影響するから制限してるっぽい? ISO感度も変更しない?</div>
<div>
<h2>
結論</h2>
</div>
<div>
今は無理っぽい。</div>
<div>
あんまり暗い場所での使用は推奨されないんだろうな。ARanchorにSprite貼って表示させても、距離感が狂うせいか勝手に大きさが変わったり、消えちゃうことも。</div>
<div>
暗闇に浮かぶ宇宙人や幽霊を表現したいんだが、別のやり方考えなきゃダメか?</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-12817073508628923872019-09-28T10:37:00.001+09:002019-09-28T10:37:32.048+09:00バージョン表記にご注意以前リリースしたものが些細なバグを治したものだったのでVersion 1.01だったのね。<br />
んで、今度リリースするのを1.1にしてXcodeからvalidateかけたらエラーが出やがった。Invalid Bundleだって。前のよりも高い数字を入れろっていう。<br />
<br />
前のが1.0.1のつもりだったんで、1.1ならいいだろうと思ったんだけど、よく考えたら1.01と1.1じゃ数学的には同じだな。AppStoreConnectでは単なる文字列としてじゃなく数字として見てるみたい。<br />
一応公式にはメジャーバージョン・マイナーバージョン・些細な修正みたいな感じで数字を作れって推奨してるようだ。1.2.10みたいに。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8RVrlg8LBfvrYOgyuk0xwZWioQ_vsnZI6YpqPdDwMGdTwrvyYR80lHuCEtZJ2Y9UuXcoEh_D7O8Lv4IEvPzf-0amwaoSFbGrdFN8Ttv23-tcaARYwJfHIpgjKtLt0Ws_4kXJN67iov0s/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-28+10.32.31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="182" data-original-width="598" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8RVrlg8LBfvrYOgyuk0xwZWioQ_vsnZI6YpqPdDwMGdTwrvyYR80lHuCEtZJ2Y9UuXcoEh_D7O8Lv4IEvPzf-0amwaoSFbGrdFN8Ttv23-tcaARYwJfHIpgjKtLt0Ws_4kXJN67iov0s/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-28+10.32.31.png" width="640" /></a></div>
AppStoreConnectじゃもうversion1.1として新バージョンを作り始めちゃってて、それを消したりバージョンを変えたり変更ができない。<br />
しょうがないからXcodeのプロジェクトのVersionを1.1.1にしたらvalidateもuploadも通って、一応審査には出せた。<br />
最終的に審査でリジェクトされるかもしれないけど、様子見。<br />
<br />
もし1.01と1.1を本当に同じものとして見てるなら、1.1でBuildナンバーを1.01の時より増やせば行けるかもしれない。もしリジェクトされたら試すー。<br />
<br />
って言うか、誤った情報の取り消しや編集をさせろよ…💢雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-3068601349331212592019-09-26T23:36:00.002+09:002019-09-28T10:39:05.180+09:00iOS13はモーダル画面表示が変更された<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpaXQO6YxqU0QxlFOC7KFCA1FwerZmP6T2akHXZF6GepI8aga2pdXa6A5UGKbCpl6xx9L4bDbrpjH9dmpNElDvlV7ELi8w-gOu3hXdevPfTyBRCr0A72r0q1rivykthT0-OPScv-0W-9Y/s1600/IMG_2462.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1136" data-original-width="640" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpaXQO6YxqU0QxlFOC7KFCA1FwerZmP6T2akHXZF6GepI8aga2pdXa6A5UGKbCpl6xx9L4bDbrpjH9dmpNElDvlV7ELi8w-gOu3hXdevPfTyBRCr0A72r0q1rivykthT0-OPScv-0W-9Y/s400/IMG_2462.PNG" width="225" /></a></div>
<br />
iOS13はモーダル画面を表示する際、全面を覆うのではなく上の一部に隙間を残し、指で下にスライドすると画面が閉じるような仕様になった。<br />
これは強化されたマルチタスクを扱う際の変更じゃないかと思うんだが、デフォルトがこれなので、iOS13 & Xcode11であらためてビルドすると今までのアプリもそうなってしまうようで困る。<br />
<br />
直し方は簡単で、vcに遷移先のViewControllerが入っているとすると、以下のようにプロパティ <span style="background-color: white; color: #2b839f; font-family: "menlo"; font-size: 14px;">modalPresentationStyle</span> に <span style="background-color: white; font-family: "menlo"; font-size: 14px;">.</span><span style="background-color: white; color: #2b839f; font-family: "menlo"; font-size: 14px;">fullScreen </span>を指定するだけでいい。<br />
<br />
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;">vc.</span>modalPresentationStyle<span style="color: black;"> = .</span>fullScreen</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">self</span>.present(vc, animated: <span style="color: blue;">true</span>, completion: <span style="color: blue;">nil</span>)</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<br /></div>
簡単はいいけど、これをデフォルトにしなくてもいいじゃねえかって思うんだけどね。よけいな作業増やしやがって。雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-69456495279943152792019-09-26T17:55:00.001+09:002019-09-26T17:55:21.813+09:00iOS13でAVAudioPlayerが落ちるようになった以下のようなコードでBGMやSEを鳴らすアプリをリリースしてたのだが、iOS13にアップデートしたら音を鳴らす所で落ちるようになってしまった。<br />
もっと詳細には <span style="background-color: white; color: blue; font-family: Menlo; font-size: 14px;">try</span><span style="background-color: white; font-family: Menlo; font-size: 14px;"> </span><span style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px;">player</span><span style="background-color: white; font-family: Menlo; font-size: 14px;"> = </span><span style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px;">AVAudioPlayer</span><span style="background-color: white; font-family: Menlo; font-size: 14px;">(contentsOf: url) </span>で<br />
<span style="background-color: white; font-size: 14px;"><span style="font-family: Menlo;"><b>Thread 1: EXC_BAD_ACCESS (code=1, address=0x48) - broken with </b></span></span><br />
というエラーコードで落ちた。リリースしていたアプリが落ちるのだから、iOS13のせいだ。<br />
<br />
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">import</span> UIKit</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">import</span> AVFoundation</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<br /></div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">class</span><span style="color: black;"> </span><span style="color: #0b4f79;">ViewController</span><span style="color: black;">: </span>UIViewController<span style="color: black;"> {</span><span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: blue;">var</span><span style="color: black;"> </span><span style="color: #0f68a0;">player</span><span style="color: black;"> = </span><span style="color: #2b839f;">AVAudioPlayer</span><span style="color: black;">()</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: blue; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>override<span style="color: black;"> </span>func<span style="color: black;"> </span><span style="color: #0f68a0;">viewDidLoad</span><span style="color: black;">() {</span></div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: blue;">super</span><span style="color: black;">.</span>viewDidLoad<span style="color: black;">()</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">do</span> {</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">if</span> <span style="color: blue;">let</span> audioPath = <span style="color: #2b839f;">Bundle</span>.<span style="color: #2b839f;">main</span>.<span style="color: #2b839f;">path</span>(forResource: <span style="color: #a31515;">"BGM"</span>, ofType: <span style="color: #a31515;">"mp3"</span>) {</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> url = <span style="color: #2b839f;">URL</span>(fileURLWithPath: audioPath)</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">try</span> <span style="color: #2b839f;">player</span> = <span style="color: #2b839f;">AVAudioPlayer</span>(contentsOf: url)</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>} <span style="color: blue;">catch</span> {</div>
<div style="background-color: white; color: #a31515; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: #2b839f;">print</span><span style="color: black;">(</span>"ERROR"<span style="color: black;">)</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: blue;">self</span><span style="color: black;">.</span>player<span style="color: black;">.</span>play<span style="color: black;">()</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
}</div>
<div>
<br /></div>
<div>
調べたところ、頭でインスタンス変数として宣言している</div>
<div>
<span style="background-color: white; color: blue; font-family: Menlo; font-size: 14px;">var</span><span style="background-color: white; font-family: Menlo; font-size: 14px;"> </span><span style="background-color: white; color: #0f68a0; font-family: Menlo; font-size: 14px;">player</span><span style="background-color: white; font-family: Menlo; font-size: 14px;"> = </span><span style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px;">AVAudioPlayer</span><span style="background-color: white; font-family: Menlo; font-size: 14px;">()</span></div>
を<div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">var</span><span style="color: black;"> </span><span style="color: #0f68a0;">player</span><span style="color: black;">:</span>AVAudioPlayer<span style="color: black;">!</span></div>
とoptionalにしたところ、落ちなくなった。</div>
<div>
<br /></div>
<div>
変数作る際に初期化コードを書いても初期化されなくなる仕様変更があったんだろうか? そうなるとAVAudioPlayer以外でも同じ問題出てくる?</div>
<h2>
参考サイト</h2>
<div>
<ul>
<li><a href="https://stackoverflow.com/questions/57813428/thread-1-exc-bad-access-code-1-address-0x48-broken-with-ios13-1-dev-build">stackoverflow: Thread 1: EXC_BAD_ACCESS (code=1, address=0x48) - broken with iOS13.1 (dev build 2)</a></li>
</ul>
</div>
<div>
<br /></div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com2tag:blogger.com,1999:blog-8067732212512261915.post-90795673946513266602019-09-22T15:12:00.001+09:002019-09-22T15:12:10.907+09:00Xcode11リリース2019/9/20にiPhone用にiOS13が、1日遅れの顰蹙でXcode11がそれぞれリリースされた。<br />
iPadの方は新しくiPadOSになるということで、リリースはもうちょっと後らしい。<br />
iOS13はダークモードがある以外は見た目にはあまり変化がない。<br />
<br />
以下、とりあえず気づいた点だけ。<br />
<h2>
デバイス欄にiPhone、iPadに加え、Macが!</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgGI8t3gJUsXuM5-WLm8_SvQ8-hfsi733KUF7WXY1L5IKZfEoL0pkRkZ5YJQXjwCDgDV9pJNp_eK6-yP0c4TLTmTUwFox8Thdr00LcgVEiOF-eMAjGxVjbiKzVpl84FMGPmp9kYxBFQl4/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-22+15.06.05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="665" data-original-width="740" height="574" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgGI8t3gJUsXuM5-WLm8_SvQ8-hfsi733KUF7WXY1L5IKZfEoL0pkRkZ5YJQXjwCDgDV9pJNp_eK6-yP0c4TLTmTUwFox8Thdr00LcgVEiOF-eMAjGxVjbiKzVpl84FMGPmp9kYxBFQl4/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-22+15.06.05.png" width="640" /></a></div>
<div>
<br /></div>
<div>
iPadOSとmacOSで共通のアプリを作れるような話もあるが、まさかmacOS 10.15 Catalinaにしたら一本のコードでiPhone、iPad、Macで共通のアプリなんて作れたりする?</div>
<div>
それとも表示されてるだけで、iPadOSかmacOS用のテンプレートじゃなきゃここがenableにならんか?</div>
<h2>
SwiftUI</h2>
<div>
これまでのAutoLayoutのStoryboardとプロジェクトを作る段階で選択になる。</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHHLW7MBt4XbGrtt6tWe_G1aUaEZtz7v1p5VoWPxS6dHg16xesyNWj9XS4IzdE64abyfGo-OlMIXy1y5YSao-RGxuH2qMYRGpPViMhuKB4jyfrw9Zrub8hblfA9IPlmYD2P1M4VLxNBXU/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-22+12.40.58.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="542" data-original-width="743" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHHLW7MBt4XbGrtt6tWe_G1aUaEZtz7v1p5VoWPxS6dHg16xesyNWj9XS4IzdE64abyfGo-OlMIXy1y5YSao-RGxuH2qMYRGpPViMhuKB4jyfrw9Zrub8hblfA9IPlmYD2P1M4VLxNBXU/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-22+12.40.58.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">作成時、User Interfaceのメニューで選択</td></tr>
</tbody></table>
<div>
<br /></div>
ひな形からプロジェクトを作成するとこれまでのViewControllerの代わりにSceneDelegate.swift、ContentView.swiftというファイルが作られている。<div>
<br /></div>
<div>
SceneDelegateはUIWindowSceneの状態が変化した時のdelegateメソッドが並んでる。これがUIViewControllerのviewDidLoadとかの代わりになるのかはよくわからん。</div>
<div>
<br /></div>
<div>
ContentViewの方が実際に画面デザインのコードを記述するファイルとなるようだ。</div>
<div>
中に書かれたContentView構造体はSwiftUI用のviewプロトコルを継承した構造体の定義になっている。まだよくわかんないけど、ここに書くってことさえ覚えときゃいいか。</div>
<div>
<br /></div>
<div>
SwiftUIを勉強しようとしたのだが、コードと1対1のプレビューが出てこない。これ<span style="color: red;">MacもCatalinaに上げないといけない</span>んだって(今はβだけ)。リリースまでおあずけ。コードを試すだけしかない。</div>
<div>
<br /></div>
<div>
単にAutoLayoutのconstraints設定を新しくするようなものでなく、UI部品の配置までコードとともに見えるようになるわけだな? ActionやOutletの接続はどうなるのやら。プレビューが見られるようになった場合、segueで繋がれたViewController同士の関係性とか見られるのかね?</div>
<div>
Storyboardと併用できないようなので、早めに覚えてしまいたい。</div>
<div>
詳しいことがわかったら勉強がてら別にまとめる。</div>
<div>
<h2>
ボタンアイコンを大量に搭載</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE3Q-oUsIQ-D3RTJNKGoueKp0FBr4oKosRure0tiN60Vfh1Mc0r5cZ7xfWI53B-0nDdYp7j1fHuVBEksMdU7ZUSUw8tvqs_l0aulHh1PhEePQlg7d-cL1ara8PxrHMKLsMFSSHDCj2gTE/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-22+14.07.24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="718" data-original-width="846" height="543" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE3Q-oUsIQ-D3RTJNKGoueKp0FBr4oKosRure0tiN60Vfh1Mc0r5cZ7xfWI53B-0nDdYp7j1fHuVBEksMdU7ZUSUw8tvqs_l0aulHh1PhEePQlg7d-cL1ara8PxrHMKLsMFSSHDCj2gTE/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-22+14.07.24.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Storyboardで右上の「+」ボタン(UI部品を選ぶ所)を押すとボタンなどのアイコンデザインが大量に出てくる。今までほんの少ししか搭載されておらず、あとは自作するしかなかったシステムアイコンだが、ようやくこれで統一が図れる。</div>
<div>
StoryboardにドラッグするとImageViewとして貼られる。名前を指定すればコード中からも使える。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9DBN4cn3vmQz0fOFf8dFKip2AXha0vfVJTJA6gNkLgrekt9Yd4OT9cbgvgHgGw4FaGSPZu8vdGJx00YDfQewyH6fCLL0rG6i3xyaKVpS5B5qttbWGc-paNyoLCyiiw5IEmKE0XdIj83U/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-22+14.16.42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="653" data-original-width="261" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9DBN4cn3vmQz0fOFf8dFKip2AXha0vfVJTJA6gNkLgrekt9Yd4OT9cbgvgHgGw4FaGSPZu8vdGJx00YDfQewyH6fCLL0rG6i3xyaKVpS5B5qttbWGc-paNyoLCyiiw5IEmKE0XdIj83U/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-09-22+14.16.42.png" width="251" /></a></div>
<div>
<br /></div>
<div>
Swift UIを選択した場合は「+」ボタンの中にこの一覧がないんだが、別に見られるのかしら? まあ、UIButtonとかのImage名を入れるとこのメニューに名前が出てくるけどね。</div>
<div>
アイコン画像サイズは最小しかない?</div>
</div>
<div>
<h2>
RealityKit</h2>
<div>
ARのテンプレートにRealityKitというContent Technologyが選択できるようになった。</div>
<div>
RealityComposerというXcode内のアプリを使ってARに表示する物を編集できるようなのだが、まだよくわからない。</div>
<div>
テンプレートをそのままRunするとタッチした正面に3Dの立方体を1個表示するアプリができる。</div>
<div>
Composerでその質感とかを変えられるようなのだが、変えるとエラーが出るのでよくわからん。</div>
</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-52586819005916854502019-09-17T11:35:00.000+09:002019-09-17T11:38:51.308+09:00LaunchImage(スプラッシュ画面)の大きさは適切に様々なサイズの画面に対応させるべく、StoryboardのAutoLayoutを設定していても、シミュレータや実機で画面上下が黒帯になってしまうことがある。<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqRzJF-M15uCtFGqneQ6exSyFMSntTzbHOFuprMv5Bww2v8rg_JRtlJZYt_bSosq1I3UkNkODtlATj-ZuKM6YuO8lOF2gNuZMkcOEd5OyjvOxM_5lutzVl4xAI_wNO_fmweD1e13VfI2w/s1600/Simulator+Screen+Shot+-+iPhone+Xs+Max+-+2019-09-15+at+10.32.19%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="800" data-original-width="369" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqRzJF-M15uCtFGqneQ6exSyFMSntTzbHOFuprMv5Bww2v8rg_JRtlJZYt_bSosq1I3UkNkODtlATj-ZuKM6YuO8lOF2gNuZMkcOEd5OyjvOxM_5lutzVl4xAI_wNO_fmweD1e13VfI2w/s400/Simulator+Screen+Shot+-+iPhone+Xs+Max+-+2019-09-15+at+10.32.19%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%2592%25E3%2582%259A%25E3%2583%25BC.jpg" width="183" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">iPhone8とかじゃきれいに表示できたのに、iPhoneXじゃこのとおり</td></tr>
</tbody></table>
これはLaunchImage(スプラッシュ画面とも。要するに起動時に表示される画像)の設定が未対応のため。<br />
これをLaunchScreen.storyboardできちんとAutoLayoutのConstraintsを設定してやればいい。<br />
AutoLayout未対応の頃のアプリだとLaunchScreen.storyboardがないが、New FileのUser InterfaceにLaunch Screenがあるから、それを追加すればいい。<br />
あとはTARGETS / General / App Icons and Launch Imagesの Launch Screen Fileを今作ったLaunchScreenにしてやる。雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-14111054504952035132019-08-20T18:17:00.000+09:002020-05-08T15:06:19.383+09:00ギャンブルアプリのレーティングと、韓国でのアプリ販売について2019/8/20にアップルからメールが来たので、日本語に要約しておく。(自分用なので、内容が正確とは限りません)<br />
<br />
<blockquote class="tr_bq">
韓国で販売するアプリについて、より多くのアプリを利用できるようにした。<br />
また子供への安全対策として、頻繁に強烈なギャンブルを模した内容のものは、2019年8月20日以降に全ての国と地域でR17レーティングになる。<br />
以下の条件を一つ以上満たす場合、韓国のApp Storeでは19歳以上への販売となる。<br />
8月20日以降、App Store Connectのゲーム格付けおよび管理委員会から格付け番号を入力する必要があり、アプリは今週後半に公開される。格付け番号を持ってない場合は、今すぐ申し込みむこと。→韓国の格付け番号取得のためのサイトへのリンクらしい<br />
<ul>
<li>年齢が17歳以上のカジノサブカテゴリのアプリ</li>
</ul>
<ul>
<li>次のコンテンツの説明の少なくとも1つで頻繁/強烈が選択されたゲームまたはエンターテイメントカテゴリのアプリ:</li>
</ul>
<ul>
<li>模擬ギャンブル</li>
</ul>
<ul>
<li>性的なコンテンツまたはヌード</li>
</ul>
<ul>
<li>アルコール、タバコ、または薬物の使用または参照</li>
</ul>
<ul>
<li>リアルな暴力</li>
</ul>
評価分類番号を入力するには:<br />
<ol>
<li>App Store Connectにサインインします。</li>
<li>大韓民国の可用性の下にあるアプリ情報セクションで、評価分類番号を入力する。</li>
<li>レビューのためにアプリを送信する。</li>
</ol>
</blockquote>
よくわからんのだが、ギャンブルとかが世界的に17歳以上対象になり、韓国はさらに厳しく19歳以上になったということか?<br />
韓国はゲームを販売するのにも許可(管理番号を取る?)が必要みたいな話もあるみたいだし、よくわからんのよね。雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-83906597261901467892019-08-08T23:13:00.000+09:002019-08-08T23:15:37.841+09:00App-ads.txtってなんじゃ?(まだよくわからねえ)GoogleのAdMobを広告サービスとしてアプリに組み込んでいるのだが、App-ads.txtのサポートを開始するというメールが来た。なんだそれは?<br />
<br />
調べたところ、よくわからないのだが、アプリデベロッパー(自分のこと)のサイト(iOSのアプリなら、AppStoreにサポートサイトとして登録してるサイトのことのようだ)にアップするテキストファイルで、これによって広告が不正使用されることを防ぐらしい。<br />
詐欺対策。表示された広告料がアプリデベロッパー以外に不正に横取りされてしまうのを防ぐ?<br />
偽の広告枠が表示されることを防ぐ。<br />
広告枠が広告事業者より認定されたものかどうか<br />
<br />
DSPがアプリ内の広告枠に入札する際、デベロッパーのサイトを確認し、正式に認証されている広告事業者のみの入札を受け付ける…そうだ。わかんねえ。<br />
<br />
アプリの広告の仕組みがよくわかってないんでさっぱりわからんのだが、要は怪しげで詐欺まがいな広告が表示されないよう、承認されてる広告事業者の情報を持ってるファイルっぽい。<br />
広告料が横取りされないようにということだけど、たとえば「アプリがウィルスに感染してるよ! 駆除するならこの(怪しげな)アプリをダウンロードなう!」とかいうよくあるやつなんかも排除してくれるんだろうか?<br />
<br />
Googleの説明じゃ、まず「IABが提供するAuthorized Sellers for Apps 仕様書にそってapp-ads.txtファイルを作れ」って書いてあるんだけど、<a href="https://www.iabtechlab.com/wp-content/uploads/2019/03/app-ads.txt-v1.0-final-.pdf">仕様書が英語</a>で、しかもなんだかわかんねえんだよ。<br />
<br />
DSP(デマンドサイドプラットフォーム):よくわからんが、Googleとかが提供してるネット広告サービスのプラットフォームことか?<br />
IAB(インタラクティブ・アドバタイジング・ブリュー/インタラクティブ広告協会):ネット広告とかの協会だろうな<br />
<br />
<br />
<br />
とりあえず、今の所は絶対実装しなければ広告表示されないといった類のものではなく、「変な広告が出てせっかくの広告料を受け取れない」ことがあってもいいなら設定不要かもしれない。<br />
ちょっと様子見る。雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-46632879882927484722019-06-26T10:20:00.000+09:002019-06-26T18:10:55.175+09:00デバイスがロックされてると出て実機確認できない<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">Xcode cannot launch アプリ名 on 〇〇のPhone because the device is locked.</span></blockquote>
<br />
Xcode9になったあたりから、上記のようなメッセージが表示されて実機確認できないことが増えた。<br />
iOSの設定 / 一般 / リセット / 位置情報とプライバシーをリセット してやり、デバイスを繋ぎ直すと治る。<br />
しかし、MacのiTunesが起動して「このコンピュータを信頼しますか?」みたいなやり取りをすることになるし、その後もリセットされた内容についてアプリごとにいちいち「フォトライブラリにアクセスしようとしています。許可しますか?」「位置情報を利用しようとしています。許可しますか?」と再回答しなければならず、面倒くさい。<br />
<br />
他のやり方として、Xcodeの Window / Devices and Simulators でConnectedにあるデバイスを右クリックし、Unpair Deviceし、再度つなぎ直すと、デバイスの方で「信頼しますか?」メッセージとかは出るけど、Macの方はこれ以上作業が必要ないので少し便利。<br />
<br />
根本的な原因はXcodeのバグだろうから、アップルが治してくれないとどうしようもない。雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-80459898427265148242019-06-24T14:54:00.000+09:002019-06-24T14:54:19.297+09:00Xcode10になったらFrameworkがnot foundになったSwift3の時代に作ったソースを久しぶりにXcodeで開いたら、Bridging-Header.hで#importしてるTwitterKit3.4.0とOpenCVがnot foundと表示されるようになってしまった。<br />
リリースしてるアプリだから当然動いてたし、この間いじった覚えもないため、原因としてはXcode10になったくらいしか心当たりがない。<br />
<br />
かなり試行錯誤し、結局は プロジェクトの<br />
TARGETS / Build Settings / Search Paths / Framework Search Paths<br />
がおかしかったことがわかった。<br />
読んで字のごとくFrameworkを検索するPathを書くところだが、<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$(inherited)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">$(PROJECT_DIR)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">$(PROJECT_DIR)/Twitter-Kit-iOS</span><br />
<br />
などとなっていたのを<br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">$(inherited)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">$(PROJECT_DIR)/Twitter-Kit-iOS</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">$(PROJECT_DIR)</span><br />
<br />
と順番を入れ替えたところ治ってくれた。<br />
外部Frameworkをプロジェクトにaddすると勝手に新しい pathを追加してくれるみたいなんだが、関係ないpathも消した。<br />
そのディレクトリになければ順番に下に書かれたディレクトリまで検索してくれそうなもんだけど、うまくいかないようで。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPya2XMdwNQS6AOcvMuJXjTQtLjpQHb8KS6N83x8qaxr2aZHYQfstFr7nVhmOX1WNVKuPS2tbwa8bcxMCBAngZAzO18kU986ZQFbH5qzvYj-ts6gKLei5XgYAT2pPHQydwUPSGYtRrN_Y/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-24+14.43.09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="244" data-original-width="351" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPya2XMdwNQS6AOcvMuJXjTQtLjpQHb8KS6N83x8qaxr2aZHYQfstFr7nVhmOX1WNVKuPS2tbwa8bcxMCBAngZAzO18kU986ZQFbH5qzvYj-ts6gKLei5XgYAT2pPHQydwUPSGYtRrN_Y/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-24+14.43.09.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
なお、実際のフォルダの階層は以上のようになってる。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmez3bWbcrQFtGC9NT3EvfdCk8012K1ioe6GAJ2fxcBpFAxQDDReCxOCwriP_6p6CxZUF3lQ725LK2-slRp4tyqaPYVQwBlmJGxouLVj0VLEKEubsJBhAjWq6nLckRJ6da1NHx7RKlzY/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-24+14.44.32.png" imageanchor="1"><img border="0" data-original-height="212" data-original-width="253" height="335" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtmez3bWbcrQFtGC9NT3EvfdCk8012K1ioe6GAJ2fxcBpFAxQDDReCxOCwriP_6p6CxZUF3lQ725LK2-slRp4tyqaPYVQwBlmJGxouLVj0VLEKEubsJBhAjWq6nLckRJ6da1NHx7RKlzY/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-24+14.44.32.png" width="400" /></a></div>
<div class="separator" style="clear: both;">
プロジェクトへのaddは以下のようにした。</div>
<div class="separator" style="clear: both;">
アップル純正のが入ったFrameworksフォルダとかもあるけど、直下に入れろみたいな情報も見たのでその通りにしてみてる。</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
ところでビルドできない致命的エラーは消えたけど、以下のようなWarningが一個出て消えない。</div>
<div class="separator" style="clear: both;">
<span style="font-family: Courier New, Courier, monospace;">/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</span></div>
エラー個所は<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">explicit</span> <span style="color: blue;">module</span> TwitterCore.Private {</div>
<div class="separator" style="clear: both;">
</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
}</div>
とだけ書かれたところ。とりあえず動きゃいいか。<div>
<br /></div>
<div>
TwitterKitはもうサポートが終了されてしまったのでこれからはSwifterというのに乗り換えた方が良さそう。</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-82262154938569913202019-06-20T15:52:00.000+09:002019-06-20T15:52:59.127+09:00Swift3のDispatch semaphore同期処理や非同期処理などを制御する仕組み。<br />
<a href="http://galakutaapp.blogspot.jp/2016/09/dispatchsemaphore.html"><span id="goog_762345725"></span>Objective-C<span id="goog_762345726"></span></a>と書き方がだいぶ変わったみたいなんでまとめる。<br />
まだよくわかってないんで、書きかけとする。<br />
<h2>
言葉の意味</h2>
dispatch = 使者や手紙などを送る<br />
semaphore = 手旗信号<br />
<br />
要するに処理待ちのカウンターみたいなもので、値がマイナスの間はスレッドが停止する。<br />
希望の処理が完了したら値をプラスしてやり、それが0になったらスレッド再開。<br />
<h2>
書式</h2>
<div>
詳しくは<a href="https://developer.apple.com/documentation/dispatch/dispatchsemaphore">公式サイト</a>で。</div>
<h3>
semaphoreを作る</h3>
<div style="font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="color: #0433ff; font-variant-ligatures: no-common-ligatures;">let</span><span style="font-variant-ligatures: no-common-ligatures;"> semaphore = </span><span style="color: #3495af; font-variant-ligatures: no-common-ligatures;">DispatchSemaphore</span><span style="font-variant-ligatures: no-common-ligatures;">(value: 0)</span></div>
<h3>
<span style="font-variant-ligatures: no-common-ligatures;">semaphoreを通知、または増やす</span></h3>
<div>
<span style="font-variant-ligatures: no-common-ligatures;"></span><br />
<div style="font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="font-variant-ligatures: no-common-ligatures;"><span style="font-variant-ligatures: no-common-ligatures;">semaphore.</span><span style="color: #3495af; font-variant-ligatures: no-common-ligatures;">signal</span><span style="font-variant-ligatures: no-common-ligatures;">()</span></span></div>
<span style="font-variant-ligatures: no-common-ligatures;">
</span>
<h3>
<span style="font-variant-ligatures: no-common-ligatures;">
<span style="font-variant-ligatures: no-common-ligatures;">semaphoreを待つ、または減らす</span></span></h3>
<span style="font-variant-ligatures: no-common-ligatures;">
<div>
<span style="font-variant-ligatures: no-common-ligatures;"></span><br />
<div style="font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="font-variant-ligatures: no-common-ligatures;"><span style="font-variant-ligatures: no-common-ligatures;">semaphore.</span><span style="color: #3495af; font-variant-ligatures: no-common-ligatures;">wait</span><span style="font-variant-ligatures: no-common-ligatures;">()</span></span></div>
<span style="font-variant-ligatures: no-common-ligatures;">
</span>
<div style="font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="font-variant-ligatures: no-common-ligatures;"><span style="font-variant-ligatures: no-common-ligatures;"></span></span></div>
<span style="font-variant-ligatures: no-common-ligatures;">
<div style="font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="color: #0433ff; font-variant-ligatures: no-common-ligatures;">_</span><span style="font-variant-ligatures: no-common-ligatures;"> = semaphore.</span><span style="color: #3495af; font-variant-ligatures: no-common-ligatures;">wait</span><span style="font-variant-ligatures: no-common-ligatures;">(timeout: </span><span style="color: #3495af; font-variant-ligatures: no-common-ligatures;">DispatchTime</span><span style="font-variant-ligatures: no-common-ligatures;">.</span><span style="color: #3495af; font-variant-ligatures: no-common-ligatures;">distantFuture</span><span style="font-variant-ligatures: no-common-ligatures;">) </span></div>
<div style="font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="font-variant-ligatures: no-common-ligatures;"></span></div>
<div style="font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="font-variant-ligatures: no-common-ligatures;">semaphore.wait(wallTimeout: </span><span style="color: #3495af; font-variant-ligatures: no-common-ligatures;">DispatchWallTime</span><span style="font-variant-ligatures: no-common-ligatures;">)</span></div>
<h3>
同期処理させたいコードを書くところ</h3>
<div style="font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="font-variant-ligatures: no-common-ligatures;"></span></div>
<div style="color: #3495af; font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="font-variant-ligatures: no-common-ligatures;">DispatchQueue</span><span style="color: black; font-variant-ligatures: no-common-ligatures;">.</span><span style="font-variant-ligatures: no-common-ligatures;">global</span><span style="color: black; font-variant-ligatures: no-common-ligatures;">(qos: .</span><span style="font-variant-ligatures: no-common-ligatures;">background</span><span style="color: black; font-variant-ligatures: no-common-ligatures;">).</span><span style="font-variant-ligatures: no-common-ligatures;">async</span><span style="color: black; font-variant-ligatures: no-common-ligatures;"> { ここ }</span></div>
<div style="color: #3495af; font-family: Menlo; font-size: 14px; line-height: normal;">
<span style="color: black; font-variant-ligatures: no-common-ligatures;"><br /></span></div>
<h2>
具体的書き方</h2>
<ol>
<li>semaphoreを作る</li>
<li>DispatchQueue.global(qos: ここ).async { }の引数に優先順位を書く。</li>
<li>DispatchQueue.global(qos: .xxxxx).async { ここ }のクロージャ内に同期処理させたいコードを書く</li>
<li>処理が一件終了したらsemaphore.signal( )を実行して待ち行列を解消して次の処理に移る。</li>
<li>クロージャの最後にどれくらい待つのかを書く(たとえば処理が終わるまでずっと(以前はFOREVERとかなんとか書いてたけど、今はdistantFuture(遠い未来)だそうだ)とか)</li>
</ol>
<div>
<span style="color: #0433ff; font-family: "menlo"; font-size: 14px;"><br /></span></div>
<div>
<span style="color: #0433ff; font-family: "menlo"; font-size: 14px;">let</span><span style="font-family: "menlo"; font-size: 14px;"> semaphore = </span><span style="color: #3495af; font-family: "menlo"; font-size: 14px;">DispatchSemaphore</span><span style="font-family: "menlo"; font-size: 14px;">(value: 0)</span></div>
<div>
<span style="font-family: "menlo"; font-size: 14px;"><br /></span></div>
<div>
<span style="font-family: "menlo"; font-size: 14px;"><span style="color: #0433ff; font-variant-ligatures: no-common-ligatures;">_</span> = semaphore.wait(timeout: DispatchTime.distantFuture)</span></div>
</span></div>
</span></div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-14121835547039670742019-06-20T15:50:00.002+09:002019-06-20T15:50:48.223+09:00非サポートのSwiftバージョンを上げる数年前に作ったプロジェクトを久しぶりにXcode10で開いたらSwift3のコードだったようで、もうサポートしてないって言われちゃった。カレントバージョンはSwift5。<br />
普通Swift5にコンバートしてくれるボタンが出るけど、もうそれすらサポートされてないようだ。<br />
エラーとして示されるコードをいくつか直しても同じメッセージが出たままビルドができない。<br />
<br />
たしかXcodeの設定でコードのSwiftのバージョンを記憶してるところあったと思って調べて直した。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmk_RkQAr7WZ14rhV62f4GH1_L09Rb_XofTEy-M9wCeBpauCNkkhzVphTlOBTWT1_Xt9TlW9SqDxzfwNKF-0OHR1q8ch7oSZQRuuPZJ4B0cZhSYeaEmoVNgzfXYaSZTUZGm8-d2UPImE/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-20+15.41.13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="604" data-original-width="1066" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmk_RkQAr7WZ14rhV62f4GH1_L09Rb_XofTEy-M9wCeBpauCNkkhzVphTlOBTWT1_Xt9TlW9SqDxzfwNKF-0OHR1q8ch7oSZQRuuPZJ4B0cZhSYeaEmoVNgzfXYaSZTUZGm8-d2UPImE/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-20+15.41.13.png" width="640" /></a></div>
<br />
場所はプロジェクトのトップ/TARGETS/Build Settings/Siwft Compiler - Language/Swift Language Version。<br />
これで最新のバージョンを選んでやれば、コードはSwift5で書かれていることにされる。でも当然コードの書き換えをしてくれるわけじゃないので、出てきたエラーを一つ一つ直していく。<br />
Swift3からだと、#selectorで指定する先のメソッドの頭に @objc を付けなきゃいけないとかが多かった。それくらいはエラーメッセージをクリックすると出る「Fix」ボタンでやってくれたけどね。<br />
<br />
初期のSwiftは毎年のように細かい書き方が変更されてきたんで、困りますな。頭いい人たちが作ってるんだから、最初からもうちょっときっちり仕様を決めて欲しかったけど、もうしょうがねえ。雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-69252122144079209882019-06-08T15:34:00.000+09:002019-06-08T15:45:05.552+09:00WWDC 2019<ul>
<li>ユーザーインターフェースのフレームワークSwiftUI登場</li>
<ul>
<li>徐々にUIKitから置き換わるもののようで、iPhoneなどのプレビュー画面を隣に見ながら部品/コードを置いていき、それが即座にプレビュー/コードに反映される。</li>
<li>デモを見た感じではdelegateとかが複雑にからんでいたTableViewも、Listとしてかなり短いコードで実現していた。</li>
<li>これまでのStoryboardは徐々になくなるんだろうけど、すべてのUIをSwiftUIでいきなり置き換えられるのかしら? もちろん最新の各種OSじゃないとダメよね?</li>
<li>これまでSwiftは短期間でver5まで上げられ、仕様の変更にデベロッパは右往左往させられたけど、また6とかに上がるのかしら? 大きく変わるのは勘弁。</li>
</ul>
<li>各国語ローカライズが簡単に</li>
<ul>
<li>各国AppStore用のスクリーンショットも自動生成してくれるって。コリャ便利。</li>
</ul>
<li>iPadのアプリがmacOSでも動くようになる(Project Catalyst)</li>
<ul>
<li>iPadアプリをMacのネイティブアプリとして開発できるんだそうな</li>
<li>iPadOSとmacOS Catalinaという組み合わせなの?</li>
<li>これまではUIKitをmacOSで使えるようにするという話があったけど、UIKitとSwiftUIと両方なんだろうか?</li>
<li>iPhoneのアプリは動かない?</li>
</ul>
<li>iPadOSが登場</li>
<ul>
<li>画面や操作をiPadに特化したもの。対応はiPad Air2以降なんで俺のがギリギリ対応。</li>
<li>これまでのiPhoneのアプリは使えるんだろうか?</li>
<li>年間ライセンスにもiPadOSの項目が作られるという噂も。また別に12000円くらい取られるのはイヤでござるよ。Mac向けの開発にも通じるからってことだろうか? ただの噂で終わって欲しい。</li>
</ul>
<li>macOS 10.15 Catalina</li>
<ul>
<li>2012年中期以降のMacに対応だって。うちのMac mini Late2012がこれもギリギリ対応! じゃあ来年〜再来年あたりにはMacとiPad両方買い換えないといけない?(ノД`)</li>
</ul>
<li>iOS、iPadOSなどのベータ版を使用するには、macOSもベータ版にしなきゃいけないんだって。そんな個人で2つのデバイスをベータにはできんわな。</li>
</ul>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-15516677256492091722019-06-05T02:07:00.002+09:002019-06-05T02:07:56.521+09:002ファクタ認証ってなんだ?Apple Developerで2ファクタ認証ってのが必要になって、うまく設定できずに困ってる。<br />
そもそも2ファクタ認証ってなんだよってことで調べてまとめる。<br />
<h2>
<a href="https://developer.apple.com/jp/support/account/authentication/">アップルサポートサイト</a>の記述</h2>
<blockquote class="tr_bq">
<b><span style="font-size: large;">2ファクタ認証とは何ですか?</span></b>2ファクタ認証は、Apple IDの認証を二重化することでセキュリティを強化し、たとえパスワードが他人に漏れても、本人以外はアカウントにアクセスできないようにする認証方式です。パスワードに加えて、信頼できるデバイスか、SMSまたは音声通話で届けられる確認コードの利用を求めることで、アカウントを保護します。パスワードだけではアカウントにアクセスできないため、Apple IDと、Appleに保管されている個人情報のセキュリティが向上します。</blockquote>
これまでのパスワード入力の他に、Apple IDと結びついた別のMac、iOSデバイスやケータイなどに確認用コードを表示し(音声の場合もあり)、そのコードを入力させることでセキュリティを高めるってわけだな。<br />
つまりIDとパスワードが盗まれても、それと結びついたデバイスに表示される確認用コードが得られなければ不正ができないということだ。<br />
たしかに最近は何かするとiPhoneに4桁とか6桁とかの確認コードが表示されてそれを入力しなきゃならないケースが多い。<br />
<h2>
これまでの2ステップ確認とはなんじゃ?</h2>
<div>
2ファクタ認証前も同じようにiPhoneに確認コードが送られてきてたような気がするんだけど、違ったっけ?</div>
<div>
<a href="https://support.apple.com/ja-jp/HT204152">アップルサポートサイトの記述</a>によれば、信頼できるデバイスをApple IDに結びつける点は一緒だし、そこに確認用コードを表示して入力させる点も一緒だ。</div>
<div>
アップルの内部的な処理は知らないが、結局ユーザのエクスペリエンスというか、表面上の違いはわからなかった。</div>
<div>
もしわかったら追記する。</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-40667862406326088622019-06-05T01:41:00.000+09:002019-06-08T01:27:27.086+09:00Developerアカウントに2ファクタ認証を設定まず、個人用Apple IDとDeveloper用Apple IDは分けてある。<br />
それはDeveloper Program参加時に「分けたほうがいい」といろんなサイトに書いてあったから。<br />
<h2>
2ファクタ認証が必須になるってよ</h2>
今年の初め頃、<br />
<blockquote class="tr_bq">
アカウントの安全性を高めるため、2019年2月27日以降、デベロッパプログラムのAccount Holder(アカウントホルダー)がApple Developerアカウントおよび「Certificates, Identifiers & Profiles(証明書、ID、プロファイル)」にサインインするには、2ファクタ認証が必要になります。</blockquote>
と連絡が来てたのは知ってたけど、よくわかんないでほっといた。個人用IDの方は2ファクタ認証設定済みである。<br />
<h2>
証明書が切れるってよ</h2>
今度はその 「Certificates, Identifiers & Profiles(証明書、ID、プロファイル)の有効期限切れが迫ってるで」とメールが来たので、書いてあるリンクから更新しようとしたら、「Developer用 IDに2ファクタ認証を有効にしろ」と出て先に進めなくなった。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-zMUx76u2MxRqnlDdabnLrbpW8LGvcjEDi2WJd_W7QBgjwEOArRRvvVx32kiKMkw3aov1RRkym0RQnOqJJdkParJoSyCqEk_5TpJtvTTczX5BRxbGMKygDWTUK15F1_pgGrcUe9oOHzs/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-05+1.06.46.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="785" data-original-width="785" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-zMUx76u2MxRqnlDdabnLrbpW8LGvcjEDi2WJd_W7QBgjwEOArRRvvVx32kiKMkw3aov1RRkym0RQnOqJJdkParJoSyCqEk_5TpJtvTTczX5BRxbGMKygDWTUK15F1_pgGrcUe9oOHzs/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-05+1.06.46.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
「詳しくは、サポートページ(英語)を参照」っていうんでクリックしたら<a href="https://developer.apple.com/jp/support/account/authentication/">日本語ページ</a>に飛んだ。フィッシング詐欺サイトかと不安になったけど、アドレスはまともなんで大丈夫だろう。</div>
<div class="separator" style="clear: both; text-align: left;">
んで、そこの関連情報欄に<b>「iCloudとApple Developerアカウントで、別々のApple IDを使用するにはどうしたらいいですか?」</b>というズバリなことが書かれてたんで、Macでその通り試したんだが、途中から書いてある通りにならず断念。</div>
<div class="separator" style="clear: both; text-align: left;">
具体的には以下の手順なのだが、3でつまずいてしまった。</div>
<div class="separator" style="clear: both;">
</div>
<ol>
<li>「システム環境設定」>「iCloud」>「アカウントの詳細」>「セキュリティ」で、個人用Apple IDの2ファクタ認証を有効にします。</li>
<li>Macの「システム環境設定」>「ユーザとグループ」で、デベロッパ用Apple IDで使用する新しいシステムアカウントを作成します。</li>
<li>「システム環境設定」>「iCloud」>「アカウントの詳細」>「セキュリティ」で、デベロッパ用の新しいシステムアカウントにサインインし、デベロッパ用Apple IDの2ファクタ認証を有効にします。<span style="color: red;"><b>←ここ! ここで新しいシステムアカウントのサインインが求められないの! よって、以下の処理はできなかった。</b></span></li>
<li>「システム環境設定」>「インターネットアカウント」>「iCloud」で、プライマリシステムアカウントにサインインし、Macにデベロッパ用Apple IDを追加します。</li>
<li>これで、個人用とデベロッパ用のApple ID両方の確認コードをプライマリユーザーアカウントで受信できる設定になります。</li>
</ol>
<h3>
2ファクタじゃなく、2ステップ入力を試す</h3>
<div>
WebでApple IDの情報にアクセスして2ファクタ認証を有効にするのかとも思ったが、「2ステップ認証」しか出て来ず、とりあえずそっちを有効にしてみようとしたら、「セキュリティ保護のため6月7日 xx時xx分xx秒までお待ちいただく必要があります」だとさ。今日が4日なので要するに丸3日も待たされる。なんなん?<br />
<a href="https://support.apple.com/ja-jp/HT204152">サポートサイト</a>によれば、「セキュリティ対策として、アカウント情報に重要な変更が行われば場合(パスワードのリセット、セキュリティ質問の設定など)は、設定を完了できないように待機期間を設けている」ようだ。そういえばセキュリティ質問忘れたんでリセットしたっけ。そのせいか。<br />
<br />
ウェブのApple ID管理ページだと、「2ステップ確認 アップグレードは6月7日 xx:xx:xx以降に可能です」ってあるから、3日後以降に2ステップ確認→2ファクタ認証にアップグレードできるってことか?</div>
<h3>
新アカウントでも2ファクタ有効にできず</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaSVoGtkWMzeqOLmAUO24GT8yKr56xbz770lBz6sVsp0gpjImLcgQ9SBvh3sR2wTRI_HkJv_ZGOomxUM8cCe_xqFkSB0FmOgMtK0-rwigf17xE0FdadDNrDuS65VUV6WvIHwPsh5LFO1Q/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-05+1.32.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="565" data-original-width="780" height="460" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaSVoGtkWMzeqOLmAUO24GT8yKr56xbz770lBz6sVsp0gpjImLcgQ9SBvh3sR2wTRI_HkJv_ZGOomxUM8cCe_xqFkSB0FmOgMtK0-rwigf17xE0FdadDNrDuS65VUV6WvIHwPsh5LFO1Q/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-06-05+1.32.02.png" width="640" /></a></div>
<div>
<br /></div>
<div>
さっき作った新しいユーザアカウントでMacをログインしなおし、システム環境設定のiCloudから「2ファクタ認証」を設定しようとしても、できないって出て有効にできない。なんなん!?</div>
<div>
<br /></div>
<div>
ネットで調べても、</div>
<div>
<ul>
<li>2ステップ認証を切らないとダメ</li>
<li>最初に2ステップ認証を設定しなきゃダメ</li>
</ul>
<div>
とか出てきて、よくわかんねえ。<br />
<h3>
3日間待った</h3>
</div>
</div>
<div>
ちょうど3日目にアップル様から「ご利用の Apple ID に 2 ステップ確認を設定できるようになりました。」ってメールが届いた。</div>
<div>
そこからリンクされたApple ID管理のWebページでログイン(もちろん開発用アカで)して、アカウントページのセキュリティ項目にはすでに「2ファクタ認証にアップグレードする」とかなんとか書かれてるんで、そのボタンをクリック。</div>
<div>
ところがそれでONになってくれるわけじゃなく、Macのシステム環境設定/iCloudでONにする方法が表示されるだけ。なんかだまされた気分。</div>
<div>
しょうがないからシステム環境設定開き、iCloudでそのとおりにしたんだけど、iCloudが個人用アカでログインされてるから当然すでに2ファクタはONになってる。</div>
<div>
<br /></div>
<div>
アップルの方で表示された手順にはないけど、当然個人アカをサインアウトして開発アカでサインインするんだと思ってそうしたところ、サインインの段階で「2ファクタ認証にします」とか表示が出て、勝手にやってくれた。</div>
<div>
そのかわり開発アカでのサインインは個人アカが有効になってるからそっちを無効にしてからみたいな表示が出た。開発アカの2ファクタ認証有効化だけが目的なので、これはこれでよし。個人アカを再度サインインさせておしまい。</div>
<div>
<br /></div>
<div>
セキュリティの強化はわかるけど、なんかいろいろめんどくさくなったよね。冒頭の開発用証明書の更新だって以前は毎年やる必要なかったのに。去年くらいからだよな?</div>
<div>
手順が複雑だからこうしてブログとかにまとめておかないと忘れちゃう。</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0tag:blogger.com,1999:blog-8067732212512261915.post-31391352388023099692019-04-30T00:27:00.000+09:002019-05-17T22:15:50.655+09:00Music Libraryの音楽を鳴らすMediaPlayer、AVPlayer、AVAudioPlayerと3種類方法があるようだ。<br />
ミュージック.appのようなMPMediaPickerContorollerを使うことで曲を簡単に選択できる。<br />
<h2>
MediaPlayerを使う</h2>
簡単さから言えば一番簡単。<br />
currentPlaybackRateプロパティがあるが、再生速度の変更がなぜかできない。原因不明。<br />
<br />
<br />
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">import</span> UIKit</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">import</span> MediaPlayer //Frameworkをインストールしておくこと</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<br /></div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">class</span><span style="color: black;"> ViewController: </span>UIViewController<span style="color: black;">, </span>MPMediaPickerControllerDelegate<span style="color: black;"> {</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//再生を継続するためにインスタンス変数としてPlayerを用意</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: blue;">var</span><span style="color: black;"> player:</span>MPMusicPlayerController<span style="color: black;">!</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">override</span> <span style="color: blue;">func</span> viewDidLoad() {</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: blue;">super</span><span style="color: black;">.</span>viewDidLoad<span style="color: black;">()</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>player<span style="color: black;"> = </span>MPMusicPlayerController<span style="color: black;">.</span>applicationMusicPlayer</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<br /></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">@IBAction</span> <span style="color: blue;">func</span> pickMusic(<span style="color: blue;">_</span> sender: <span style="color: blue;">Any</span>) {</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: blue;">let</span><span style="color: black;"> picker = </span>MPMediaPickerController<span style="color: black;">()</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>picker.<span style="color: #2b839f;">delegate</span> = <span style="color: blue;">self</span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//曲の複数選択の有無</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span>picker.</span>allowsPickingMultipleItems<span style="color: black;"> = </span><span style="color: blue;">false</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: #2b839f;">present</span>(picker, animated: <span style="color: blue;">true</span>, completion: <span style="color: blue;">nil</span>)</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//音楽が選択された時呼ばれるdelegate</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">func</span> mediaPicker(<span style="color: blue;">_</span> mediaPicker: <span style="color: #2b839f;">MPMediaPickerController</span>, didPickMediaItems mediaItemCollection: <span style="color: #2b839f;">MPMediaItemCollection</span>) {</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: #2b839f;">player</span>.<span style="color: #2b839f;">setQueue</span>(with: mediaItemCollection)</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>player<span style="color: black;">.</span>play<span style="color: black;">() </span><span style="color: green;">//曲の再生</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//pickerを消す</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: #2b839f;">dismiss</span>(animated: <span style="color: blue;">true</span>, completion: <span style="color: blue;">nil</span>)</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<br /></div>
<h2>
AVPlayerを使う</h2>
<div>
AVFoundationのimportが必要。</div>
<div>
動画再生にも対応したclassのようだ。</div>
<div>
ミュージックライブラリの曲のassetURLを取得する点がちょい面倒だが、簡単。</div>
<div>
assetURLからPlayerを作るときはtry文が不要。</div>
<div>
rateに負の数を入れれば<span style="color: red;">逆再生もできる</span>。</div>
<div>
再生位置の指定はseekメソッドで、引数はCMTimeなので面倒のようだ。</div>
<h2>
AVAudioPlayerを使う</h2>
<div>
AVFoundationのimportが必要。</div>
<div>
AVPlayerのAudio(音声)特化class?</div>
<div>
ミュージックライブラリの曲のassetURLを取得する点がちょい面倒だが、簡単。</div>
<div>
assetURLからPlayerを作るときはtry文が必要。</div>
<div>
rateに負の数を入れても<span style="color: red;">逆再生はできない</span>。</div>
<div>
再生位置の指定はcurrentTimeプロパティで簡単。単位は秒。公式の解説だと再生中は現在位置からのオフセット位置、停止中はplay()メソッド開始位置からのオフセット位置とあるが、どちらも変わらず、曲の先頭からのオフセット秒数みたい?<br />
<br />
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">import</span> UIKit</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">import</span> MediaPlayer</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">import</span> AVFoundation</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<br /></div>
<br />
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: blue;">class</span><span style="color: black;"> ViewController: </span>UIViewController<span style="color: black;">, </span>MPMediaPickerControllerDelegate<span style="color: black;"> {</span></div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: blue;">var</span><span style="color: black;"> player:</span>AVAudioPlayer<span style="color: black;">!</span></div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><br /></span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//音楽が選択された時呼ばれるdelegate</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">func</span> mediaPicker(<span style="color: blue;">_</span> mediaPicker: <span style="color: #2b839f;">MPMediaPickerController</span>, didPickMediaItems mediaItemCollection: <span style="color: #2b839f;">MPMediaItemCollection</span>) {</div>
<div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//選択された曲を取得</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> items = mediaItemCollection.<span style="color: #2b839f;">items</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">if</span> items.<span style="color: #2b839f;">isEmpty</span> {</div>
<div style="background-color: white; color: #a31515; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: #2b839f;">print</span><span style="color: black;">(</span>"曲が選択されていない"<span style="color: black;">)</span></div>
<div style="background-color: white; color: blue; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>return</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//先頭の一曲のassetURLを取得</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> item = items[0]</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">if</span> <span style="color: blue;">let</span> url = item.<span style="color: #2b839f;">assetURL</span> {</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">do</span> {</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: #2b839f;">player</span> = <span style="color: blue;">try</span> <span style="color: #2b839f;">AVAudioPlayer</span>(contentsOf: url)</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>} <span style="color: blue;">catch</span> {</div>
<div style="background-color: white; color: #a31515; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: #2b839f;">print</span><span style="color: black;">(</span>"曲が取得できなかった。DRMの関係?"<span style="color: black;">)</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: #2b839f;">player</span> = <span style="color: blue;">nil</span></div>
<div style="background-color: white; color: blue; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>return</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//曲の再生</div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>player<span style="color: black;">.</span>play<span style="color: black;">()</span></div>
<div style="background-color: white; color: #2b839f; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>} <span style="color: blue;">else</span> {</div>
<div style="background-color: white; color: #a31515; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: #2b839f;">print</span><span style="color: black;">(</span>"assetURL取得できなかった"<span style="color: black;">)</span></div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="background-color: white; color: green; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>//pickerを消す</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: #2b839f;">dismiss</span>(animated: <span style="color: blue;">true</span>, completion: <span style="color: blue;">nil</span>)</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
</div>
<div>
<span style="color: black;">}</span></div>
<h2>
曲などの情報を得る</h2>
</div>
<div>
先のmediaPickerのdelegateの、mediaItemCollectionの要素に曲名、アーチスト名などの情報にプロパティとしてアクセスできるので、取り出すのは簡単。</div>
<div>
<br /></div>
<div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span style="color: black; font-family: menlo;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: green; font-family: menlo;">//音楽が選択された時呼ばれるdelegate</span></div>
</div>
<div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">func</span> mediaPicker(<span style="color: blue;">_</span> mediaPicker: <span style="color: #2b839f;">MPMediaPickerController</span>, didPickMediaItems mediaItemCollection: <span style="color: #2b839f;">MPMediaItemCollection</span>) {<br />
<div style="font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> items = mediaItemCollection.<span style="color: #2b839f;">items</span></div>
<div style="font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">if</span> items.<span style="color: #2b839f;">isEmpty</span> {</div>
<div style="color: #a31515; font-family: Menlo; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: #2b839f;">print</span><span style="color: black;">(</span>"曲が選択されていない"<span style="color: black;">)</span></div>
<div style="color: blue; font-family: Menlo; font-stretch: normal; line-height: normal;">
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span>return</div>
<div style="font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div style="font-family: Menlo; font-stretch: normal; line-height: normal; min-height: 16px;">
<span class="Apple-tab-span" style="white-space: pre;"> </span></div>
<div style="font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> musicTitle = items[0].<span style="color: #2b839f;">title</span> <span style="color: green;">//曲タイトル</span></div>
<div style="font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> musicArtist = items[0].<span style="color: #2b839f;">artist</span> <span style="color: green;">//アーチスト名</span></div>
<div style="font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>l<span style="color: blue;">et</span> albumTitle = items[0].<span style="color: #2b839f;">albumTitle</span> <span style="color: green;">//アルバムタイトル</span></div>
<div style="font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> albunArtist = items[0].<span style="color: #2b839f;">albumArtist</span> <span style="color: green;">//アルバムアーチスト名</span></div>
<br />
<div style="font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="color: blue;">let</span> artWork = items[0].<span style="color: #2b839f;">artwork</span> <span style="color: green;">//アートワーク</span></div>
<div style="color: #2b839f; font-family: Menlo; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>imageView<span style="color: black;">.</span>image<span style="color: black;"> = artWork?.</span>image<span style="color: black;">(at: </span>imageView<span style="color: black;">.</span>bounds<span style="color: black;">.</span>size<span style="color: black;">)</span></div>
<div>
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"><br /></span></span></div>
<div>
<span style="color: black;"><span class="Apple-tab-span" style="white-space: pre;"> </span></span><span style="color: green;">//以下略</span></div>
</div>
<div style="background-color: white; font-family: Menlo; font-size: 14px; font-stretch: normal; line-height: normal;">
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
</div>
<h2>
注意点</h2>
<div>
どのやり方をやっても、info.plistの <span style="color: red;">Privacy - Media Library Usage Description</span> を設定しないと</div>
<div>
<span style="background-color: white; color: #2b839f; font-family: "menlo"; font-size: 14px;">present</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">(picker, animated: </span><span style="background-color: white; color: blue; font-family: "menlo"; font-size: 14px;">true</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">, completion: </span><span style="background-color: white; color: blue; font-family: "menlo"; font-size: 14px;">nil</span><span style="background-color: white; font-family: "menlo"; font-size: 14px;">)</span></div>
でpickerが表示されない。<br />
<div>
最近の傾向としてそうなのはわかるんだけど、エラーメッセージとか一切出てくれなかった。</div>
<div>
似たようなので Privacy - Music Usage Description というのがあるので、間違えないこと。</div>
雅@運営者http://www.blogger.com/profile/11185228002622172936noreply@blogger.com0