2019年8月20日火曜日

ギャンブルアプリのレーティングと、韓国でのアプリ販売について

2019/8/20にアップルからメールが来たので、日本語に要約しておく。(自分用なので、内容が正確とは限りません)

韓国で販売するアプリについて、より多くのアプリを利用できるようにした。
また子供への安全対策として、頻繁に強烈なギャンブルを模した内容のものは、2019年8月20日以降に全ての国と地域でR17レーティングになる。
以下の条件を一つ以上満たす場合、韓国のApp Storeでは19歳以上への販売となる。
8月20日以降、App Store Connectのゲーム格付けおよび管理委員会から格付け番号を入力する必要があり、アプリは今週後半に公開される。格付け番号を持ってない場合は、今すぐ申し込みむこと。→韓国の格付け番号取得のためのサイトへのリンクらしい
  • 年齢が17歳以上のカジノサブカテゴリのアプリ
  • 次のコンテンツの説明の少なくとも1つで頻繁/強烈が選択されたゲームまたはエンターテイメントカテゴリのアプリ:
  • 模擬ギャンブル
  • 性的なコンテンツまたはヌード
  • アルコール、タバコ、または薬物の使用または参照
  • リアルな暴力
評価分類番号を入力するには:
  1. App Store Connectにサインインします。
  2. 大韓民国の可用性の下にあるアプリ情報セクションで、評価分類番号を入力する。
  3. レビューのためにアプリを送信する。
よくわからんのだが、ギャンブルとかが世界的に17歳以上対象になり、韓国はさらに厳しく19歳以上になったということか?
韓国はゲームを販売するのにも許可(管理番号を取る?)が必要みたいな話もあるみたいだし、よくわからんのよね。

2019年8月8日木曜日

App-ads.txtってなんじゃ?(まだよくわからねえ)

GoogleのAdMobを広告サービスとしてアプリに組み込んでいるのだが、App-ads.txtのサポートを開始するというメールが来た。なんだそれは?

調べたところ、よくわからないのだが、アプリデベロッパー(自分のこと)のサイト(iOSのアプリなら、AppStoreにサポートサイトとして登録してるサイトのことのようだ)にアップするテキストファイルで、これによって広告が不正使用されることを防ぐらしい。
詐欺対策。表示された広告料がアプリデベロッパー以外に不正に横取りされてしまうのを防ぐ?
偽の広告枠が表示されることを防ぐ。
広告枠が広告事業者より認定されたものかどうか

DSPがアプリ内の広告枠に入札する際、デベロッパーのサイトを確認し、正式に認証されている広告事業者のみの入札を受け付ける…そうだ。わかんねえ。

アプリの広告の仕組みがよくわかってないんでさっぱりわからんのだが、要は怪しげで詐欺まがいな広告が表示されないよう、承認されてる広告事業者の情報を持ってるファイルっぽい。
広告料が横取りされないようにということだけど、たとえば「アプリがウィルスに感染してるよ! 駆除するならこの(怪しげな)アプリをダウンロードなう!」とかいうよくあるやつなんかも排除してくれるんだろうか?

Googleの説明じゃ、まず「IABが提供するAuthorized Sellers for Apps 仕様書にそってapp-ads.txtファイルを作れ」って書いてあるんだけど、仕様書が英語で、しかもなんだかわかんねえんだよ。

DSP(デマンドサイドプラットフォーム):よくわからんが、Googleとかが提供してるネット広告サービスのプラットフォームことか?
IAB(インタラクティブ・アドバタイジング・ブリュー/インタラクティブ広告協会):ネット広告とかの協会だろうな



とりあえず、今の所は絶対実装しなければ広告表示されないといった類のものではなく、「変な広告が出てせっかくの広告料を受け取れない」ことがあってもいいなら設定不要かもしれない。
ちょっと様子見る。

2019年6月26日水曜日

デバイスがロックされてると出て実機確認できない

Xcode cannot launch アプリ名 on 〇〇のPhone because the device is locked.

Xcode9になったあたりから、上記のようなメッセージが表示されて実機確認できないことが増えた。
iOSの設定 / 一般 / リセット / 位置情報とプライバシーをリセット してやり、デバイスを繋ぎ直すと治る。
しかし、MacのiTunesが起動して「このコンピュータを信頼しますか?」みたいなやり取りをすることになるし、その後もリセットされた内容についてアプリごとにいちいち「フォトライブラリにアクセスしようとしています。許可しますか?」「位置情報を利用しようとしています。許可しますか?」と再回答しなければならず、面倒くさい。

他のやり方として、Xcodeの Window / Devices and Simulators でConnectedにあるデバイスを右クリックし、Unpair Deviceし、再度つなぎ直すと、デバイスの方で「信頼しますか?」メッセージとかは出るけど、Macの方はこれ以上作業が必要ないので少し便利。

根本的な原因はXcodeのバグだろうから、アップルが治してくれないとどうしようもない。

2019年6月24日月曜日

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

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

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

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

などとなっていたのを

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

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

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

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

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

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

2019年6月20日木曜日

Swift3のDispatch semaphore

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

言葉の意味

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

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

書式

詳しくは公式サイトで。

semaphoreを作る

let semaphore = DispatchSemaphore(value: 0)

semaphoreを通知、または増やす


semaphore.signal()

semaphoreを待つ、または減らす


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

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

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

具体的書き方

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

let semaphore = DispatchSemaphore(value: 0)

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

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

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

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

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

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

2019年6月8日土曜日

WWDC 2019

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