- 投稿日:2021-01-01T21:41:36+09:00
【エラー】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.
- 投稿日:2021-01-01T20:38:04+09:00
GKAccessPointの実装
はじめに
iOS14からGameKitでGKAccessPointというものが使えるようになりました。
ランキングを表示するLeaderboardsや、ゲーム内の達成項目を表示するAchievementsにワンタップでアクセスできるようにするボタンのようなものです。
非常に簡単に導入できるので、おすすめです。GKAccessPointとは
以下画像の左上にあるアイコンのようなものです。
画面の四隅のうちどれかに設置することができ、今回私の場合は左上に設置しています。
Appleはなるべく左上に設置することを推奨しています。
AccessPointをタップすると以下のようなGameCenterの画面が表示されます。
このメニュー画面のことをDashboardと呼びます。
AppStoreConnect内でのGameCenterの設定によってDashboardに表示される項目は変わります。
なお、Dashboardを経由せずに直接Leaderboardsやユーザープロフィールを表示させることもできます。
導入前の注意
GKAccessPointには、.showHighlightsというBool型のプロパティがあります。
この値をtrueにすると、AccessPointが表示されるたびに以下のようなユーザーの現在順位や獲得Achievement数についてのハイライトが数秒の間表示されます。なので.showHighlightsをtrueにする場合、このハイライトの表示領域がゲーム画面のUIに被らないよう注意する必要があります。
横画面の場合、AccessPointのポイント数は以下のようになります。(iPhone11Proの場合)
縦幅62pt, 横幅280ptで、セーフエリアは91pt空けておくことが推奨されています。
ちなみに縦画面の場合、縦62pt, 横335ptで、セーフエリアは114pt推奨です。
実装方法
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.swiftstruct 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.swiftclass 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.swiftoverride func didMove(to view: SKView) { GKAccessPoint.shared.location = .topLeading GKAccessPoint.shared.showHighlights = true GKAccessPoint.shared.isActive = true }以上です。
参考サイト
- 投稿日:2021-01-01T15:24:17+09:00
StoryBoardの代わりにXibを使う第一歩
環境
Xcode12.3
ゴール
StoryBoardを削除し、Xibから起動する。
プロジェクトを作成
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
今回は起動した時にわかり安いようにBackgroundに青色を設定しておきます。SceneDelegate.swiftを設定
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
で起動時に表示される画面をXibファイルに対応しているViewContorollerにします。SceneDelegate.swiftfunc 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 }シュミレーター起動
参考
StoryBoardの代わりにxibで画面を実装する
【Swift】iOS13でStoryBoardではなくXibから起動する
- 投稿日:2021-01-01T14:42:01+09:00
2021年より日々更新を目標にします
こんにちは。iOSアプリ開発を勉強しています。
日々更新を目標にします。2021年元日
- 投稿日:2021-01-01T00:19:20+09:00
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で作りました。
PlaygroundをProjectに追加する
New -> Playground... -> iOS BlankでPlaygroundを作ります。
保存するときに先程作成したProjectに追加します。
Swift Packageを追加する
File -> Swift Packages -> Add Package Dependency...で
https://github.com/apple/swift-algorithms
を追加する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