20210101のSwiftに関する記事は6件です。

【エラー】This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

このエラーはなに

ユーザーのプライバシーにアクセスするための説明が無い」と怒られている。
例えばアプリでフォトアルバムにアクセスするコードは書かれているけど、それに対するプライバシー設定がされていないと掲題のエラーが起こる。

設定する

Info.plist に設定を追加する。
カメラとフォトアルバムを使用する設定をそれぞれ追加した。

c93d1060b443c5fb8ab1878ebf40d828.png

アプリをAppStoreでリリースする際は Value をもっときちんとした形で書かなければいけないみたい。

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

GKAccessPointの実装

はじめに

iOS14からGameKitでGKAccessPointというものが使えるようになりました。
ランキングを表示するLeaderboardsや、ゲーム内の達成項目を表示するAchievementsにワンタップでアクセスできるようにするボタンのようなものです。
非常に簡単に導入できるので、おすすめです。

GKAccessPointとは

以下画像の左上にあるアイコンのようなものです。
画面の四隅のうちどれかに設置することができ、今回私の場合は左上に設置しています。
Appleはなるべく左上に設置することを推奨しています。
3E821B2A-5646-44C3-BA66-20FDEE20D46D.png

AccessPointをタップすると以下のようなGameCenterの画面が表示されます。
このメニュー画面のことをDashboardと呼びます。
AppStoreConnect内でのGameCenterの設定によってDashboardに表示される項目は変わります。
なお、Dashboardを経由せずに直接Leaderboardsやユーザープロフィールを表示させることもできます。
9B7AB038-B1AB-4022-AECE-DEF38B93320D.png

導入前の注意

GKAccessPointには、.showHighlightsというBool型のプロパティがあります。
この値をtrueにすると、AccessPointが表示されるたびに以下のようなユーザーの現在順位や獲得Achievement数についてのハイライトが数秒の間表示されます。なので.showHighlightsをtrueにする場合、このハイライトの表示領域がゲーム画面のUIに被らないよう注意する必要があります。
BC218BFA-0A99-42AB-A90F-D6584DFED355_1_102_o.jpeg

横画面の場合、AccessPointのポイント数は以下のようになります。(iPhone11Proの場合)
縦幅62pt, 横幅280ptで、セーフエリアは91pt空けておくことが推奨されています。
ちなみに縦画面の場合、縦62pt, 横335ptで、セーフエリアは114pt推奨です。
Image.001.png

実装方法

AppStoreConnectにアプリを登録し、GameCenter機能をオンにする

当たり前ですがGameCenterの機能なので、
AppStoreConnectにアプリを登録後、GameCenterのチェックボックスをオンにします。
ついでに 機能 -> GameCenter でLeaderboardsやAchievementの追加を行なっておくと良いです。

Xcodeの設定

Project -> General -> Capabilities -> Game Center をオン
Project -> General -> Linked Frameworks and Libraries でGameKit.Frameworkを追加

GameCenterのログイン処理

GameCenterにユーザーがログインしていないとAccessPointが使えません。
なのであらかじめアプリ起動直後にGameCenterへのログイン処理を完了している必要があります。
GKAccessPointとは直接関係はないので説明は省略しコードだけ載せさせていただきます。
私は以下のように書きました。
GameCenterにユーザーがサインインしていない場合、
GKLocalPlayer.local.authenticateHandlerの引数viewControllerにサインイン専用のViewControllerが入りますので、それを表示させます。
ユーザーがそもそも設定でGameCenter機能をオフにしている場合、errorになります。
サインイン成功した場合はGameCenter側で勝手に認証してくれますので、何もする必要はありません。

GameCenterLocalPlayer.swift
struct GameCenterLocalPlayer {

   static func loginGameCenter(target: UIViewController) {
        GKLocalPlayer.local.authenticateHandler = { viewController, error in
            if error != nil {
                let alert = UIAlertController(title: "Game Center", message: "To join the ranking,\nPlease sign in to GameCenter.", preferredStyle: .alert)
                let alertAction = UIAlertAction(title: "OK", style: .default, handler: nil)
                alert.addAction(alertAction)
                target.present(alert, animated: true)
            }
            if let _viewController = viewController {
                target.present(_viewController, animated: true)
            }
        }
    }

}
AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {

   var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
        self.window?.makeKeyAndVisible()

        if let presentView = window?.rootViewController {
            GameCenterLocalPlayer.loginGameCenter(target: presentView)
        }

        return true
    }

}

GKAccessPointのコードを書く

最後にGKAccessPointを呼び出します。
ご覧の通り呼び出しはsharedという共有シングルトンを介して行います。
AppleはなるべくゲームのメインメニューにてAccessPointを呼ぶよう推奨しています。
私はSpriteKitを使っていたので、メニューSceneのdidMoveメソッド内に書きました。
なお、AccessPointは一度呼び出すとSceneをまたいでも消えないので、例えばゲームのプレイ画面などではisActiveをfalseにしてAccessPointを消すようにしましょう。

HogehogeScene.swift
override func didMove(to view: SKView) {
        GKAccessPoint.shared.location = .topLeading
        GKAccessPoint.shared.showHighlights = true
        GKAccessPoint.shared.isActive = true
}

以上です。

参考サイト

https://developer.apple.com/videos/play/wwdc2020/10618

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

StoryBoardの代わりにXibを使う第一歩

環境

Xcode12.3

ゴール

StoryBoardを削除し、Xibから起動する。

プロジェクトを作成

スクリーンショット 2021-01-01 14.06.59.png

ViewControllerとStoryBoardを削除

ViewController.SwiftとMain.storyBoardを選択 > 右クリック > Delete > Move to Trash

Info.plistの設定

(1) Main storyboard file base name > 削除

(2) Application Scene Manifest > Scene Configuration > Application Session Role > Item 0 (Default Configuration) > Storyboard Name > 削除
<注意>(2)も削除しないとエラーになってしまします。

ViewControllerとXibファイルを作成

New File > Cocoa Touch Class > Subclass of: UIViewContoroller > Also create XIB file にチェックを入れる > Next > Create

スクリーンショット 2021-01-01 14.40.28.png
ファイルを2つ作成する事ができました。

スクリーンショット 2021-01-01 14.42.53.png
今回は起動した時にわかり安いようにBackgroundに青色を設定しておきます。

SceneDelegate.swiftを設定

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)で起動時に表示される画面をXibファイルに対応しているViewContorollerにします。

SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
        //ここから下追記
        let window = UIWindow(windowScene: scene as! UIWindowScene)
        self.window = window
        window.makeKeyAndVisible()
        let xibViewController = XibViewController()
        window.rootViewController = xibViewController

    }

シュミレーター起動

スクリーンショット 2021-01-01 15.13.28.png
先ほど設定した、背景が青のXibがしっかり起動しました。

参考

StoryBoardの代わりにxibで画面を実装する
【Swift】iOS13でStoryBoardではなくXibから起動する

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

Date()とCalendar()

dateとCalendarをplaygroundで実験

スクリーンショット 2021-01-01 14.45.15.png

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

2021年より日々更新を目標にします

こんにちは。iOSアプリ開発を勉強しています。
日々更新を目標にします。

2021年元日

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

PlaygroundでSwift Packageを使う

この記事は無理やりSwiftKotlin愛好会アドベントカレンダー 2020の10日目の記事にしましたw

背景

Swift Algorithmsを軽く触ってみた」を書く際にSwift AlgorithmsのSwift PackageをPlaygroundで動かしたかった。

Xcode12からPlaygroundでSwift Packageを使えるようになったらしいのだけどじゃっかんめんどくさかったのでやり方メモしておく

※Xcode12.3で実施。Xcodeの進化でそのうちこんなめんどい手順しなくてもイケるようになるはず。。。

iOS Projectを作る

New -> Project...で適当にProjectを作ります。
今回はiOS->Appで作りました。
Screen Shot 2020-12-31 at 23.51.19.png

PlaygroundをProjectに追加する

New -> Playground... -> iOS BlankでPlaygroundを作ります。

保存するときに先程作成したProjectに追加します。

Screen_Shot_2020-12-31_at_23_59_22.png

Swift Packageを追加する

File -> Swift Packages -> Add Package Dependency...でhttps://github.com/apple/swift-algorithmsを追加する

Screen Shot 2021-01-01 at 0.07.39.png

Playgroundで使う

Playgroundで下記を実装

※ここでなんでかXcodeを再起動しないとAlgorithmsを認識してくれなかった・・・

import Algorithms

let numbers = [10, 20, 30, 40]
for combo in numbers.combinations(ofCount: 2) {
    print(combo)
}

以上!

そのうち
1. workplaceを作る(projectじゃなくて)
2. Playgroundを追加する
3. Swift Packageを追加する
ですんなりイケるようになると嬉しいなという気持ち

Refs

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