2018年3月8日木曜日

画像の作り直しでJPEGがPNGになっちゃった

Retinaディスプレイの画面をキャプチャし、それをツイッターに投稿するアプリを作ってるが、画像容量がでかくなるので縮小したい。

画面キャプチャだけ

iPhoneだとRetina解像度でちょうどいいのだが、iPadだとファイルサイズが大きくなるためツイートをはねられることがしばしばある。5MB制限らしいので、それをオーバーしてしまうようだ。
うまく投稿できても15秒くらいかかって遅い。投稿できた画像は元と同じくJPEG。

UIGraphicsBeginImageContextWithOptions(realSize, false, 2.0) //Contextを作成(Retina対応で2.0)
let ctx = UIGraphicsGetCurrentContext() //現在のContextを得る
imageView.layer.render(in: UIGraphicsGetCurrentContext()!) //Context部分に表示されている画像その他をレンダリング(ここが画面キャプチャ)
var image = UIGraphicsGetImageFromCurrentImageContext() //UIImageを作る

UIGraphicsEndImageContext()

縦横ピクセルを制限

iPadのRetina解像度のまま投稿すると縦横の長さも大きすぎるので、はみ出してる画像は最大1000ピクセルに縮小させるようコードを書いた。
いっぺんに縮小するのでなく、一度キャプチャして出来た画像を再度GraphicContextを使ってリサイズしている。
Retina解像度でキャプチャしているので、image.sizeで得られるwidth、heightは1/2になっているので注意。最終的に得られる画像はその倍になるのでややこしい。
1000pxの画像を得たいときに500pxに縮小すると最終的に1000pxになるというもの。

//画像縦横サイズ制限
//maxPixelSizeは例えば500とか入ってる
//縦横の最大を1000pxに抑えたいが、2倍精細なRetina解像度なので、image.sizeで得られる解像度はその半分になるため
var newSize = image?.size
if image!.size.width > maxPixelSize || image!.size.height > maxPixelSize {
    if image!.size.width >= image!.size.height {
        let rate = maxPixelSize / image!.size.width //縦横比
        newSize = CGSize(width: maxPixelSize, height: image!.size.height * rate)
    } else {
        let rate = maxPixelSize / image!.size.height //縦横比
        newSize = CGSize(width: image!.size.width * rate, height: maxPixelSize)
    }
        //UIImage作り直し開始。なぜかPNGになってしまう
    UIGraphicsBeginImageContext(newSize!)
    image!.draw(in: CGRect(x: 0, y: 0, width: newSize!.width, height: newSize!.height))
    image = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    ⭐️
}

そうしたらなぜか画像がPNGになってしまった。縮小してるから投稿できないことはないが、1MBオーバーで縮小したありがたみが薄い。

キャプチャ時の解像度を非Retinaにするとサイズ制限しなくてもJPEGになってくれるけど、今度はiPhoneでのキャプチャ解像度が低いため、画像が小さすぎてしまう。

しょうがないので、一度JPEGのData型に直し、さらにそれをUIImageに戻して解決した。

上記コードの⭐️に挿入
//0.7は圧縮率
let imageData = UIImageJPEGRepresentation(image!, 0.7)
image = UIImage(data: imageData!)

  1. Retina解像度でContextを作ってキャプチャ
  2. UIImageとして変数に
  3. 縦横を同比率で縮小するためにwidthとheightを計算
  4. 計算したwidth、heightでContextを作り、2.のUIImageをdrawすることで画像縮小(このままだとPNGになる)
  5. UIImageをJPEG化してDataに直す(UIImageのままフォーマット変換できないから)
  6. DataをUIImageに戻して終了

原因はわからないが、UIImageって内部的にJPEGとかPNGとかの情報も持ってるのね?

2018年3月7日水曜日

文字列の長さを調べる

結論

先に言うと、文字列.count で得られる。

詳細

文字列の長さ(文字数)を調べるのに、Swiftでは多くのプログラミング言語にあるlengthなどのプロパティがない。
これはUnicodeの導入で1文字あたりのバイト数のバリエーションが増えたため、一つのlengthで対応できないためのようだ。

そこで以下のようなそれぞれに対応したcountプロパティで得ることになる。
unicodeScalarsはUTF32用だ。

"猫".utf8.count ->3
"🐱".utf8.count ->4

"猫".utf16.count ->1
"🐱".utf16.count -> 2

"猫".unicodeScalars.count ->1
"🐱".unicodeScalars.count ->1

"猫".characters.count ->1

"🐱".characters.count ->1

最後のcharactersが「見た目に何文字か」を返してくれて一番良かったのだが、Swift 4でdeprecatedになり、結局
"猫".count ->1
"🐱".count ->1
で落ち着いたようだ。
これなら楽でいいや。

2018年3月4日日曜日

GameCenterの設定方法

iTunes Connectの処理

iTunes ConnectでGame CenterのスイッチをONにする。

マルチプレーヤー互換性には、今登録しようとしているアプリが入ることになるのだが、他のタブとかを行き来してるとしばらくして勝手に表示してくれる。

上のタブの「機能」、左のタブの「Game Center」に移動。
グループに移動は他のアプリとスコアを共有する場合なので、アプリ単独の場合は無視。
Leaderboard(0) の+を押すと以下の画面に。

シングルLeaderboardを選択する。

Leaderboard

Leaderboardとは、Game Center画面の項目のこと。

  • Leaderboardの参照名
    • Leaderboardごとに付ける内部名。iTunes Connect内で検索する際に使用
  • Leaderboard ID
    • このLeaderboardのための固有の識別子。. や _ も含められる。
    • プログラムの中で使う
    • 一度決めたら変更不可なので注意
    • 自分の他のアプリとも共通なので、アプリごとにユニークにする必要があるようだ
  • スコアのフォーマットタイプ

      • 整数
      • 固定小数 —— 少数点以下1〜3桁
      • 経過時間 —— 分、秒、100分の1秒
      • 金額 —— 整数、小数点以下2桁まで
  • スコア送信タイプ
    • 最初に表示するのをベストスコアにするか、最新スコアにするか
  • 並べ替えの順序
    • 最高のスコア(一番多いスコア)を最初に表示するなら「降順」を。スコアが小さい方が勝ちのゲームなら「昇順」でいいんじゃないかと思う。
  • スコアの範囲(オプション)

  • Leaderboardのローカリゼーション

言語ごとにLeaderboardに表示する「名前」を変える。(例として挙げてるゲームは漢字やエジプト文字を取るゲームなので、日本語でのローカライズ時は「漢字」と表示させる。まぎらわしくてスマン)
スコアのフォーマットは、3桁ごとにカンマ「,」で区切るかピリオド「.」で区切るかとかそんなもの。
スコアのフォーマットサフィックスってのは「〇〇点」などと付ける場合。
画像も付けられる。使ったことないけど。

実際の設定例



Leaderboardを追加

Leaderboardの設定が終わって保存されたら、最初のGame Centerの所にLeaderboard(+)が出てくるので、クリックして設定したものをチェックして加える。

Xcodeの設定

CapabilitiesをONにする

これはGameKit.frameworkのインストールとInfo.plistへの設定追加を自動でしてくれるものなので、次のように自分でやっても同じことだが、こっち推奨。
❗️で警告されてるのはiTunes Connectで設定しろって意味だと思うんで、もう終わってる。iTunesConnectできちんと設定できていればそのうち✔に変わってくれるはずだ。


以下の2つは自分でやる場合。自分でやってもCapabilitiesのON/OFFは変化せずアンマッチになるので、CapabilitiesをONにした方が楽で確実だ。
  1. GameKit.frameworkをインストール
  2. プロジェクトファイルのTARGETS / アプリ名 / Info / Custom iOS Target Properties の Required device capabilitiesにgamekitのstringを追加。
    1. これはInfo.plistと同じなので、直接そちらをいじってもよし。

コード

import GameKit するのは当然。

class のところで GKGameCenterControllerDelegate を追加する。

最低限必要な実装は以下。
  • Game Centerへのログイン
  • Leaderboardなど、ランキングのウィンドウの表示
  • ランキングのウィンドウを消去
  • ハイスコアやチャレンジをクリアしたらGame Centerに情報を送る

ログイン処理

ゲーム開始時に以下のようにGame Centerにログイン処理をする。
このログイン処理は、AppDelegateあたりに書いておいて、他のアプリからアクティブになった時にも機能するようにするといいって。


func authenticateLocalPlayer() {
    let player = GKLocalPlayer.localPlayer() //ログイン確認画面の作成
    player.authenticateHandler = {(viewController, error) -> Void in
        //GameCenterに認証されていない時、viewControllerに認証画面が入ってくるので、
        //それを表示させれば認証処理が簡単にできる
        if viewController != nil
        {
            self.present(viewController!, animated: true, completion: nil)
        }
    }
}

Leaderboard表示と消去

//GameCenterのランキング表示
@IBAction func showRanking(_ sender: Any) {
    let gcView = GKGameCenterViewController()
    gcView.gameCenterDelegate = self
    gcView.viewState = GKGameCenterViewControllerState.leaderboards
    self.present(gcView, animated: true, completion: nil)
}

ログイン後に閉じるdelegate処理も

//Leaderboard処理終了時のdelegate
func gameCenterViewControllerDidFinish(_ gameCenterViewController: GKGameCenterViewController) {
    //Viewを閉じる
    self.dismiss(animated: true, completion: nil)
}

ハイスコアを送る

以下のようなメソッドを用意しておき、ハイスコア更新時に呼び出す。
引数のIDはiTunes Connectで設定したもの。
rateがスコアになる。Leaderboardの値がInt64なのでそれに合わせてる。

func sendLeaderboardWithID(ID:String, rate:Int64) -> Void {
    //Leaderboard用のインスタンス
    let score = GKScore(leaderboardIdentifier: ID)
    if GKLocalPlayer.localPlayer().isAuthenticated {
        //スコアを設定
        score.value = rate
        print("最高値送信")
        GKScore.report([score], withCompletionHandler: { (error) in
            if error != nil {
                // エラーの場合
                print("GameCenter送信時にエラー \(String(describing: error))")
            }
        })
    } else {
        print("GameCenterにログインしてない!?Σ(((°Д°;))))ガクガク")
    }
}

実機テスト

かつてはiTunes Connectの「ユーザと役割」の「Sandboxテスター」でテスト用アカウントを作る必要があったようだが(実機の設定 / Game Cemter / sandbox をONにする必要もあった)、現在は不要になったそうだ
そのままのアカウントでやるとどうなるのかについての肝心の説明は、Appleのドキュメントからデッドリンクになっててわからん!🤮

参考サイト

2018年2月23日金曜日

変なメッセージ/Month 13 is out of bounds

2017年12月以降にmacOS HighSierraで開発してると、Month 13 is out of boundsってよく出るんだって。
うちでも出たわ。

要するに「13月は範囲外じゃ」ってメッセージなんだけど、べつにDateの関係とかいじってない。
CoreFoundation内のバグらしいって。
でもメッセージ出る以外にうちでは悪さしてないようなんで、そのまま様子見。
てか、さっさとバグなおせよな、Apple。

2018年2月9日金曜日

UIButtonのタイトル変更時のチラつき防止

問題

UIButtonのtitleTextを変更すると、表示がチラついてしまう。

たとえば以下のようにいくつもあるボタンのtitleTextを一斉に変えようとする場合などに、特に気にかかる。
最初にボタンの isHidden = true にしておき、titleText変更後に isHidden = false にしてもダメ。

for btn in buttonArray {
    btn.setTitle("ちんぴょろすぽーん", for: .normal)
}

解決方法

UIViewのアニメーションを切っておき、その間にtitleTextを変更、最後にアニメーションを許可すればよし。
肝心なことは、ボタンに対し layoutIfNeeded() を指示しておくこと。これやらないとやっぱりチラつく。

UIView.setAnimationsEnabled(false)
for btn in buttonArray {
    btn.setTitle("ちんぴょろすぽーん", for: .normal)
    btn.layoutIfNeeded()
}
UIView.setAnimationsEnabled(true)


layoutIfNeeded()ってのは、「レイアウトのアップデートが保留中だったら、すぐにSubviewをレイアウトしろ」ってメソッド。
すぐに…なんていうと、アニメーションの設定が false でも更新されてしまいそうだけど、そこは ifNeeded 必要になったら…ってことで、アニメの設定が true になるまで待ってくれるんだろう。
titleTextの変更も、ボタンの大きさが変更される要因の一つなので、こうしたレイアウト関係のメソッドで処理するんだろうね。

なおこのメソッドはメインスレッドからしか呼べない。(iOSの仕様上、UIの操作はメインスレッドからしか処理できないため)

2018年2月5日月曜日

アプリに絵文字使っちゃダメ?

情報ソース:9TO5MaciPhone Maniaほか

📱🙅🏻‍♀️🙅🏽‍♂️🤮
9TO5Macが伝えるところによると、iOSアプリのアイコンや、アプリ説明のためのスクリーンショットに絵文字を使ったものが、AppStoreからリジェクトされたという。
アップルによれば、絵文字の使用はアップルの商標・著作権の侵害に当たるのだというが。
「AppStoreは、アプリ内で絵文字を使用していることがどうやら著作権のルールを破っているとして、@getBittrackerの最新バージョンのバイナリを拒否しました。
うん、それは本当です。 私たちはスクリーンショットでの絵文字について話していますが、もっと重要なのはアプリ内での生のテキストです。」
この開発者サム・エカート氏はスクリーンショットに絵文字を使った(当然画像に変換してだろう)ことを言っているが、それに対するコメントで、アプリ内のアイコンとして絵文字を使った例を尋ねている人がいる。
「それらをゲームのアセットとして使うのではなく、単にあなたのUIを「装飾する」ことはどうでしょうか?」

これに対してエカート氏は「まさにうちらそれやってて、禁止されてるらしいよ」と返信している。

ガイドラインを見てみる

以下、App Store審査ガイドラインより抜粋(改行等筆者)
5.2 知的財産
アプリケーションには自分で作成したコンテンツ、または使用許可を取得したコンテンツのみを使用してください。
許可なくコンテンツを使用した場合はアプリケーションを削除します。
もちろん、他のデベロッパが他者の作品を許可なく使用した場合はそのアプリケーションが削除されます。
ご自分の知的財産権がApp Storeの他のデベロッパに侵害されているおそれがある場合は、Webフォームから申し立てを行ってください。
国によって法律は異なりますが、少なくとも以下の各項に留意する必要があります。
5.2.1 〜 5.2.4 略
5.2.5 Apple製品:既存のApple製品、既存のインターフェイス(Finderなど)、既存のアプリケーション(App Store、iTunes Store、メッセージなど)、既存のApple広告などとの混同を招くような、類似したアプリケーションは開発しないでください。
他社製のキーボードやステッカーパックを含め、アプリケーションやExtensionにAppleの絵文字を含めることはできません。
iTunesミュージックのプレビューを娯楽的な目的(フォトコラージュのBGM、ゲームのサウンドトラックなど)で、またはその他の承認されていない目的で使用することは許可されません。
アプリケーションでアクティビティリングを表示する場合は、アクティビティコントロールに類似する方法で、ムーブ、エクササイズ、スタンドのデータを表示することはできません。
アクティビティリングの使用に関して詳しくは、「Human Interface Guidelines」を参照してください。
ステッカーパックというのは、iMessageで使われる、LINEでいうスタンプにあたるもののことのようだ。

ほんとに違法なのか?

たしかにスタンプのデザインに絵文字を使うのはどうかと思うが、アプリの説明の画像や、アプリ内のアイコンとして無加工の絵文字を使うことがいけないことだろうか?
Apple製のデバイス上でしか使われないアプリ、AppStoreでしか表示されない画像に対し、絵文字という少々特殊なものとはいえ、Appleが用意したフォントの一種を使うなというのは権利の暴走じゃないか?
それを言ったら、通常のフォントも同じグラフィックデザインの一種として、使用できないんじゃないか? ってことになる。さすがにそこまで極端なことは言い出さないだろうけど、用意された便利そうなものを「使っちゃダメ」って言われるのには抵抗あるよな。

「アプリの文字入力欄でユーザーが絵文字を入力可能になっているのは問題ない」とも報じられているが、当たり前だわな。いちいち入力された文字が絵文字かどうかなんて判定してられんわ。そもそもユーザーが絵文字を使えないなら何のための絵文字かわからん。

いや、ちょうど絵文字をボタンのtitleTextとして表示して選ばせるアプリ作っててさ。なんでだよー、バカヤローという気分なのだな。
もし絵文字がダメなら、一般フォントのエジプト聖刻文字(ヒエログリフ)とかはどうなんだ?
𓀀𓀁𓀂𓀃𓀄𓀅𓀆𓀇𓀈𓀉𓀊𓀋𓀌𓀍𓀎𓀏𓀐𓀑𓀒𓀓𓀔𓀕𓀖𓀗𓀘𓀙𓀚𓀛𓀜𓀝𓀞𓀟𓀠𓀡𓀢𓀣𓀤𓀥𓀦𓀧𓀨𓀩𓀪𓀫𓀬𓀭𓀮𓀯𓀱𓀲𓀳𓀴𓀵𓀶𓀷𓀸𓀹𓀺𓀻𓀼𓀽𓀾𓀿𓁀𓁁𓁂𓁃𓁄𓁅𓁆𓁇𓁈𓁉𓁊𓁋𓁌𓁍𓁎𓁏𓁐𓁑𓁒𓁓𓁔𓁕𓁖𓁗𓁘𓁙𓁚𓁛𓁜𓁝𓁞𓁟𓁡𓁢𓁣𓁤𓁥𓁦𓁧𓁨𓁩𓁪𓁫𓁬𓁭𓁮𓁯𓁰𓁱𓁲𓁳𓁴𓁵𓁶𓁷𓁸𓁹𓁺𓁻𓁼𓁽𓁾𓁿𓂀𓂁𓂂𓂃𓂄𓂅𓂆𓂇𓂈𓂉𓂊𓂋𓂌𓂍𓂎𓂏𓂐𓂑𓂒𓂓𓂔𓂕𓂖𓂗𓂘𓂙𓂚𓂛𓂜𓂝𓂞𓂟𓂠𓂡𓂢𓂣𓂤𓂥𓂦𓂧𓂨𓂩𓂪𓂫𓂬𓂭𓂮𓂯𓂰𓂱𓂲𓂳𓂵𓂶𓂷𓂸𓂹𓂺𓂻𓂼𓂽𓂾𓂿𓃀𓃁𓃂𓃃𓃄𓃆𓃇𓃈𓃉𓃊𓃋𓃌𓃍𓃎𓃏𓃐𓃑𓃒𓃓𓃔𓃕𓃖𓃗𓃘𓃙𓃚𓃛𓃜𓃝𓃞𓃟𓃠𓃡𓃢𓃣𓃤𓃥𓃦𓃧𓃨𓃩𓃪𓃫𓃬𓃭𓃮𓃯𓃰𓃱𓃲𓃳𓃴𓃵𓃶𓃷𓃸𓃹𓃺𓃻𓃼𓃽𓃾𓃿𓄀𓄁𓄂𓄃𓄄𓄅𓄆𓄇𓄈𓄉𓄊𓄋𓄌𓄍𓄎𓄏𓄐𓄑𓄒𓄓𓄔𓄕𓄖𓄗𓄘𓄙𓄚𓄛𓄜𓄝𓄞𓄟𓄠𓄡𓄢𓄣𓄤𓄥𓄦𓄧𓄨𓄩𓄪𓄫𓄬𓄭𓄮𓄯𓄰𓄱𓄲𓄳𓄴𓄵𓄶𓄷𓄸𓄹𓄺𓄻𓄼𓄽𓄿𓅀𓅁𓅂𓅃𓅄𓅅𓅆𓅇𓅈𓅉𓅊𓅋𓅌𓅍𓅎𓅏𓅐𓅑𓅒𓅓𓅔𓅕𓅖𓅗𓅘𓅙𓅚𓅛𓅜𓅝𓅞𓅟𓅠𓅡𓅢𓅣𓅤𓅥𓅦𓅧𓅨𓅩𓅪𓅫𓅬𓅭𓅮𓅯𓅰𓅱𓅲𓅳𓅴𓅵𓅶𓅷𓅸𓅹𓅺𓅻𓅼𓅽𓅾𓅿𓆀𓆁𓆂𓆃𓆄𓆅𓆆𓆇𓆈𓆉𓆊𓆋𓆌𓆍𓆎𓆏𓆐𓆑𓆒𓆓𓆔𓆕𓆖𓆗𓆘𓆙𓆚𓆛𓆜𓆝𓆞𓆟𓆠𓆡𓆢𓆣𓆤𓆥𓆦𓆧𓆨𓆩𓆪𓆫𓆬𓆭𓆮𓆯𓆰𓆱𓆲𓆳𓆴𓆵𓆶𓆷𓆸𓆹𓆺𓆻𓆼𓆽𓆾𓆿𓇀𓇁𓇂𓇃𓇄𓇅𓇆𓇇𓇈𓇉𓇊𓇋𓇌𓇍𓇎𓇏𓇐𓇑𓇒𓇓𓇔𓇕𓇖𓇗𓇘𓇙𓇚𓇛𓇜𓇝𓇞𓇟𓇠𓇡𓇢𓇣𓇤𓇥𓇦𓇧𓇨𓇩𓇪𓇫𓇬𓇭𓇮𓇯𓇰𓇱𓇲𓇳𓇴𓇵𓇶𓇷𓇸𓇹𓇺𓇻𓇼𓇽𓇾𓇿𓈀𓈁𓈂𓈃𓈄𓈅𓈆𓈇𓈈𓈉𓈊𓈋𓈌𓈍𓈎𓈏𓈐𓈑𓈒𓈓𓈔𓈕𓈖𓈗𓈘𓈙𓈚𓈛𓈜𓈝𓈞𓈟𓈠𓈡𓈢𓈣𓈤𓈥𓈦𓈧𓈨𓈩𓈪𓈫𓈬𓈭𓈮𓈯𓈰𓈱𓈲𓈳𓈴𓈵𓈶𓈷𓈸𓈹𓈺𓈻𓈼𓈽𓈾𓈿𓉀𓉁𓉂𓉃𓉄𓉅𓉆𓉇𓉈𓉉𓉊𓉋𓉌𓉍𓉎𓉏𓉐𓉑𓉒𓉓𓉔𓉕𓉖𓉗𓉘𓉙𓉚𓉛𓉜𓉝𓉞𓉟𓉠𓉡𓉢𓉣𓉤𓉥𓉦𓉧𓉨𓉩𓉪𓉫𓉬𓉭𓉮𓉯𓉰𓉱𓉲𓉳𓉴𓉵𓉶𓉷𓉸𓉹𓉺𓉻𓉼𓉽𓉾𓉿𓊀𓊁𓊂𓊃𓊄𓊅𓊆𓊇𓊈𓊉𓊊𓊋𓊌𓊍𓊎𓊏𓊐𓊑𓊒𓊓𓊔𓊕𓊖𓊗𓊘𓊙𓊚𓊛𓊜𓊝𓊞𓊟𓊠𓊡𓊢𓊣𓊤𓊥𓊦𓊧𓊨𓊩𓊪𓊫𓊬𓊭𓊮𓊰𓊱𓊲𓊳𓊴𓊵𓊶𓊷𓊸𓊹𓊺𓊻𓊼𓊽𓊾𓊿𓋀𓋁𓋂𓋃𓋄𓋅𓋆𓋇𓋈𓋉𓋊𓋋𓋌𓋍𓋎𓋏𓋐𓋑𓋒𓋓𓋔𓋕𓋖𓋗𓋘𓋙𓋚𓋛𓋜𓋝𓋞𓋟𓋠𓋡𓋢𓋣𓋤𓋥𓋦𓋧𓋨𓋩𓋪𓋫𓋬𓋭𓋮𓋯𓋰𓋱𓋲𓋳𓋴𓋵𓋶𓋷𓋸𓋹𓋺𓋻𓋼𓋽𓋾𓋿𓌀𓌁𓌂𓌃𓌄𓌅𓌆𓌇𓌈𓌉𓌊𓌋𓌌𓌍𓌎𓌏𓌐𓌑𓌒𓌓𓌔𓌕𓌖𓌗𓌘𓌙𓌚𓌛𓌜𓌝𓌞𓌟𓌠𓌡𓌢𓌣𓌤𓌥𓌦𓌧𓌨𓌩𓌪𓌫𓌬𓌭𓌮𓌯𓌰𓌱𓌲𓌳𓌴𓌵𓌶𓌷𓌸𓌹𓌺𓌻𓌼𓌽𓌾𓌿𓍀𓍁𓍂𓍃𓍄𓍅𓍆𓍇𓍈𓍉𓍊𓍋𓍌𓍏𓍐𓍒𓍔𓍕𓍖𓍗𓍘𓍙𓍚𓍛𓍜𓍝𓍞𓍟𓍡𓍢𓍣𓍤𓍥𓍦𓍩𓍪𓍫𓍬𓍭𓍯𓍰𓍲𓍳𓍴𓍵𓍶𓍷𓍸𓍹𓍺𓍻𓍼𓍽𓍾𓍿𓎀𓎁𓎂𓎃𓎄𓎅𓎆𓎇𓎈𓎋𓎌𓎍𓎎𓎏𓎐𓎑𓎒𓎓𓎔𓎕𓎖𓎗𓎘𓎙𓎚𓎛𓎜𓎝𓎞𓎟𓎠𓎡𓎢𓎣𓎤𓎥𓎦𓎨𓎩𓎪𓎫𓎬𓎭𓎮𓎯𓎰𓎱𓎲𓎳𓎵𓎶𓎷𓎸𓎹𓎺𓎻𓎼𓎾𓎿𓏀𓏁𓏂𓏃𓏄𓏅𓏆𓏇𓏈𓏉𓏊𓏋𓏌𓏍𓏎𓏏𓏐𓏑𓏒𓏓𓏔𓏕𓏖𓏗𓏘𓏙𓏚𓏛𓏜𓏞𓏟𓏠𓏡𓏢𓏣𓏤𓏥𓏦𓏧𓏨𓏩𓏪𓏫𓏬𓏭𓏮𓏯𓏰𓏱𓏲𓏳𓏴𓏵𓏶𓏷𓏸𓏹𓏺𓏻𓏼𓏽𓏾𓏿𓐀𓐁𓐂𓐃𓐄𓐅𓐆𓐇𓐈𓐉𓐊𓐋𓐌𓐍𓐎𓐏𓐐𓐑𓐒𓐓𓐔𓐕𓐖𓐗𓐘𓐙𓐚𓐛𓐜𓐝𓐞𓐟𓐠𓐡𓐢𓐣𓐤𓐥𓐦𓐧𓐨𓐩𓐫𓐬𓐭𓐮
雀パイやドミノやトランプは?
🀀🀁🀂🀃🀅🀋🀙🀟🀢🀗🀴🁈🁵🁷🂡🂷🂼🂾🂮🂾🃟
iOS11だと、聖剣文字は見えるが、麻雀牌以下は□に化けちゃう。まあいい、聖剣文字使ってやれ。ヒヒヒヒ…

2018年1月31日水曜日

メモ:音の同時再生

情報源:【iOS】音楽を止めずに効果音を同時に再生するには

まだちゃんと試してないけど、情報見つけたのでメモ。
AppDelegateに以下のコードを書いておくと同時再生できるんだとか。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
    } catch {
        print("エラー")
    }
    
    return true

}