.
675 |
--------------------------------------------------------------------------------
/PlayBook/.gitignore:
--------------------------------------------------------------------------------
1 | book
2 |
--------------------------------------------------------------------------------
/PlayBook/book.toml:
--------------------------------------------------------------------------------
1 | [book]
2 | title = "PlayBook"
3 | authors = ["PlayCover Community"]
4 | src = "src"
5 | language = "en"
6 | multilingual = false
7 |
8 | [output.html]
9 | preferred-dark-theme = "dark"
10 | additional-js = ["prettylink.js"]
11 | git-repository-url = "https://github.com/PlayCover/PlayBook"
12 | git-repository-icon = "fa-github"
13 | edit-url-template = "https://github.com/PlayCover/PlayBook/edit/master/PlayBook/{path}"
14 | nput-404 = "404.md"
15 |
16 | [output.html.print]
17 | enable = false
--------------------------------------------------------------------------------
/PlayBook/prettylink.js:
--------------------------------------------------------------------------------
1 | if (window.location.href.endsWith(".html")) {
2 | history.replaceState(null, "", window.location.href.slice(0, -5));
3 | }
--------------------------------------------------------------------------------
/PlayBook/src/404.md:
--------------------------------------------------------------------------------
1 | ## 404 - That page doesn't seem to exist
2 | > Return [home](./Introduction.md).
--------------------------------------------------------------------------------
/PlayBook/src/Introduction.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
PlayCover
8 |
9 |
10 |
11 | Run iOS apps and games on Apple Silicon Macs with mouse, keyboard and controller support.
12 |
13 |
14 | GitHub
15 | ·
16 | Discord
17 | ·
18 | Website
19 |
20 |
21 | ## About The Project
22 |
23 | Welcome to PlayCover! This software is all about allowing you to run iOS apps and games on Apple Silicon devices running macOS 12.0 or newer.
24 |
25 | PlayCover works by putting applications through a wrapper which imitates an iPad. This allows the apps to run natively and perform very well.
26 |
27 | PlayCover also allows you to map custom touch controls to keyboard, which is not possible in alternative sideloading methods such as Sideloadly.
28 |
29 | These controls include all the essentials, from WASD, camera movement, left and right clicks, and individual keymapping, similar to a popular Android emulator’s keymapping system called Bluestacks.
30 |
31 | This software was originally designed to run Genshin Impact on your Apple Silicon device, but it can now run a wide range of applications. Unfortunately, not all games are supported, and some may have bugs.
32 |
--------------------------------------------------------------------------------
/PlayBook/src/SUMMARY.md:
--------------------------------------------------------------------------------
1 | # Summary
2 |
3 | [Introduction](./Introduction.md)
4 |
5 | - [Getting Started](./getting_started/README.md)
6 |
7 | - [Download & Install PlayCover](./getting_started/download_playcover.md)
8 | - [Download, Install, and Update iOS .ipa files](./getting_started/download_ipa.md)
9 | - [Troubleshoot App Login Issues](./getting_started/troubleshoot_login.md)
10 | - [Migrating from an Older Version](./getting_started/migrating.md)
11 |
12 | - [Keymapping](./keymapping/README.md)
13 |
14 | - [Using & Making Keymaps](./keymapping/using_making_keymaps.md)
15 | - [Importing & Exporting Keymaps](./keymapping/import_export_keymaps.md)
16 | - [Common Issues](./keymapping/common_issues.md)
17 |
18 | - [Settings](./settings/README.md)
19 |
20 | - [Keymapping](./settings/keymapping.md)
21 | - [Graphics](./settings/graphics.md)
22 | - [Jailbreak Bypass](./settings/jailbreak_bypass.md)
23 | - [Miscellaneous](./settings/miscellaneous.md)
24 |
25 | - [Other features](./other_features/README.md)
26 |
27 | - [Sideloadly Export](./other_features/sideloadly_export.md)
28 | - [Account Manager](./other_features/account_manager.md)
29 | - [PlayCover Settings](./other_features/playcover_settings.md)
30 | - [IPA Library](./other_features/ipa_library.md)
31 |
32 | - [Miscellaneous](./miscellaneous/README.md)
33 |
34 | - [Blocked Apps](./miscellaneous/blocked_apps.md)
35 | - [Configuring Entitlements for Jailbreak Bypass](./miscellaneous/entitlements.md)
36 | - [In-app Purchases](./miscellaneous/app_purchases.md)
37 | - [PlayChain](./miscellaneous/playchain.md)
38 | - [Photo Storage](./miscellaneous/photo_storage.md)
39 | - [Related Projects and Utilities](./miscellaneous/projects_utilities.md)
40 | - [Running Apps with Xcode](./miscellaneous/run_with_xcode.md)
41 |
42 | - [Building from Source](./building_from_source/README.md)
43 |
44 | - [Why Build From Source?](building_from_source/why_build.md)
45 | - [Install Prerequisites](./building_from_source/install_prerequisites.md)
46 | - [Building](./building_from_source/building.md)
47 |
48 | - [Contributing](./contributing/README.md)
49 | - [Forking & Making PRs](./contributing/forking_making_pr.md)
50 | - [Code of Conduct](./contributing/code_of_conduct.md)
51 |
--------------------------------------------------------------------------------
/PlayBook/src/building_from_source/README.md:
--------------------------------------------------------------------------------
1 | # Building From Source
2 |
3 | - [Why Build From Source?](./why_build.md)
4 | - [Install Prerequisites](./install_prerequisites.md)
5 | - [Building](./building.md)
6 |
--------------------------------------------------------------------------------
/PlayBook/src/building_from_source/building.md:
--------------------------------------------------------------------------------
1 | # Building
2 | If you haven't already, follow the instructions in [Install Prerequisites](./install_prerequisites.md).
3 |
4 | ## 1. Getting the Source
5 |
6 | You have a couple of options to go about this:
7 |
8 | 1. `git clone`
9 | Open a terminal, and run the following commands:
10 | ```
11 | git clone https://github.com/PlayCover/PlayCover.git
12 | ```
13 |
14 | That will download the code to a PlayCover folder in your current working directory. (If you don't know where that is, run `pwd`).
15 |
16 | 2. A Git GUI client (Recommended for more serious development)
17 | Git is a complex program, and a GUI can help you deal it's complexities. A couple of good clients are [Tower](https://www.git-tower.com/) and [GitKraken](https://www.gitkraken.com/).
18 |
19 | We recommend Tower more than GitKraken, but either one is fine. Both are available for free through the [Github Student Developer Pack](https://education.github.com/pack).
20 |
21 | Please refer to your client's documentation for how to clone a repo:
22 |
23 | [Tower docs](https://www.git-tower.com/help/guides/manage-repositories/clone-remote-repository/)
24 |
25 | [GitKraken docs](https://help.gitkraken.com/gitkraken-client/open-clone-init/#cloning-an-existing-project)
26 |
27 | 3. Downloading a ZIP (discouraged)
28 | This option is discouraged because it does not download the git repo, only the source. You will not be able to contribute to PlayCover using this option.
29 |
30 | On PlayCover's GitHub Repo, click the green `<>` or `Code` button, located near the bottom right of the screenshot below.
31 |
32 | 
33 |
34 | In the sheet that appears, click the "Download ZIP" button near the bottom.
35 |
36 | ## 2. Apple Developer Account
37 |
38 | In order to build PlayCover, you'll need a free Apple Developer Account. Head on over to [developer.apple.com/account](https://developer.apple.com/account) to sign up. (You will use your pre-existing Apple ID).
39 |
40 | DO NOT start to enroll in the Apple Developer Program, as that is not required to build PlayCover, and stating to enroll can lock your account for an indeterminate amount of time.
41 |
42 | ## 3. Adding your Apple ID to Xcode
43 |
44 | Open Xcode, and then select `Xcode -> Preferences...` in the menu bar.
45 |
46 | ![]()
47 |
48 | In the new window that appears, select the "Accounts" tab, and press the "+" button in the bottom left.
49 |
50 | ![]()
51 |
52 | When asked, select to add an "Apple ID"
53 |
54 | ![]()
55 |
56 | Then, sign in with your Apple ID like normal.
57 |
58 | ## 4. Adjusting Signing Settings
59 |
60 | Find the `PlayCover.xcodeproj` file, located in the source folder that you downloaded in step 1, and open it in Xcode. A window like the one below should appear.
61 |
62 | ![]()
63 |
64 | On the left-hand side, click on the blue "PlayCover" file. The center part of the window should fill with metadata about the project.
65 |
66 | ![]()
67 |
68 | In the center view, select the PlayCover application on the left, and then navigate to the "Signing & Capabilities" tab.
69 |
70 | ![]()
71 |
72 | Enable the "Automatically Manage Signing" option, and change the current signing team to the signing team with your name.
73 |
74 | ![]()
75 |
76 | You may have to repeat the last step for the Release signing settings, if they appear.
77 |
78 | ## 5. Resolving Package Caches
79 |
80 | Sometimes the swift package manager doesn't want to, so you may have to clear the package cache. You can do this by selecting `File -> Swift Package Manager -> Clear Package Cache`.
81 |
82 | ![]()
83 |
84 | Then wait for the packages to download. You can see them in the left panel, below all the source files. When they are done, the packages should display a version number beside their name.
85 |
86 | ![]()
87 |
88 | ## 6. Actually Building the Thing
89 |
90 | In the top left corner of the Xcode Project, click on the play button.
91 |
92 | ![]()
93 |
94 | Wait a few minutes for PlayCover to build for the first time. If the build is successful, then your custom built version of PlayCover will open automatically. If the build fails, well then you might have skipped a step.
95 |
96 | If you get a build error relating to `carthage` or `swiftlint`, make sure that you installed all the prerequisites in [Install Prerequisites](install_prerequisites.md)
97 |
98 | If you get a "Cannot find signing team ..." build error, make sure that you followed the [Adjusting Signing Settings](#step-4-adjusting-signing-settings) steps correctly.
99 |
100 | If none of those apply to you, then please join our [discord server](https://discord.gg/playcover), and ask for help in `#code-help`.
--------------------------------------------------------------------------------
/PlayBook/src/building_from_source/install_prerequisites.md:
--------------------------------------------------------------------------------
1 | # Install Prerequisites
2 |
3 | You will need to install a few prerequisites before you can build PlayCover:
4 |
5 | ## 1. Install Xcode
6 | Firstly, you will need Xcode for building PlayCover. Xcode is the editor that Apple created and it is the simplest way to build Swift apps. Keep in mind that it will take a considerable amount of disk space to install it. (Set aside around 30 GB for it).
7 |
8 | There are a couple of options for downloading Xcode:
9 |
10 | 1. Download Xcode from the [App Store](https://apps.apple.com/us/app/xcode/id497799835).
11 |
12 | 2. Use [Xcodes.app](https://github.com/RobotsAndPencils/XcodesApp) to download and manage your Xcode install(s). (Recommended for more serious development)
13 |
14 | ## 2. Install Homebrew
15 | Follow the instructions [on Homebrew's homepage](https://brew.sh) to install Homebrew.
16 |
17 | ## 3. Install Carthage
18 | Now, open Terminal and run the following command:
19 | ```
20 | brew update && brew install carthage
21 | ```
22 |
23 | ## 4. Install SwiftLint
24 | Run the following command in Terminal:
25 | ```
26 | brew install swiftlint
27 | ```
28 |
29 |
30 | You're now ready to move on to [Building](building.md).
--------------------------------------------------------------------------------
/PlayBook/src/building_from_source/why_build.md:
--------------------------------------------------------------------------------
1 | # Why Build from Source?
2 |
3 | Building from source is largely intended for developers who wish to make contributions to PlayCover, and is not recommend for those without prior experience making apps.
4 |
5 | If you want access to features before they are released, you can check out nightly builds [here](https://nightly.link/PlayCover/PlayCover/workflows/2.nightly_release/develop).
6 |
7 | If you want to contribute code to PlayCover, continue on to [Install Prerequisites](./install_prerequisites.md).
--------------------------------------------------------------------------------
/PlayBook/src/contributing/README.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | - [Forking & Making PRs](./forking_making_pr.md)
4 | - [Code of Conduct](./code_of_conduct.md)
5 |
--------------------------------------------------------------------------------
/PlayBook/src/contributing/code_of_conduct.md:
--------------------------------------------------------------------------------
1 | # Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | .
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | .
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]:
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | . Translations are available at
128 | .
--------------------------------------------------------------------------------
/PlayBook/src/contributing/forking_making_pr.md:
--------------------------------------------------------------------------------
1 | # Forking & Making PRs
2 |
3 | When creating PRs for PlayCover, there are a couple things to keep in mind.
4 |
5 | ## General Rules
6 |
7 | ### 1. Your PR Must be Substantial
8 |
9 | Minor spelling corrections or other small fixes that have no bearing on the functionality of the app will largely be rejected. If you are creating a Pull Request, make sure there is a large enough change to warrant it.
10 |
11 | ### 2. Is your PR Needed?
12 |
13 | Make sure that any PR you create is only for a feature that is actively needed. Excess unused features serve only to bloat the codebase. If your feature is deemed out of scope or unnecessary, it will be rejected.
14 |
15 | ### 3. Check the Project Board & Other PRs
16 |
17 | Make sure that the issue that you are working on is not already in progress by someone else. Check both the `In Progress` section of the GH Project Board, and other open PRs to see if someone else is already working on it.
18 |
19 | ### 4. SwiftLint & Code Quality
20 |
21 | Make sure that your code is:
22 |
23 | 1. In English
24 | 2. Passes SwiftLint checks
25 | 3. Is of good and readable quality
26 |
27 | Failure to meet these requirements will likely result in your PR being rejected, or these issues being raised in a review. If you are writing a particuarly complex piece of code, or something that uses low-level APIs or trickery, document its functionality thoroughly.
28 |
29 | ### 5. Locale Compliance
30 |
31 | If your PR adds any new strings that aren't logs or errors, they must be correctly added to the locale files.
32 |
33 | ### 6. Presentation & Descriptions
34 |
35 | When possible it is recommended to supply a clear description of your PR. If your PR contains UI changes, include screenshots as well.
36 |
37 | ## Opening a Pull Request
38 |
39 | If you have a suggestion that could improve [PlayCover](https://github.com/PlayCover/PlayCover) or any other of its [repositories](https://github.com/PlayCover), please fork the corresponding repository and create a pull request. Don't forget to give the project a star! Thanks again!
40 |
41 | 1. Fork the Project
42 | 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
43 | 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
44 | 4. Push to the Branch (`git push origin feature/AmazingFeature`)
45 | 5. Open a Pull Request
46 |
47 | ## Reviews & Merging
48 |
49 | It may take some time for your code to be reviewed or merged. Remember, PlayCover is an open-source project, and everyone is contributing out of their own free time. There are therefore periods where there will be no one available to review or merge your code for days or potentially weeks. Remain patient, it will be looked at in time.
50 |
51 | When you receive a review, make sure to courteously and professionally respond to concerns or feedback. Always keep your responces in line with the [Code of Conduct](./code_of_conduct.md). Failure to compile with these rules will result in your PR getting rejected, and potentially having any future contributions banned.
52 |
53 | After a few pull requests (Minor tweaks, UI fixes, Major refactors, implementing core features, etc...), you may recieve a `Contributor` role in the [Discord](https://discord.gg/rMv5qxGTGC) which will also give you access to `#contributors-chat`.
54 |
55 | All contributors are credited on the [website](https://playcover.io/contributors/).
56 |
--------------------------------------------------------------------------------
/PlayBook/src/getting_started/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started
2 |
3 | - [Download & Install PlayCover](./download_playcover.md)
4 | - [Download, Install, and Update iOS .ipa files](./download_ipa.md)
5 | - [Troubleshoot App Login Issues](./troubleshoot_login.md)
6 | - [Migrating from an Older Version](./migrating.md)
7 |
--------------------------------------------------------------------------------
/PlayBook/src/getting_started/download_ipa.md:
--------------------------------------------------------------------------------
1 | # Download, Install, and Update iOS .ipa files
2 |
3 | `.ipa` files must be decrypted to add them to PlayCover. Quite often, the app you're looking for will already be decrypted.
4 |
5 | ## Downloading
6 |
7 | There are many sources online for decrypted `.ipa` files. Listed below are some recommended ones as they can vary in quality, speed, and recentness.
8 |
9 | ### Suggested Sources:
10 |
11 | #### External Websites
12 |
13 | | Icon | Website Name | Link |
14 | | :-----------------------------------------------------: | :-------------------------: | :---------------------------------------------------------------: |
15 | |
| Decrypt IPA Store | [decrypt.day](https://decrypt.day/) |
16 | |
| Decrypted iOS IPA App Store | [armconverter.com](https://armconverter.com/decryptedappstore/us) |
17 |
18 | > **Note**: These are external sites and we cannot verify the quality or safety of the downloads. Use at your own risk.
19 |
20 | #### Decrypt Yourself
21 |
22 | You can decrypt your own `.ipa` files including of paid apps you've already bought using a Jailbroken iOS device. There are many guides online on how to do this.
23 |
24 | > **Note**: This will require some technical knowledge, will most likely invalidate your warranty, and may permanently damage your device. PlayCover assumes no responsibility for any damages incurred from suggested sources.
25 |
26 | ## Installing
27 |
28 | Installing decrypted `.ipa` files is simple. You can drag and drop the file into the PlayCover window, or click on the 'Add app' button to select the `.ipa` file in Finder.
29 |
30 |
31 |
32 | If you run into issues, verify that `Xcode Command Line Tools` are installed, see [Download & Install PlayCover](./download_playcover.md#installing) for more info.
33 |
34 | Some apps that contain logins like Genshin Impact will require additional steps to work. You can find the instructions in [Troubleshoot App Login Issues](./troubleshoot_login.md).
35 |
36 | > **Note**: Not all apps are supported. If you run into issues not covered in this documentation you can ask for help on the [_PlayCover Discord Server_](https://discord.gg/RNCHsQHr3S).
37 |
38 | ## Updating
39 |
40 | To update an app, you can add it to the **App Library** the same way as you first installed it, either by clicking the 'Add app' button to select the `.ipa` file in Finder, or drag and drop it into PlayCover. The new version of the app will replace the old one while keeping all your logins and data.
41 |
42 | ###### This information is up-to-date as of PlayCover `2.0.2`
43 |
--------------------------------------------------------------------------------
/PlayBook/src/getting_started/download_playcover.md:
--------------------------------------------------------------------------------
1 | # Download & Install PlayCover
2 |
3 | ## Prerequisites
4 |
5 | PlayCover only works on **Apple Silicon Macs**. The minimum hardware requirement is an Apple M1 chip, but PlayCover will also work on all Apple Silicon chips released after the M1.
6 |
7 | If you have an Intel Mac, you can explore alternatives like Bootcamp or emulators.
8 |
9 | ## Download
10 |
11 | You can download the latest stable release from [Github](https://github.com/PlayCover/PlayCover/releases/latest) or [Gitee](https://gitee.com/playcover_community/PlayCover/releases), or download the [latest nightly version](https://nightly.link/playcover/playcover/workflows/2.nightly_release/develop) to test out experimental features before they are added to the stable release.
12 |
13 | You can also [build from source](https://docs.playcover.io/building_from_source/install_prerequisites) if you wish to make contributions to PlayCover.
14 |
15 | ## Installing
16 |
17 | - Drag PlayCover into your Applications folder.
18 |
19 |
20 |
21 | > __Note__: PlayCover won't work if it isn't in the Applications folder.
22 |
23 | - Then double click to open and click `Open` on the system prompt.
24 |
25 |
26 |

27 |
28 |

29 |
30 |
31 | ## Homebrew Cask
32 | We host a [Homebrew](https://brew.sh) [tap](https://github.com/PlayCover/homebrew-playcover) with the [PlayCover cask](https://github.com/PlayCover/homebrew-playcover/blob/master/Casks/playcover-community.rb) for stable releases `playcover-community`, as well as the casks for prereleases `playcover-prerelease` and nightlies `playcover-nightly`.
33 |
34 | To install:
35 | 1. Tap `PlayCover/playcover` with `brew tap PlayCover/playcover`;
36 | 2. Install PlayCover with `brew install --cask playcover-community`.
37 |
38 | To uninstall:
39 | 1. Remove PlayCover using `brew uninstall --cask playcover-community`;
40 | 2. Untap `PlayCover/playcover` with `brew untap PlayCover/playcover`.
41 |
42 | ###### This information is up-to-date as of PlayCover 2.0.2
43 |
--------------------------------------------------------------------------------
/PlayBook/src/getting_started/migrating.md:
--------------------------------------------------------------------------------
1 | # Migrating
2 |
3 | This page contains instructions on how to migrate/update from an older version of PlayCover to version 2.0 and newer. You can check your current version from the menu bar by clicking `PlayCover` > `About PlayCover`
4 |
5 |
6 |
7 | ## Versions 1.0.6 to 1.1.1 (Community build)
8 | If you were using one of these versions, you don't need to reinstall your apps and most of your settings/keymapping will be converted. However, some settings could still require a few modifications. Here are a few things that you might want to change.
9 |
10 | You can open the settings by selecting on an app and clicking on the **gear button** on top.
11 |
12 |
13 |
14 | You can also get to this screen by right clicking on an app and clicking **Settings**.
15 |
16 |
17 |
18 | ### Updating your performance settings
19 | If you change your tab to **Graphics** in your app settings, you should see a few options.
20 |
21 |
22 |
23 | For the best graphical quality, choose `iPad Pro (12.9-inch) (5th gen) | M1 | 8GB` or newer as the iOS device. (Recommended for more powerful computers with active cooling such as MacBook Pro, iMac, Mac mini, and Mac Studio)
24 |
25 | For the best performance, choose `iPad Pro (12.9-inch) (3th gen) | A12Z | 4GB` or older as the iOS device. (Recommended for more power efficient laptops with passive cooling such as MacBook Air)
26 |
27 |
28 |
29 | ### Updating your resolution settings
30 | You may need to change your resolution depending on what app you are using. **Auto (Based on Display)** works fine for most games, while other apps typically use **App Default** or **Custom**. If you are using a resolution preset such as **1080p**, you might need to choose an aspect ratio that matches your monitor to avoid letterboxing.
31 |
32 |
33 |
34 | >__Note__: Resolution has a significant impact on graphical quality and performance. Using higher resolutions will improve visuals at the cost of performance, and using lower resolutions will improve performance at the cost of visual quality.
35 |
36 | ### Updating your apps
37 | If you installed an app on an older build of PlayCover (before `2.0.0`) and try to update the same app to a newer version on a newer build of PlayCover (`2.0.0` and after), you may encounter an issue where the newer version of the app will fail to replace the older version and two of the same app icons will be present at the same time. This will mainly happen with apps that have a space in their name.
38 |
39 |
40 |
41 | When this happens, follow these steps to safely uninstall the older version without losing your logins and data.
42 |
43 | 1. Go to `Menu Bar` > `PlayCover` > `Settings...` > `Uninstall`
44 | 2. Make sure the **Show warning popup** box is checked
45 | 3. Go to your **App Library**, select the **list view** instead of icon view
46 | 4. You can now see the version numbers of the duplicate apps
47 | 5. Click on the older version of the app you want to remove
48 | 6. Right click on the app and choose `Uninstall App`
49 | 7. When you see the uninstall confirmation popup, **uncheck** every box
50 | 8. Click on `Uninstall`
51 |
52 | When you open the newer version of the app, your logins and data should now be carried over.
53 |
54 | ## Versions 1.0.5 and earlier (Or non-community build)
55 | If you were using one of these versions, you need to reinstall your apps. It is **HIGHLY SUGGESTED** to **NOT** transfer your apps from the old version, as you may run into numerous issues. You can delete the old folder if you want to free up storage at this location: `~/Library/Containers/me.playcover.PlayCover`. You should also perform the steps for 1.0.6 to 1.1.1, as that setup might be useful for you too.
56 |
57 | ###### This information is up-to-date as of PlayCover `2.0.3`
58 |
--------------------------------------------------------------------------------
/PlayBook/src/getting_started/troubleshoot_login.md:
--------------------------------------------------------------------------------
1 | # Troubleshoot App Login Issues
2 |
3 | Follow these instructions to fix issues preventing you from logging in to apps like Genshin Impact. As always, if you run into issues not covered in the documentation, you can ask for help on the [PlayCover Discord Server](https://discord.gg/rMv5qxGTGC).
4 |
5 | >__Note__: The instructions below use Genshin Impact as an example, but the same process will work for a wide range of apps.
6 |
7 | 1. Disable SIP (System Integrity Protection)
8 | - First shut down your Mac completely so the screen is black and all other lights are off
9 | - Press down and hold the power/Touch ID button until `Loading startup options` appears
10 | - Select `Options` and continue
11 | - If prompted, select the correct storage disk
12 | - Log in with your administrator account
13 | - When `Utilities` appears in the menu bar, click on it and choose `Terminal`
14 | - In the terminal window type `csrutil disable` and type your password when prompted
15 | - Wait for `Successfully disabled System Integrity Protection` to appear, then restart your Mac
16 |
17 | 2. Modify `nvram boot-args`
18 | - After disabling SIP, log back in to your macOS account
19 | - Press `command ⌘` + `space bar` to open Spotlight Search and type in `terminal`
20 | - Open the Terminal app, then copy and paste the following:
21 | - `sudo nvram boot-args="amfi_get_out_of_my_way=0x1 ipc_control_port_options=0"`
22 | - If prompted, authenticate with your password
23 | - If it appears that nothing has happened, this is normal
24 | - Restart your Mac
25 |
26 | 3. Login to Genshin Impact
27 | - Open PlayCover
28 | - Open Genshin Impact and you should be greeted with a login screen
29 | - Log in to your account and complete the captcha as required
30 | - **DO NOT ENTER WHEN THE DOOR APPEARS**[^1]
31 | - Close the game using `command ⌘` + `Q` to avoid accidentally entering the door
32 |
33 | 4. Re-enable SIP
34 | - Follow the steps in Step 1 to re-enter startup options
35 | - When `Utilities` appears in the menu bar, click on it and choose `Terminal`
36 | - In the terminal window type `csrutil enable` and type your password when prompted
37 | - Wait for `Successfully enabled System Integrity Protection` to appear, then restart your Mac[^2]
38 |
39 | 5. Open Genshin Impact
40 | - You're done! Enjoy playing Genshin!
41 |
42 | If you have tried this and still cannot login, try `sudo nvram boot-args="amfi_get_out_of_my_way=1"` as boot-args instead of the ones above. You can also try deleting any items related to your game in Keychain Access (type `keychain access` in Spotlight Search to open it), as well as enabling jailbreak detection bypass in your app settings. Additional login issues may be solved by clearing app preferences.
43 |
44 | If your app still does not work, you can [open an app/game support request](https://github.com/PlayCover/PlayCover/issues/new/choose) if no one else has done so already.
45 |
46 | [^1]: If you enter the door while SIP is disabled, you will not be able to login to the game when you re-enable SIP afterwards. If you have accidentally entered the door, you can try deleting Genshin related items in Keychain Access (search for `genshin` and `mihoyo`), then repeating the troubleshooting process from step 1.
47 |
48 | [^2]: The changes we made with the `nvram boot-args` command earlier will be disabled when SIP is on, however macOS will remember that we made those changes and will apply them the next time you disable SIP. Fully reverting these changes isn't neccassary for most users, but you can do so by running `sudo nvram boot-args=""` in the macOS terminal.
49 |
50 | ###### This information is up-to-date as of PlayCover `2.0.2`
51 |
--------------------------------------------------------------------------------
/PlayBook/src/images/about_playcover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/about_playcover.png
--------------------------------------------------------------------------------
/PlayBook/src/images/add_app_button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/add_app_button.png
--------------------------------------------------------------------------------
/PlayBook/src/images/arm_converter_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/arm_converter_logo.png
--------------------------------------------------------------------------------
/PlayBook/src/images/auth_prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/auth_prompt.png
--------------------------------------------------------------------------------
/PlayBook/src/images/custom-discord-activity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/custom-discord-activity.png
--------------------------------------------------------------------------------
/PlayBook/src/images/decrypt_day_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/decrypt_day_logo.png
--------------------------------------------------------------------------------
/PlayBook/src/images/delete_account_confirm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/delete_account_confirm.png
--------------------------------------------------------------------------------
/PlayBook/src/images/delete_account_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/delete_account_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/images/delete_account_prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/delete_account_prompt.png
--------------------------------------------------------------------------------
/PlayBook/src/images/duplicate_genshin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/duplicate_genshin.png
--------------------------------------------------------------------------------
/PlayBook/src/images/export_keymapping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/export_keymapping.png
--------------------------------------------------------------------------------
/PlayBook/src/images/export_keymapping_light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/export_keymapping_light.png
--------------------------------------------------------------------------------
/PlayBook/src/images/export_to_sideloadly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/export_to_sideloadly.png
--------------------------------------------------------------------------------
/PlayBook/src/images/gear_button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/gear_button.png
--------------------------------------------------------------------------------
/PlayBook/src/images/genshin_metal_hud.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/genshin_metal_hud.png
--------------------------------------------------------------------------------
/PlayBook/src/images/github_code_button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/github_code_button.png
--------------------------------------------------------------------------------
/PlayBook/src/images/graphics_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/graphics_settings.png
--------------------------------------------------------------------------------
/PlayBook/src/images/import_keymapping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/import_keymapping.png
--------------------------------------------------------------------------------
/PlayBook/src/images/import_keymapping_light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/import_keymapping_light.png
--------------------------------------------------------------------------------
/PlayBook/src/images/ios_model_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/ios_model_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/images/ipa_add_source.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/ipa_add_source.png
--------------------------------------------------------------------------------
/PlayBook/src/images/ipa_downloading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/ipa_downloading.png
--------------------------------------------------------------------------------
/PlayBook/src/images/ipa_library_grid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/ipa_library_grid.png
--------------------------------------------------------------------------------
/PlayBook/src/images/ipa_library_list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/ipa_library_list.png
--------------------------------------------------------------------------------
/PlayBook/src/images/jailbreak_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/jailbreak_settings.png
--------------------------------------------------------------------------------
/PlayBook/src/images/keymap_editor dpad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/keymap_editor dpad.png
--------------------------------------------------------------------------------
/PlayBook/src/images/keymap_editor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/keymap_editor.png
--------------------------------------------------------------------------------
/PlayBook/src/images/keymap_editor_arrows.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/keymap_editor_arrows.png
--------------------------------------------------------------------------------
/PlayBook/src/images/keymap_editor_circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/keymap_editor_circle.png
--------------------------------------------------------------------------------
/PlayBook/src/images/keymap_editor_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/keymap_editor_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/images/keymap_editor_mouse.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/keymap_editor_mouse.png
--------------------------------------------------------------------------------
/PlayBook/src/images/keymapping_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/keymapping_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/images/keymapping_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/keymapping_settings.png
--------------------------------------------------------------------------------
/PlayBook/src/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/logo.png
--------------------------------------------------------------------------------
/PlayBook/src/images/metal_hud_closeup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/metal_hud_closeup.png
--------------------------------------------------------------------------------
/PlayBook/src/images/misc_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/misc_settings.png
--------------------------------------------------------------------------------
/PlayBook/src/images/no-playtools-settings-view.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/no-playtools-settings-view.png
--------------------------------------------------------------------------------
/PlayBook/src/images/no-playtools.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/no-playtools.png
--------------------------------------------------------------------------------
/PlayBook/src/images/open_playcover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/open_playcover.png
--------------------------------------------------------------------------------
/PlayBook/src/images/open_prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/open_prompt.png
--------------------------------------------------------------------------------
/PlayBook/src/images/photos_access.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/photos_access.png
--------------------------------------------------------------------------------
/PlayBook/src/images/playcover_dmg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/playcover_dmg.png
--------------------------------------------------------------------------------
/PlayBook/src/images/playcover_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/playcover_settings.png
--------------------------------------------------------------------------------
/PlayBook/src/images/releases.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/releases.png
--------------------------------------------------------------------------------
/PlayBook/src/images/resolution_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/resolution_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/images/resolution_menu_selected.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/resolution_menu_selected.png
--------------------------------------------------------------------------------
/PlayBook/src/images/restore_account_prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/restore_account_prompt.png
--------------------------------------------------------------------------------
/PlayBook/src/images/rotate_display_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/rotate_display_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/images/select_account_prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/select_account_prompt.png
--------------------------------------------------------------------------------
/PlayBook/src/images/settings_install.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/settings_install.png
--------------------------------------------------------------------------------
/PlayBook/src/images/settings_ipa_sources.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/settings_ipa_sources.png
--------------------------------------------------------------------------------
/PlayBook/src/images/settings_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/settings_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/images/settings_uninstall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/settings_uninstall.png
--------------------------------------------------------------------------------
/PlayBook/src/images/settings_updates.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/settings_updates.png
--------------------------------------------------------------------------------
/PlayBook/src/images/sideways_impact_3rd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/sideways_impact_3rd.png
--------------------------------------------------------------------------------
/PlayBook/src/images/store_account_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/store_account_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/images/store_account_prompt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/store_account_prompt.png
--------------------------------------------------------------------------------
/PlayBook/src/images/switch_account_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/src/images/switch_account_menu.png
--------------------------------------------------------------------------------
/PlayBook/src/keymapping/README.md:
--------------------------------------------------------------------------------
1 | # Keymapping
2 |
3 | - [Using & Making Keymaps](./using_making_keymaps.md)
4 | - [Importing & Exporting Keymaps](./import_export_keymaps.md)
5 | - [Common Issues](./common_issues.md)
6 |
--------------------------------------------------------------------------------
/PlayBook/src/keymapping/common_issues.md:
--------------------------------------------------------------------------------
1 | # Common Issues
2 |
3 | ## Key presses are not working or getting stuck, but mouse clicks are working
4 |
5 | >__Note__: Most keymapping issues will fix themselves when you update to macOS Ventura 13.1 or newer. You can ignore the following information if you have the update installed already. If you are still having issues after updating, check the issues in [_PlayTools_](https://github.com/PlayCover/PlayTools) and [_PlayCover_](https://github.com/PlayCover/PlayCover/issues) before opening a new one. You may create a support post in the [_Discussion forums_](https://github.com/PlayCover/PlayCover/discussions) or the [_PlayCover Discord_](https://discord.gg/rMv5qxGTGC) for further help.
6 |
7 | Occasionally, keymaps may become unresponsive on macOS versions older than 13.1. This may occur if you use `command ⌘` + `tab` to quickly switch between apps before unlocking your mouse, or may occur randomly for no apparent reason. This issue will resolve itself if you update to macOS Ventura 13.1 or newer, but if you are unable to, here are steps you can try as a temporary fix:
8 |
9 | 1. Press `option ⌥` to release the mouse, and then press `option ⌥` again to enable keymapping. You may have to do this a couple times to regain control.
10 | 2. Use `command ⌘` + `K` to open the Keymapping Editor, and press `command ⌘` + `K` again to close it.
11 | 3. If the above doesn't work, restart the app.
12 | 4. If it still doesn't work after restarting the app, save any work you have open and restart your Mac.
13 |
14 | ## Key presses are working, but don't touch where you want in-game
15 |
16 | This is likely caused by using a keymap file not made for your app's aspect ratio. There are multiple ways to solve this problem:
17 | * You can change the aspect ratio to one that matches the keymap by going to your app settings (see [Graphics](../settings/graphics.md))
18 | * Try importing a different keymap that matches your aspect ratio
19 | * Open the Keymapping Editor in-game by pressing `command` + `K` and manually move the buttons into their correct positions (see [Using & Making Keymaps](../keymapping/using_making_keymaps.md))
20 |
21 | ## Mouse input lagging or camera zooming in and out randomly in-game
22 |
23 | This issue may occur with some more demanding games (such as Genshin Impact) and can be caused by many different reasons.
24 |
25 | | Issue | Solution |
26 | | ---- | ---- |
27 | | Camera stuttering and/or input lag when using external mouse | Delete the circle shaped mouse input and add the rounded square mouse control area. See [Using & Making Keymaps](../keymapping/using_making_keymaps.md) for more info. |
28 | | Camera stuttering and/or input lag when using Low Power Mode | Turn off Low Power Mode, it is known to hinder performance in more demanding games when playing at 60 FPS or higher. You can also try keeping Low Power Mode enabled but lowering the FPS cap to 30. |
29 | | Camera stuttering and/or input lag when playing at high resolutions or graphical settings | Your Mac might not be powerful enough to handle these settings smoothly. You can try the following: reducing the resolution from app settings, selecting an older iPad identifier, or lowering graphical settings in-game. For more info, see [Graphics](../settings/graphics.md). |
30 | | Camera stuttering and/or input lag when using playing games on older versions of PlayCover (1.1.1 and before) | Legacy versions of PlayCover are no longer supported and the majority of bugs are fixed in newer builds. You can update to the [latest version of PlayCover](https://github.com/PlayCover/PlayCover/releases/latest). |
31 | | Camera randomly zooms in and out when trying to move the character | Try restarting the game or reducing the size of the WASD input area. See [Using & Making Keymaps](../keymapping/using_making_keymaps.md) for more info. |
32 |
33 | >__Note__: If you still have issues after trying these solutions, or if you encounter problems not listed here. You can check if the issue has been reported already in [_PlayTools_](https://github.com/PlayCover/PlayTools) and [_PlayCover_](https://github.com/PlayCover/PlayCover/issues), if not, you can open a new bug report. Additionally, you may create a support post in the [_Discussion forums_](https://github.com/PlayCover/PlayCover/discussions) or the [_PlayCover Discord_](https://discord.gg/rMv5qxGTGC) for further help.
34 |
35 | ## Screen turns sideways or not in the expected orientation
36 |
37 | Some apps may rotate the display area incorrectly when you click on certain in-game buttons. Normally on a phone, these buttons require you to hold it in portrait orientation instead of landscape.
38 |
39 | For example: clicking on the **View** button in the Valkyrie menu in Honkai Impact 3rd.
40 |
41 |
42 |
43 | When this happens, you can try these steps to fix it without having to restart the app.
44 |
45 |
46 |
47 | 1. Press `command ⌘` + `R` to rotate the window, you can also do this by clicking on `Menu bar` > `Keymapping` > `Rotate display area`.
48 | 2. If doing the above does not work for the first time, keep pressing `command ⌘` + `R` until the app returns to its correct orientation.
49 | 3. If the issue still remain after these steps, restart the app.
50 |
51 | >__Note__: This feature is only meant to fix rotation issues while the app is running. The rotation you selected will not be saved when you close the app.
52 |
53 | ###### This information is up-to-date as of PlayCover 2.0.4
54 |
--------------------------------------------------------------------------------
/PlayBook/src/keymapping/import_export_keymaps.md:
--------------------------------------------------------------------------------
1 | # Importing & Exporting Keymaps
2 |
3 | Keymaps can be imported and exported easily to share them with other PlayCover users.
4 |
5 | ## Importing Keymaps
6 |
7 |
8 |
9 | 1. Download the `.playmap` file from [#keymap-showcase](https://discord.com/channels/871829896492642387/922068254569160745) or from the [keymaps repository](https://github.com/PlayCover/keymaps).
10 | 2. Open PlayCover and right click the app you wish to import the keymap to
11 | 3. Click on `Import Keymapping`
12 | 4. Select the previously downloaded `.playmap` file
13 | > __Note__: Legacy keymaps from older versions of PlayCover (prior to 2.0.0 or PlayTools 2.0.0) will need to be converted to work on newer versions. Conversion is performed automatically.
14 |
15 | ## Exporting Keymaps
16 |
17 |
18 |
19 | 1. Open PlayCover and right click the app you wish to export the keymap from
20 | 2. Click on `Export Keymapping`
21 | 3. Select the folder you would like to export the `.playmap` file to
22 | 4. Press `Open` to export the keymap to the folder selected
23 | > __Note__: Keymaps exported from newer versions of PlayCover will not work on older versions.
24 |
25 | ###### This information is up-to-date as of PlayCover 2.0.2
26 |
--------------------------------------------------------------------------------
/PlayBook/src/keymapping/using_making_keymaps.md:
--------------------------------------------------------------------------------
1 | # Using & Making Keymaps
2 |
3 | Many apps and games already have full keymaps available on our [Keymaps repository](https://github.com/PlayCover/keymaps). Additionally, you can find them on the [PlayCover Discord](https://discord.gg/rMv5qxGTGC) `#keymapping` channel.
4 |
5 | >__Note__: If you want to add or share keymaps, see [_Importing & Exporting Keymaps_](./import_export_keymaps.md) for more information.
6 |
7 | ## Using Keymapping
8 |
9 | Once you've finished importing or creating your keymap, you can toggle it on or off by pressing the `option ⌥` key. Turning on keymapping will lock the cursor to the app window, but you can still switch to other apps you have open using trackpad gestures or keyboard shortcuts.
10 |
11 | ## Creating & Editing Keymaps
12 |
13 |
14 |
15 | You can **open** and **close** the Keymapping Editor while in app using `command ⌘` + `K` or selecting it from the Menu Bar.
16 |
17 |
18 |
19 | After opening the Keymapping Editor you can add a new button by clicking anywhere on the screen. A ring menu will appear around your cursor with different button types. You can click on them to add the type of input you want (see the tables below for details and usage).
20 |
21 | Closing the Keymapping Editor will automatically **save** any changes you have made to the keymap.
22 |
23 |
24 |
25 | #### Keymapping Editor button types
26 |
27 | | Symbol | Button | Description |
28 | | :-----------: | :-----------: | ------------- |
29 | |
| Circle | Adds a single key binding. Useful for pressing buttons on the UI. By default this will create a single button mapped to `LMB` (Left Mouse Button). |
30 | |
| Directional Pad | Adds an 8-way directional joystick, where Up, Down, Left, and Right are bound to keys (by default mapped to `W` `A` `S` `D`). Useful for movement joysticks. |
31 | |
| Directional Arrows | Adds an area for mouse input. Useful for camera control. Can be mapped to other keys to recreate draggable touchscreen aiming controls present in some games. |
32 | |
| Mouse | Adds a single button bound to mouse control similar to Directional Arrows. Useful for games that require 360-degree movement control instead of 8-way directional movement. |
33 |
34 | >__Note__: On legacy versions (prior to 2.0.0 or PlayTools 2.0.1) of PlayCover, there may be RB and LB button types for adding left and right mouse button input.
35 |
36 | #### Keymapping Editor usage instructions
37 |
38 | | Function | Input | Usage |
39 | | :-----------: | ------------- | ------------- |
40 | | Change button | Click on the button and press the key you want | Change the default button map to another key |
41 | | Move button | Click on the button and drag it using your mouse cursor | Position the button into to match in-game controls |
42 | | Delete button | Click on the button and press `command ⌘` + `delete` | Removes the button from your keymap |
43 | | Increase button size | Click on the button and press `command ⌘` + `▲` | Increase the size of the button coverage area |
44 | | Decrease button size | Click on the button and press `command ⌘` + `▼` | Decrease the size of the button coverage area |
45 |
46 | #### Bindable keys
47 |
48 | Most keyboard keys can be mapped, including function keys and numeric keypad keys.
49 |
50 | In some cases gaming mouse buttons may be mapped, but they will be recognized as the middle mouse button `MMB`.
51 |
52 | All keys of [controllers](https://support.apple.com/en-us/HT210414) supported by Apple's [Game Controller API](https://developer.apple.com/documentation/gamecontroller) may be bound. Joystick and D-Pad binding is not supported.
53 |
54 | >__Note__: Input that cannot be mapped includes: `fn`, `option`, `command`, `scroll`, `power button`, `eject`, and `volume up`, `volume down` and `mute` if they are standalone keys.
55 |
56 | ###### This information is up-to-date as of PlayCover `2.0.2`
57 |
--------------------------------------------------------------------------------
/PlayBook/src/miscellaneous/README.md:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 |
3 | - [Blocked Apps](./blocked_apps.md)
4 | - [Configuring Entitlements for Jailbreak Bypass](./entitlements.md)
5 | - [In-app Purchases](./app_purchases.md)
6 | - [PlayChain](./playchain.md)
7 | - [Photo Storage](./photo_storage.md)
8 | - [Related Projects and Utilities](./projects_utilities.md)
9 | - [Running Apps with Xcode](./run_with_xcode.md)
10 |
--------------------------------------------------------------------------------
/PlayBook/src/miscellaneous/app_purchases.md:
--------------------------------------------------------------------------------
1 | # In-app Purchases
2 |
3 | In-app purchases are not supported in sideloaded applications. For apps that require account login, you can try visiting their official website to make purchases for your account.
4 |
--------------------------------------------------------------------------------
/PlayBook/src/miscellaneous/blocked_apps.md:
--------------------------------------------------------------------------------
1 | # Blocked Apps
2 | Some apps are blocked by PlayCover with a [bundle id filter](https://github.com/PlayCover/PlayCover/blob/775eede78cf79e62b7fde827822e48a8b0785a13/PlayCover/Model/PlayApp.swift#L178) because they may either cause issues (such as bans) or engage in malicious activity. This list is not exhaustive and may be updated at any time. If you think an app should be added to this list, please open an issue on the [PlayCover GitHub](https://github.com/PlayCover/PlayCover/issues)
3 |
4 | ## Blocked games
5 | These apps are blocked because the user will be inexorably banned. Using them through your Mac and with PlayCover or PlayTools may be detected as either a jailbroken client or a modified app. It is not a question of if, but when you will get banned.
6 | - Call of Duty: Mobile
7 | - Apex Legends Mobile
8 | - PUBG Mobile
9 | - Free Fire
10 |
11 | ## Malicious apps
12 | These apps are blocked because they engage in malicious activity. They may steal your data or damage your mac.
13 | - Tiktok: Tiktok [steals](https://github.com/PlayCover/PlayCover/discussions/628) data from your Mac. Additionally, its 'Clear Cache' operation is known to delete the entire app container, taking alongside it the Home Folder. It is not recommended to use Tiktok on your Mac.
14 |
--------------------------------------------------------------------------------
/PlayBook/src/miscellaneous/entitlements.md:
--------------------------------------------------------------------------------
1 | # Configuring Entitlements for Jailbreak Bypass
2 |
3 | PlayCover contains a set of rules to be used on an app under `PlayCover/Rules` in the source code and `PlayCover.app/Contents/Resources` in the built app. There is a default rule named `default.yaml` and there may be rules meant for specific apps, case in which they will be named after their bundle id as `com.mycompany.myapp.yaml`.
4 |
5 | An app will use the set of rules meant for it, or the default set if the former one does not exist.
6 |
7 | ## Rules structure
8 | A [rules file](https://github.com/PlayCover/PlayCover/blob/2.0.2/PlayCover/Rules/default.yaml) contains four sections, which can be sorted into two types:
9 |
10 | `blacklist`, `whitelist` | `allow`, `bypass`
11 |
12 | The first two work on **files**, while the last ones work on **sandbox rules**.
13 |
14 | Here is what the sections do:
15 | `blacklist` blocks **files** (not directories) from being accessed.
16 | `whitelist` allows writing to files **outside** default paths to be written to.
17 | `allow` are rules that are always applied.
18 | `bypass` are rules that are applied when JB Bypass is enabled.
19 |
20 | Sandbox rules in `allow` are **always** added into the entitlements, regardless of the status of Jailbreak Bypass. The other ones are only active when JB Bypass is turned on.
21 |
22 | By default, applications running under PlayCover have the same permissions as any other contained macOS applications. This however means that it gets access to syscalls and locations that iOS doesn't normally allow (eg. forking a process or read access to /usr/bin and /usr/sbin).
23 |
24 | ## Identifying files and sandbox rules worth adding
25 |
26 | The following directories contain Apple sandbox files by default. They can prove helpful for writing new sandbox profiles.
27 | ```
28 | /Library/Sandbox/Profiles
29 | /System/Library/Sandbox/Profiles
30 | /usr/share/sandbox
31 | ```
32 |
--------------------------------------------------------------------------------
/PlayBook/src/miscellaneous/photo_storage.md:
--------------------------------------------------------------------------------
1 | # Photo Storage
2 |
3 | PlayCover will save screenshots taken in-game to your Mac's Photo Library. When you take a screenshot in-game for the first time, you will be asked to grant the app permission to access Photos.
4 |
5 | You can manage these permissions in `System Settings` > `Privacy & Security` > `Photos`
6 |
7 |
8 |
9 | ###### This information is up-to-date as of PlayCover 2.0.3
10 |
--------------------------------------------------------------------------------
/PlayBook/src/miscellaneous/playchain.md:
--------------------------------------------------------------------------------
1 | # What is PlayChain?
2 |
3 | PlayChain is a PlayCover component that provides apps sideloaded with PlayCover access to an Apple Keychain-like system to store secrets
4 |
5 | Normally, self-signed apps (eg. Apps installed with PlayCover) are not given the entitlements needed to use macOS's existing keychain facilities. This is due to Apple gating keychain behind the `com.apple.application-identifier` and `teamID` entitlements for iOS/macCatalyst apps. Self-signed apps don't have these valid values.
6 |
7 | PlayChain swaps out the system keychain facilities with one provided by PlayCover, allowing these operations to (partially, anyway) succeed
8 |
9 | # Why PlayChain?
10 |
11 | PlayCover 2 and older required the user to relax AMFI restriction on unsigned code in order to provide Keychain access. This was necessary due to the fact that it essentially signs the app with the "correct" team ID, but otherwise invalid signatures to gain access to the system keychain facilities.
12 |
13 | While this method worked, relaxing AMFI also comes with the side effect that the system will be more vulnerable to attacks (as macOS's signature enforcement is basically turned off) and there is no guarantee that the app will keep working after AMFI is turned back on (because the app will be denied from keychain access)
14 |
15 | PlayChain allows apps to have partial access to Keychain services without changing any of these security settings.
16 |
17 | # How to PlayChain?
18 |
19 | PlayChain can be enabled for each individual app by going to their Settings > Bypasses > Enable PlayChain
20 |
21 | The app's Keychain entries will now exist at the PlayCover container folder > PlayChain > [bundle ID]
22 |
23 | PlayChain debugging can also be turned on in order to debug both the system (with AMFI turned off) or PlayChain behaviors if necessary. Logs are written to the system log (accessible via the Apple Console app)
24 |
25 | # What can PlayChain do?
26 |
27 | At a minimum, PlayChain allows apps to:
28 | - Store and access values such as login tokens or device identifiers correctly when AMFI is enabled
29 | - Persist values through sessions
30 |
31 | # What **can't** PlayChain do?
32 |
33 | - Bypassing jailbreak/anticheat checks imposed by apps.
34 | - Fully replacing Apple Keychain (we need to put more work hours into it)
35 | - Creating a one-time-usable smoke screen on your Mac portables (not guaranteed)
36 |
--------------------------------------------------------------------------------
/PlayBook/src/miscellaneous/projects_utilities.md:
--------------------------------------------------------------------------------
1 | # Related Projects and Utilies
2 |
3 | ## Utilities
4 |
5 | ### [IPA Source Generator](https://github.com/ohaiibuzzle/PlaySourceTool)
6 | A Python app made for editing JSON files for PlayCover's Sources feature.
7 |
8 | >__Note__: This app is also available as a Homebrew [cask](https://github.com/PlayCover/homebrew-playcover/blob/master/Casks/ipa-source-generator.rb) in PlayCover's tap.
9 |
10 | ### [PlayCover Test Toolkit (PCTT)](https://github.com/IsaacMarovitz/PlayCover-Test-Toolkit)
11 | An iOS app built in Unity meant for basic debugging and testing of PlayCover and PlayTools. It displays system data and visually shows touch inputs, making it useful for keymap testing.
12 |
13 | ### [PlayCover-Raycast](https://github.com/JoseMoreville/PlayCover-Raycast)
14 | A [Raycast](https://www.raycast.com) extension for PlayCover.
15 |
16 | ## Related projects
17 |
18 | ### [PlayCover CLI](https://github.com/JoseMoreville/PlayCover-CLI)
19 | A CLI version of PlayCover. It might not be up to date in comparison to official releases.
20 |
--------------------------------------------------------------------------------
/PlayBook/src/miscellaneous/run_with_xcode.md:
--------------------------------------------------------------------------------
1 | # Running Apps with Xcode
2 |
3 | In some cases apps won't run with SIP enabled because they cannot access certain frameworks which are only available to properly signed apps.
4 |
5 | Some of this frameworks may be accessed with SIP enabled if PlayCover is compiled and running through an Xcode instance. Such is the case of OpenGL ES, which is required by games like Arknights, being fully usable under these circumstances.
--------------------------------------------------------------------------------
/PlayBook/src/other_features/README.md:
--------------------------------------------------------------------------------
1 | # Other features
2 |
3 | - [Sideloadly Export](./sideloadly_export.md)
4 | - [Account Manager](./account_manager.md)
5 | - [PlayCover Settings](./playcover_settings.md)
6 | - [IPA Library](./ipa_library.md)
7 |
--------------------------------------------------------------------------------
/PlayBook/src/other_features/account_manager.md:
--------------------------------------------------------------------------------
1 | # Account Manager
2 |
3 | Account Manager lets you store the login details of **multiple accounts** so you can effortlessly switch between them without the need to disable System Integrity Protection (SIP) each time.
4 |
5 | >__Note__: Currently, this feature only works for Genshin Impact.
6 |
7 | ## Store Account
8 |
9 | You can store multiple accounts to easily switch between them later, this allows you to bypass the inconvenient login process of disabling, modifying boot-args, and re-enabling SIP.
10 |
11 | To store an account, right click on Genshin Impact, then click on `Store Account`.
12 |
13 |
14 |
15 | You can choose an account region and enter a name for the account.
16 |
17 |
18 |
19 | ## Switch Account
20 |
21 | To switch between your stored accounts, right click on Genshin Impact and then select `Switch Account`.
22 |
23 |
24 |
25 | In the selection menu, you can choose an account you have previously stored to switch to.
26 |
27 |
28 |
29 | You can restore an account by clicking on its name, doing so will replace the previous account that you used to sign in. If you have not stored the previous account, you will not be able to easily switch back to it afterwards, and you will have to disable SIP and modify boot-args again in order to login to that account.
30 |
31 |
32 |
33 | ## Delete Account
34 |
35 | To delete accounts you have previously stored, right click on Genshin Impact then select `Delete Account`.
36 |
37 |
38 |
39 | In the selection menu, you can choose an account you have previously stored to delete.
40 |
41 |
42 |
43 | You can delete an account by clicking on its name. If you delete an account, you will not be able to switch back to it afterwards, and will have to disable SIP and modify boot-args again in order to login to that account.
44 |
45 |
46 |
47 | ###### This information is up-to-date as of PlayCover 2.0.3
48 |
--------------------------------------------------------------------------------
/PlayBook/src/other_features/ipa_library.md:
--------------------------------------------------------------------------------
1 | # IPA Library
2 | You can use the IPA Library to install apps from `.ipa` sources you have added.
3 |
4 |
5 |
6 | ## Adding Sources
7 |
8 | To add a source, click on the **Add source** button to enter a valid source link. These may be web based, or local links such as `file:///Users//Downloads/mysource.json`.
9 |
10 |
11 |
12 |
13 | ## Installing Apps
14 | Installing apps from the IPA Library is easy, simply double click on the app you want to install to add it to your **App Library**.
15 |
16 |
17 |
18 | Each app will have a circular icon indicating whether:
19 | - The app is not installed (downward arrow)
20 | - The app is installed (check mark)
21 | - Installed, but the source version is newer (check mark with a warning sign)
22 | - Installed, but the source version is older (check mark with with a cross mark)
23 |
24 | ## Managing Sources
25 | If you want to delete a source, you can use the menu in `Menu Bar` > `PlayCover` > `Settings...` > `IPA Sources`. Here you can also add, move, and refresh sources. A green checkmark means the source URL is valid and working properly.
26 |
27 |
28 |
29 | ## How to make a source
30 | IPA sources are JSON files which have one entry per app, with the following structure:
31 | ```
32 | [
33 | {
34 | "bundleID": "xyz.skitty.Aidoku",
35 | "name": "Aidoku",
36 | "version": "0.5",
37 | "itunesLookup": "",
38 | "link": "https://github.com/Aidoku/Aidoku/releases/download/v0.5/Aidoku.ipa"
39 | }
40 | ]
41 | ```
42 | The `itunesLookup` entry is optional, and it may be filled in with an App Store URL, enabling the Library to show the app icon of the corresponding app. The `link` entry must end in `.ipa` to be valid.
43 |
44 | Please check our IPA source JSON file [template](https://github.com/PlayCover/PlayBook/blob/master/resources/template_ipa_library.json).
45 |
46 | You may use [IPA Source Generator](https://github.com/ohaiibuzzle/PlaySourceTool) to aid you.
47 |
48 | ###### This information is up-to-date as of PlayCover 2.0.3
49 |
--------------------------------------------------------------------------------
/PlayBook/src/other_features/playcover_settings.md:
--------------------------------------------------------------------------------
1 | # PlayCover Settings
2 | PlayCover has a few settings you may customize to your preference.
3 |
4 |
5 |
6 | You can find these settings from `Menu Bar` > `PlayCover` > `Settings...`
7 |
8 | ## PlayCover Updates
9 |
10 | You can turn on or off automatic updates or manually check for version updates to the PlayCover app.
11 |
12 |
13 |
14 | ## IPA Sources
15 | You can add, delete, move, and refresh sources for your IPA Library. A green checkmark icon indicates the source URL is valid and working properly.
16 |
17 |
18 |
19 | ## Install
20 | You can set the app install behavior to either show a prompt asking whether or not to install PlayTools, or proceed automatically with a preset installation setting, always/never install PlayTools.
21 |
22 |
23 |
24 | ## Uninstall
25 | You can customize the default app uninstall behavior by defining which files or directories should be deleted alongside the app.
26 |
27 | `Clear data` will clear the following directories:
28 | ```
29 | ~/Library/Application Scripts/
30 | ~/Library/Caches/
31 | ~/Library/Containers/
32 | ~/Library/HTTPStorages/
33 | ~/Library/Saved Application State/
34 | ```
35 | `Remove keymap`, `Remove settings` and `Remove entitlements` clear the following directories respectively:
36 | ```
37 | ~/Library/Containers/io.playcover.PlayCover/Keymapping/.plist
38 | ~/Library/Containers/io.playcover.PlayCover/App Settings/.plist
39 | ~/Library/Containers/io.playcover.PlayCover/Entitlements/.plist
40 | ```
41 |
42 |
43 |
44 | There is also a prune function, which will clear all data from previously installed apps that have since been uninstalled.
45 |
46 | ###### This information is up-to-date as of PlayCover 2.0.3
47 |
--------------------------------------------------------------------------------
/PlayBook/src/other_features/sideloadly_export.md:
--------------------------------------------------------------------------------
1 | # Sideloadly Export
2 |
3 |
4 |
5 | You may use PlayCover to inject PlayTools to `.ipa` files and directly export them to Sideloadly. This will make keymapping and screen rotation available in Sideloadly signed apps.
6 |
7 | Keymaps created for Sideloadly installed apps won't be saved after you exit the app.
8 |
9 | ###### This information is up-to-date as of PlayCover 2.0.2
10 |
--------------------------------------------------------------------------------
/PlayBook/src/settings/README.md:
--------------------------------------------------------------------------------
1 | # Settings
2 |
3 | - [Keymapping](./keymapping.md)
4 | - [Graphics](./graphics.md)
5 | - [Jailbreak Bypass](./jailbreak_bypass.md)
6 | - [Miscellaneous](./miscellaneous.md)
7 |
--------------------------------------------------------------------------------
/PlayBook/src/settings/graphics.md:
--------------------------------------------------------------------------------
1 | # Graphics
2 |
3 | With PlayTools injected, you will be able to change the iOS device and the resolution settings of the app. These settings are only applied when you launch the app and will not take effect while the app is already open.
4 |
5 | 
6 |
7 | ### iOS Device
8 |
9 | This controls the Model Identifier that PlayCover will report to the running app. Essentially this decides what device the app *thinks* it is running on. Apps can have device specific optimisations, so adjusting this value can lock/unlock certain features.
10 |
11 | For most applications, iPad identifiers are preferred over iPhone identifiers, however there are a few iPhone options available.
12 |
13 | Using the `M1` iPad identifier on MacBook Air will typically result in thermal throttling when playing graphically intensive games (like Genshin Impact) over a long period of time. If thermals are a concern or you want to enjoy longer gaming sessions on MacBook Air without FPS drops, we recommend using the `A12Z` identifier.
14 |
15 | For every other Apple Silicon device and most applications, we recommend the `M1` iPad identifier, as this usually provides the best experience.
16 |
17 | >__Note__: For most graphically intensive games the `A12Z` identifier will provide a consistent 60fps experience at max graphical settings, but at the cost of image sharpness since the game will be rendered at a lower internal resolution compared to `M1`.
18 |
19 | ### Resolution
20 |
21 |
22 |
23 | | Option | Description |
24 | | :-----------: | ------------- |
25 | | App Default | This will leave the window size up to the application, which may not always be desirable since it might not fully utilize the available screen real estate of your display. Some apps may only work correctly under this setting, otherwise their display and touch area might be offset, and in particular cases dynamic window resizing won’t work either. |
26 | | Auto (Based on Display) | This will attempt to match the window size to your display's resolution and aspect ratio. |
27 | | 1080p/1440p/4K | This sets the window size to a standard resolution, with aspect ratio options of 4:3, 16:9, or 16:10. Most MacBook built in displays are 16:10 and we recommend using this aspect ratio to prevent letterboxing. |
28 | | Custom | This lets you set a completely custom resolution, useful for ultrawide monitor setups. Please note that some extreme aspect ratios or resolutions may cause compatibility or performance issues. |
29 |
30 | >__Note__: Keymaps do not automatically adjust according to aspect ratio changes. For example, a keymap made for 16:10 will not work properly when the game is changed to 16:9. We recommend using keymaps made specifically for the aspect ratio you choose, you can find them on the [_Keymaps repository_](https://github.com/PlayCover/keymaps/tree/master/keymapping).
31 |
32 | ### Disable display sleep
33 |
34 | This prevents your display from going to sleep while the app is running, which can be helpful for streaming apps like Netflix.
35 |
36 | ###### This information is up-to-date as of PlayCover `2.0.2`
37 |
--------------------------------------------------------------------------------
/PlayBook/src/settings/jailbreak_bypass.md:
--------------------------------------------------------------------------------
1 | # Jailbreak Bypass
2 |
3 | 
4 |
5 | ### Enable Jailbreak Bypass (Alpha)
6 |
7 | As the option suggests, Jailbreak Bypass is not a catch-all solution, and often requires app-specific customisation.
8 |
9 | This feature attempts to restrict the entitlements of applications such that they are unable to detect certain macOS directories that can be interpreted as running in a jailbroken environment.
10 |
11 | Most users should leave this option **disabled**.
12 |
--------------------------------------------------------------------------------
/PlayBook/src/settings/keymapping.md:
--------------------------------------------------------------------------------
1 | # Keymapping
2 |
3 | 
4 |
5 | ### Keymapping
6 |
7 | This option enables/disables key-bound touch controls within the app.
8 |
9 | ### Mouse Mapping
10 |
11 | This option enables/disables the mouse look control within the app.
12 |
13 | Disabling this while leaving keymapping enabled can be useful for certain apps where having both a free cursor and key-bound controls are necessary.
14 |
15 | ### Mouse Sensitivity
16 |
17 | This adjusts the sensitivity of the mouse look control within the app. The default sensitivity is 50.
--------------------------------------------------------------------------------
/PlayBook/src/settings/miscellaneous.md:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 |
3 |
4 |
5 | ### Enable Discord activity
6 |
7 | This option enables/disables Discord RPC, which allows you to display the games you're playing in PlayCover in your Discord status seamlessly. If you wish to further customise the appearence of this status, you can use the `Custom Discord activity` values as shown in the picture below.
8 |
9 |
10 |
11 | ### Metal 3 Performance HUD (macOS 13+)
12 |
13 |
14 |
15 | This feature enables the new Metal 3 Performance HUD introduced in macOS Ventura to provide you with frame rate, frame time, GPU, and Memory usage stats. This can be helpful for stress testing the performance of certain games to find the right balance between quality and performance.
16 |
17 | >__Note__: The HUD cannot be enabled or disabled while the game is running. You must enable or disable it from individual app settings in PlayCover while the app is closed. When enabled, the HUD will always show in the top right corner of the app window and cannot be moved.
18 |
19 |
20 |
21 | The following table will provide an in-depth explanation of the HUD based on the image above:
22 |
23 | | Example | Description |
24 | | :-----------: | ------------- |
25 | | `Apple M1` | Name of the GPU Device. |
26 | | `[2668x1688]` | Drawable resolution being targeted. |
27 | | `1.9x` | Scaling state of the display. `1.0x` would be native for displays that do not use HiDPI. For displays that use HiDPI, macOS will apply downsampling at `0.5x` to reach actual window resolution, so native resolution would be around `2.0x.` |
28 | | `Composited` | Direct or composited path of the display. The direct path has the least buffering and the fewest number of refresh intervals between the presented drawable and when it appears on the screen. When it is composited, there may be some additional buffering and display latency due to system UI elements or additional layers overlapping the screen. |
29 | | `60Hz` | The maximum refresh rate of the physical display being used. We recommend setting in-game FPS limit to match the refresh rate to prevent screen tearing and frame time stuttering. |
30 | | `FPS: 60.00` | Instantaneous frames per second, the numbers in the brackets indicate min and max values recorded in the last 1.5 seconds of the graph interval, however, FPS is not shown as a line on the graph. |
31 | | `Pre: 16.67` | Pretime/frame time, the amount of time it takes (in milliseconds) to render each frame. The numbers in the brackets indicate min and max values recorded in the last 1.5 seconds of the graph interval. Frame time is shown as a blue line on the graph, a flat line indicates consistent frame time. |
32 | | `GPU: 10.97` | The amount of GPU work completed in the frame interval, also measured in milliseconds. The numbers in the brackets indicate min and max values recorded in the last 1.5 seconds of the graph interval. GPU utilization is shown as a green line on the graph. |
33 | | `Mem: 1.57GB` | Process memory usage, the green numbers in brackets indicates GPU memory consumption. |
34 |
35 | ##### Source: [Discover Metal Performance HUD (Apple Developer)](https://developer.apple.com/videos/play/tech-talks/110339/)
36 |
37 | ### Debugger
38 |
39 | This feature is meant for development and testing purposes only, and should not be enabled unless you know what you are doing.
40 |
41 | ### Inject/Remove PlayTools
42 |
43 | By default, PlayTools are injected into the app when you add it to the App Library. PlayTools allows you to use keymapping, mouse mapping, change iOS device identifier, set custom resolutions, and more. However, these features may not be necessary for certain apps and may even cause issues. If the app you are using is not working properly as expected, you can try removing PlayTools.
44 |
45 | If an app doesn't have PlayTools, it will show with a warning sign alongside its name.
46 |
47 |
48 |
49 |
50 | ###### This information is up-to-date as of PlayCover `2.0.4`
51 |
--------------------------------------------------------------------------------
/PlayBook/theme/css/chrome.css:
--------------------------------------------------------------------------------
1 | /* CSS for UI elements (a.k.a. chrome) */
2 |
3 | @import "variables.css";
4 |
5 | #searchresults a,
6 | .content a:link,
7 | a:visited,
8 | a > .hljs {
9 | color: var(--links);
10 | }
11 |
12 | /* Menu Bar */
13 |
14 | #menu-bar,
15 | #menu-bar-hover-placeholder {
16 | z-index: 101;
17 | margin: auto calc(0px - var(--page-padding));
18 | }
19 |
20 | #menu-bar {
21 | position: relative;
22 | display: flex;
23 | flex-wrap: wrap;
24 | justify-content: space-between;
25 | padding: 4px 0;
26 | }
27 |
28 | #menu-bar.sticky,
29 | .js #menu-bar-hover-placeholder:hover + #menu-bar,
30 | .js #menu-bar:hover,
31 | .js.sidebar-visible #menu-bar {
32 | position: -webkit-sticky;
33 | position: sticky;
34 | top: 0 !important;
35 | }
36 |
37 | #menu-bar-hover-placeholder {
38 | position: sticky;
39 | position: -webkit-sticky;
40 | top: 0;
41 | height: var(--menu-bar-height);
42 | }
43 |
44 | #menu-bar i,
45 | #menu-bar .icon-button {
46 | display: flex;
47 | justify-content: center;
48 | align-items: center;
49 | border-radius: 50%;
50 | position: relative;
51 | color: var(--icon-button-color);
52 | z-index: 10;
53 | height: 40px;
54 | width: 40px;
55 | cursor: pointer;
56 | transition: all 0.2s;
57 | }
58 | #menu-bar i:hover,
59 | #menu-bar .icon-button:hover {
60 | background: var(--icon-button-hover-color);
61 | }
62 | #menu-bar i:active,
63 | #menu-bar .icon-button:active {
64 | background: var(--icon-button-active-color);
65 | }
66 |
67 | hr {
68 | border: none;
69 | height: 1px;
70 | background: var(--hr-bg);
71 | }
72 |
73 | .icon-button {
74 | border: none;
75 | background: none;
76 | padding: 0;
77 | color: var(--icon-button-color);
78 | }
79 |
80 | .icon-button i {
81 | margin: 0;
82 | }
83 |
84 | .right-buttons {
85 | display: flex;
86 | margin: 0 15px;
87 | }
88 |
89 | .right-buttons a {
90 | text-decoration: none;
91 | }
92 |
93 | .left-buttons {
94 | display: flex;
95 | margin: 0 5px;
96 | }
97 |
98 | .no-js .left-buttons {
99 | display: none;
100 | }
101 |
102 | .menu-title {
103 | display: flex;
104 | gap: 10px;
105 | justify-content: flex-end;
106 | align-items: center;
107 | font-weight: 400;
108 | font-size: 22px;
109 | line-height: var(--menu-bar-height);
110 | color: transparent;
111 | text-align: center;
112 | margin: 0;
113 | flex: 1;
114 | white-space: nowrap;
115 | overflow: hidden;
116 | text-overflow: ellipsis;
117 | user-select: none;
118 | -webkit-user-select: none;
119 | -moz-user-select: none;
120 | }
121 |
122 | .menu-title::after {
123 | content: "";
124 | background-image: url("https://playcover.io/static/media/play-cover.0e542de331f48c6bf8cf.png");
125 | border-radius: 8px;
126 | height: 34px;
127 | width: 34px;
128 | background-size: 34px 34px;
129 | }
130 |
131 | .js .menu-title {
132 | cursor: pointer;
133 | }
134 |
135 | .menu-bar,
136 | .menu-bar:visited,
137 | .nav-chapters,
138 | .nav-chapters:visited,
139 | .mobile-nav-chapters,
140 | .mobile-nav-chapters:visited,
141 | .menu-bar .icon-button,
142 | .menu-bar a i {
143 | color: var(--icons);
144 | }
145 |
146 | .menu-bar i:hover,
147 | .menu-bar .icon-button:hover,
148 | .nav-chapters:hover,
149 | .mobile-nav-chapters i:hover {
150 | color: var(--icons-hover);
151 | }
152 |
153 | /* Nav Icons */
154 |
155 | .nav-chapters {
156 | display: none;
157 |
158 | font-size: 2.5em;
159 | text-align: center;
160 | text-decoration: none;
161 |
162 | position: fixed;
163 | top: 0;
164 | bottom: 0;
165 | margin: 0;
166 | max-width: 150px;
167 | min-width: 90px;
168 |
169 | transition: color 0.5s, background-color 0.5s;
170 | }
171 |
172 | .nav-chapters:hover {
173 | text-decoration: none;
174 | background-color: var(--theme-hover);
175 | transition: background-color 0.15s, color 0.15s;
176 | }
177 |
178 | .nav-wrapper {
179 | margin-top: 50px;
180 | display: none;
181 | }
182 |
183 | .mobile-nav-chapters {
184 | font-size: 2.5em;
185 | text-align: center;
186 | text-decoration: none;
187 | width: 90px;
188 | border-radius: 5px;
189 | background-color: var(--sidebar-bg);
190 | }
191 |
192 | .previous {
193 | float: left;
194 | }
195 |
196 | .next {
197 | float: right;
198 | right: var(--page-padding);
199 | }
200 |
201 | @media only screen and (max-width: 1080px) {
202 | .nav-wide-wrapper {
203 | display: none;
204 | }
205 |
206 | .nav-wrapper {
207 | display: block;
208 | }
209 | }
210 |
211 | @media only screen and (max-width: 1380px) {
212 | .sidebar-visible .nav-wide-wrapper {
213 | display: none;
214 | }
215 |
216 | .sidebar-visible .nav-wrapper {
217 | display: block;
218 | }
219 | }
220 |
221 | /* Inline code */
222 |
223 | :not(pre) > .hljs {
224 | display: inline;
225 | padding: 0.1em 0.3em;
226 | border-radius: 3px;
227 | }
228 |
229 | :not(pre):not(a) > .hljs {
230 | color: var(--inline-code-color);
231 | overflow-x: initial;
232 | }
233 |
234 | .hljs {
235 | background: var(--hljs-background-color) !important;
236 | border: 1px solid var(--table-border-color);
237 | box-shadow: 0 1px 1px rgba(0, 0, 0, 10%);
238 | border-radius: 6px !important;
239 | color: var(--hljs-text-color) !important;
240 | }
241 |
242 | a:hover > .hljs {
243 | text-decoration: underline;
244 | }
245 |
246 | pre {
247 | position: relative;
248 | }
249 |
250 | pre > .buttons {
251 | position: absolute;
252 | z-index: 100;
253 | right: 0px;
254 | top: 2px;
255 | margin: 0px;
256 | padding: 2px 0px;
257 |
258 | color: var(--sidebar-fg);
259 | cursor: pointer;
260 | visibility: hidden;
261 | opacity: 0;
262 | transition: visibility 0.1s linear, opacity 0.1s linear;
263 | }
264 |
265 | pre:hover > .buttons {
266 | visibility: visible;
267 | opacity: 1;
268 | }
269 |
270 | pre > .buttons :hover {
271 | color: var(--sidebar-active);
272 | border-color: var(--icons-hover);
273 | background-color: var(--theme-hover);
274 | }
275 |
276 | pre > .buttons i {
277 | margin-left: 8px;
278 | }
279 |
280 | pre > .buttons button {
281 | cursor: inherit;
282 | margin: 0px 5px;
283 | padding: 3px 5px;
284 | font-size: 14px;
285 |
286 | border-style: solid;
287 | border-width: 1px;
288 | border-radius: 4px;
289 | border-color: var(--icons);
290 | background-color: var(--theme-popup-bg);
291 | transition: 100ms;
292 | transition-property: color, border-color, background-color;
293 | color: var(--icons);
294 | }
295 |
296 | @media (pointer: coarse) {
297 | pre > .buttons button {
298 | /* On mobile, make it easier to tap buttons. */
299 | padding: 0.3rem 1rem;
300 | }
301 | }
302 |
303 | pre > code {
304 | padding: 1rem;
305 | }
306 |
307 | /* FIXME: ACE editors overlap their buttons because ACE does absolute
308 | positioning within the code block which breaks padding. The only solution I
309 | can think of is to move the padding to the outer pre tag (or insert a div
310 | wrapper), but that would require fixing a whole bunch of CSS rules.
311 | */
312 | .hljs.ace_editor {
313 | padding: 0rem 0rem;
314 | }
315 |
316 | pre > .result {
317 | margin-top: 10px;
318 | }
319 |
320 | /* Search */
321 |
322 | #searchresults a {
323 | text-decoration: none;
324 | }
325 |
326 | mark {
327 | border-radius: 2px;
328 | padding: 0 3px 1px 3px;
329 | margin: 0 -3px -1px -3px;
330 | background-color: var(--search-mark-bg);
331 | transition: background-color 300ms linear;
332 | cursor: pointer;
333 | }
334 |
335 | mark.fade-out {
336 | background-color: rgba(0, 0, 0, 0) !important;
337 | cursor: auto;
338 | }
339 |
340 | .searchbar-outer {
341 | z-index: 1000;
342 | position: relative;
343 | margin-left: auto;
344 | margin-right: auto;
345 | max-width: var(--content-max-width);
346 | border-radius: 8px;
347 | margin-bottom: 40px;
348 | }
349 |
350 | .searchbar-outer::before {
351 | display: flex;
352 | justify-content: center;
353 | align-items: center;
354 | margin-top: -2px;
355 | position: absolute;
356 | top: 0;
357 | bottom: 0;
358 | width: 40px;
359 | content: "\f002";
360 | font-family: "FontAwesome";
361 | color: var(--searchbar-icon-color);
362 | }
363 |
364 | #searchbar {
365 | width: 100%;
366 | padding: 10px 16px;
367 | border: 1px solid var(--searchbar-border-color);
368 | box-shadow: 0 1px 1px var(--searchbar-shadow-color);
369 | transition: all 0.2s;
370 | font-family: inherit;
371 | font-size: 14px;
372 | border-radius: 8px;
373 | background-color: var(--searchbar-bg);
374 | padding-left: 36px;
375 | outline: none;
376 | color: var(--searchbar-fg);
377 | }
378 | #searchbar:focus,
379 | #searchbar.active {
380 | border-color: var(--searchbar-border-active);
381 | box-shadow: 0 0 0 3px var(--searchbar-shadow-active);
382 | }
383 |
384 | #searchbar::placeholder {
385 | color: var(--searchbar-placeholder-color);
386 | }
387 |
388 | .searchresults-header {
389 | align-items: center;
390 | gap: 8px;
391 | display: flex;
392 | color: var(--sidebar-part-text-color);
393 | font-family: "Roboto Mono";
394 | font-weight: 600;
395 | font-size: 12px;
396 | text-transform: uppercase;
397 | margin: 20px 0;
398 | }
399 |
400 | .searchresults-header::after {
401 | flex-grow: 1;
402 | content: "";
403 | height: 1px;
404 | background: var(--sidebar-part-bg-color);
405 | }
406 |
407 | .searchresults-outer {
408 | margin-left: auto;
409 | margin-right: auto;
410 | max-width: var(--content-max-width);
411 | border-bottom: 1px solid var(--sidebar-part-border-color);
412 | }
413 |
414 | ul#searchresults {
415 | list-style: none;
416 | padding-left: 20px;
417 | }
418 |
419 | ul#searchresults li {
420 | margin: 10px 0px;
421 | padding: 2px;
422 | border-radius: 2px;
423 | }
424 |
425 | ul#searchresults li.focus {
426 | background-color: var(--searchresults-li-bg);
427 | }
428 |
429 | ul#searchresults span.teaser {
430 | display: block;
431 | clear: both;
432 | margin: 5px 0 0 20px;
433 | font-size: 0.8em;
434 | }
435 |
436 | ul#searchresults span.teaser em {
437 | font-weight: bold;
438 | font-style: normal;
439 | }
440 |
441 | /* Sidebar */
442 |
443 | .sidebar {
444 | position: fixed;
445 | left: 0;
446 | top: 0;
447 | bottom: 0;
448 | padding: 0 14px;
449 | width: var(--sidebar-width);
450 | font-size: 0.875em;
451 | box-sizing: border-box;
452 | overflow-x: hidden;
453 | overflow-y: scroll;
454 | background-color: var(--sidebar-bg);
455 | border-right: 1px solid var(--sidebar-border);
456 | box-shadow: 1px 1px 1px var(--sidebar-shadow);
457 | color: var(--sidebar-fg);
458 | }
459 |
460 | .sidebar-resizing {
461 | -moz-user-select: none;
462 | -webkit-user-select: none;
463 | -ms-user-select: none;
464 | user-select: none;
465 | }
466 |
467 | .js:not(.sidebar-resizing) .sidebar {
468 | transition: transform 0.3s;
469 | /* Animation: slide away */
470 | }
471 |
472 | .sidebar code {
473 | line-height: 2em;
474 | }
475 |
476 | .sidebar .sidebar-resize-handle {
477 | position: absolute;
478 | cursor: col-resize;
479 | width: 0;
480 | right: 0;
481 | top: 0;
482 | bottom: 0;
483 | }
484 |
485 | .js .sidebar .sidebar-resize-handle {
486 | cursor: col-resize;
487 | width: 5px;
488 | }
489 |
490 | .sidebar-hidden .sidebar {
491 | transform: translateX(calc(0px - var(--sidebar-width)));
492 | }
493 |
494 | .sidebar-visible .page-wrapper {
495 | transform: translateX(var(--sidebar-width));
496 | }
497 |
498 | @media only screen and (min-width: 620px) {
499 | .sidebar-visible .page-wrapper {
500 | transform: none;
501 | margin-left: var(--sidebar-width);
502 | }
503 | }
504 |
505 | .chapter {
506 | list-style: none outside none;
507 | padding-left: 0;
508 | line-height: 2.2em;
509 | }
510 |
511 | .chapter li {
512 | display: block;
513 | color: var(--sidebar-non-existant);
514 | user-select: none;
515 | -webkit-user-select: none;
516 | -moz-user-select: none;
517 | cursor: default;
518 | }
519 |
520 | .chapter li a,
521 | .chapter li div {
522 | display: block;
523 | padding: 8px 14px;
524 | border-radius: 6px;
525 | text-decoration: none;
526 | word-break: break-word;
527 | transition: all 0.2s;
528 | }
529 | .chapter li a {
530 | color: var(--sidebar-fg);
531 | }
532 |
533 | .chapter li a:hover {
534 | background: var(--sidebar-hover-color);
535 | }
536 | .chapter li a:active {
537 | background: var(--sidebar-active-color);
538 | }
539 |
540 | .chapter a strong[aria-hidden="true"] {
541 | opacity: 0.5;
542 | }
543 |
544 | .chapter li a.active {
545 | background-color: var(--sidebar-active);
546 | color: var(--sidebar-text-active);
547 | box-shadow: 0 1px 1px rgba(0, 0, 0, 10%);
548 | text-shadow: 0 1px 1px rgba(0, 0, 0, 10%);
549 | }
550 | .chapter a.active strong[aria-hidden="true"] {
551 | opacity: 1;
552 | }
553 |
554 | .chapter li > a.toggle {
555 | cursor: pointer;
556 | display: block;
557 | margin-left: auto;
558 | padding: 0 10px;
559 | user-select: none;
560 | opacity: 0.68;
561 | }
562 |
563 | .chapter li > a.toggle div {
564 | transition: transform 0.5s;
565 | }
566 |
567 | /* collapse the section */
568 | .chapter li:not(.expanded) + li > ol {
569 | display: none;
570 | }
571 |
572 | .chapter li.chapter-item {
573 | line-height: 1.5em;
574 | }
575 |
576 | .chapter li.expanded > a.toggle div {
577 | transform: rotate(90deg);
578 | }
579 |
580 | .spacer {
581 | width: 100%;
582 | height: 3px;
583 | margin: 5px 0px;
584 | }
585 |
586 | .chapter .spacer {
587 | background-color: var(--sidebar-spacer);
588 | }
589 |
590 | @media (-moz-touch-enabled: 1), (pointer: coarse) {
591 | .chapter li a {
592 | padding: 5px 0;
593 | }
594 |
595 | .spacer {
596 | margin: 10px 0;
597 | }
598 | }
599 |
600 | .section {
601 | padding-left: 20px;
602 | }
603 |
604 | blockquote strong {
605 | font-family: "Roboto Mono";
606 | font-size: 15px;
607 | }
608 |
--------------------------------------------------------------------------------
/PlayBook/theme/css/general.css:
--------------------------------------------------------------------------------
1 | /* Base styles and content styles */
2 |
3 | @import "variables.css";
4 | @import url("https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap");
5 |
6 | :root {
7 | /* Browser default font-size is 16px, this way 1 rem = 10px */
8 | font-size: 62.5%;
9 | }
10 |
11 | html {
12 | font-family: "Roboto", sans-serif;
13 | color: var(--fg);
14 | background-color: var(--bg);
15 | text-size-adjust: none;
16 | -webkit-text-size-adjust: none;
17 | }
18 |
19 | h1,
20 | h2,
21 | h3,
22 | h4,
23 | h5,
24 | h6 {
25 | font-family: "Roboto Mono", sans-serif;
26 | }
27 |
28 | body {
29 | margin: 0;
30 | font-size: 1.6rem;
31 | overflow-x: hidden;
32 | }
33 |
34 | code {
35 | font-family: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo,
36 | "DejaVu Sans Mono", monospace, monospace !important;
37 | font-size: 0.875em;
38 | /* please adjust the ace font size accordingly in editor.js */
39 | }
40 |
41 | /* make long words/inline code not x overflow */
42 | main {
43 | overflow-wrap: break-word;
44 | }
45 |
46 | /* make wide tables scroll if they overflow */
47 | .table-wrapper {
48 | border: 1px solid var(--table-border-color);
49 | box-shadow: 0 1px 1px rgb(0, 0, 0, 10%);
50 | border-radius: 6px;
51 | overflow-x: auto;
52 | }
53 |
54 | /* Don't change font size in headers. */
55 | h1 code,
56 | h2 code,
57 | h3 code,
58 | h4 code,
59 | h5 code,
60 | h6 code {
61 | font-size: unset;
62 | }
63 |
64 | .left {
65 | float: left;
66 | }
67 |
68 | .right {
69 | float: right;
70 | }
71 |
72 | .boring {
73 | opacity: 0.6;
74 | }
75 |
76 | .hide-boring .boring {
77 | display: none;
78 | }
79 |
80 | .hidden {
81 | display: none !important;
82 | }
83 |
84 | h2,
85 | h3 {
86 | margin-top: 2.5em;
87 | }
88 |
89 | h4,
90 | h5 {
91 | margin-top: 2em;
92 | }
93 |
94 | .header + .header h3,
95 | .header + .header h4,
96 | .header + .header h5 {
97 | margin-top: 1em;
98 | }
99 |
100 | h1:target::before,
101 | h2:target::before,
102 | h3:target::before,
103 | h4:target::before,
104 | h5:target::before,
105 | h6:target::before {
106 | display: inline-block;
107 | content: "»";
108 | margin-left: -30px;
109 | width: 30px;
110 | }
111 |
112 | /* This is broken on Safari as of version 14, but is fixed
113 | in Safari Technology Preview 117 which I think will be Safari 14.2.
114 | https://bugs.webkit.org/show_bug.cgi?id=218076
115 | */
116 | :target {
117 | scroll-margin-top: calc(var(--menu-bar-height) + 0.5em);
118 | }
119 |
120 | .page {
121 | outline: 0;
122 | padding: 0 var(--page-padding);
123 | margin-top: calc(0px - var(--menu-bar-height));
124 | /* Compensate for the #menu-bar-hover-placeholder */
125 | }
126 |
127 | .page-wrapper {
128 | box-sizing: border-box;
129 | }
130 |
131 | .js:not(.sidebar-resizing) .page-wrapper {
132 | transition: margin-left 0.3s ease, transform 0.3s ease;
133 | /* Animation: slide away */
134 | }
135 |
136 | .content {
137 | overflow-y: auto;
138 | padding: 0 5px 50px 5px;
139 | }
140 |
141 | .content main {
142 | margin-left: auto;
143 | margin-right: auto;
144 | max-width: var(--content-max-width);
145 | }
146 |
147 | .content p {
148 | line-height: 1.45em;
149 | }
150 |
151 | .content ol {
152 | line-height: 1.45em;
153 | }
154 |
155 | .content ul {
156 | line-height: 1.45em;
157 | }
158 |
159 | .content a {
160 | text-decoration: none;
161 | }
162 |
163 | .content a:hover {
164 | text-decoration: underline;
165 | }
166 |
167 | .content img,
168 | .content video {
169 | max-width: 100%;
170 | }
171 |
172 | .content .header:link,
173 | .content .header:visited {
174 | color: var(--fg);
175 | }
176 |
177 | .content .header:link,
178 | .content .header:visited:hover {
179 | text-decoration: none;
180 | }
181 |
182 | table {
183 | width: 100%;
184 | border-collapse: collapse;
185 | border-radius: 6px;
186 | }
187 |
188 | table td {
189 | padding: 4px 20px;
190 | }
191 |
192 | table thead {
193 | background: var(--table-header-bg);
194 | }
195 |
196 | table thead td {
197 | font-weight: 700;
198 | border: none;
199 | }
200 |
201 | table thead th {
202 | padding: 8px 20px;
203 | }
204 |
205 | table thead tr {
206 | font-family: "Roboto Mono";
207 | font-size: 14px;
208 | color: var(--quote-color);
209 | border-bottom: 1px solid var(--table-border-color);
210 | text-shadow: 0 1px 1px rgba(0, 0, 0, 10%);
211 | }
212 |
213 | table tbody tr:not(:last-child) {
214 | border-bottom: 1px solid var(--table-border-color);
215 | }
216 |
217 | /* Alternate background colors for rows */
218 | table tbody tr:nth-child(2n) {
219 | background: var(--table-alternate-bg);
220 | }
221 |
222 | table tbody tr:nth-child(2n) {
223 | background: var(--table-alternate-bg);
224 | }
225 |
226 | blockquote {
227 | margin: 20px 0;
228 | padding: 4px 20px;
229 | color: var(--quote-color);
230 | background: var(--quote-bg);
231 | border: 1px solid var(--table-border-color);
232 | box-shadow: 0 1px 1px rgba(0, 0, 0, 10%);
233 | text-shadow: 0 1px 1px rgba(0, 0, 0, 10%);
234 | border-radius: 6px;
235 | }
236 |
237 | :not(.footnote-definition) + .footnote-definition,
238 | .footnote-definition + :not(.footnote-definition) {
239 | margin-top: 2em;
240 | }
241 |
242 | .footnote-definition {
243 | font-size: 0.9em;
244 | margin: 0.5em 0;
245 | }
246 |
247 | .footnote-definition p {
248 | display: inline;
249 | }
250 |
251 | .tooltiptext {
252 | position: absolute;
253 | visibility: hidden;
254 | color: #fff;
255 | background-color: #333;
256 | transform: translateX(-50%);
257 | /* Center by moving tooltip 50% of its width left */
258 | left: -8px;
259 | /* Half of the width of the icon */
260 | top: -35px;
261 | font-size: 0.8em;
262 | text-align: center;
263 | border-radius: 6px;
264 | padding: 5px 8px;
265 | margin: 5px;
266 | z-index: 1000;
267 | }
268 |
269 | .tooltipped .tooltiptext {
270 | visibility: visible;
271 | }
272 |
273 | .chapter li.part-title {
274 | align-items: center;
275 | gap: 8px;
276 | display: flex;
277 | color: var(--sidebar-part-text-color);
278 | font-weight: 600;
279 | font-size: 10px;
280 | text-transform: uppercase;
281 | }
282 |
283 | .chapter li.part-title::after {
284 | flex-grow: 1;
285 | content: "";
286 | height: 1px;
287 | background: var(--sidebar-part-bg-color);
288 | }
289 |
290 | .result-no-output {
291 | font-style: italic;
292 | }
293 |
--------------------------------------------------------------------------------
/PlayBook/theme/css/variables.css:
--------------------------------------------------------------------------------
1 | /* Globals */
2 |
3 | :root {
4 | --sidebar-width: 280px;
5 | --page-padding: 15px;
6 | --content-max-width: 750px;
7 | --menu-bar-height: 50px;
8 | }
9 |
10 | /* Themes */
11 |
12 | @media (prefers-color-scheme: light) {
13 | :root {
14 | --bg: #ffffff;
15 | --fg: #353535;
16 |
17 | --sidebar-bg: #f3f3f3;
18 | --sidebar-fg: #353535;
19 | --sidebar-part-text-color: #838383;
20 | --sidebar-part-bg-color: #d4d4d4;
21 | --sidebar-text-active: #ffffff;
22 | --sidebar-hover-color: rgb(0, 0, 0, 3%);
23 | --sidebar-active-color: rgb(0, 0, 0, 6%);
24 | --sidebar-border: rgb(0, 0, 0, 8%);
25 | --sidebar-shadow: rgb(0, 0, 0, 2%);
26 | --sidebar-non-existant: #b8b8b8;
27 | --sidebar-active: #449f97;
28 | --sidebar-spacer: #737994;
29 |
30 | --hljs-text-color: #449f97;
31 | --hljs-background-color: rgb(68, 159, 151, 10%);
32 |
33 | --icon-button-color: #878787;
34 | --icon-button-hover-color: #f3f3f3;
35 | --icon-button-active-color: #ededed;
36 |
37 | --hr-bg: rgb(0, 0, 0, 6%);
38 |
39 | --scrollbar: #737994;
40 |
41 | --icons: #737994;
42 | --icons-hover: #838ba7;
43 |
44 | --links: #449f97;
45 |
46 | --inline-code-color: #3f9089;
47 |
48 | --quote-bg: rgb(68, 159, 151, 10%);
49 | --quote-color: #449f97;
50 |
51 | --table-border-color: #c6dbd9;
52 | --table-header-bg: rgb(50, 116, 110, 8%);
53 | --table-alternate-bg: rgb(50, 116, 110, 8%);
54 |
55 | --searchbar-border-color: rgb(0, 0, 0, 8%);
56 | --searchbar-bg: #f3f3f3;
57 | --searchbar-fg: #353535;
58 | --searchbar-shadow-color: rgba(0, 0, 0, 4%);
59 | --searchresults-border-color: rgb(255, 255, 255, 8%);
60 | --searchbar-border-active: #449f97;
61 | --searchbar-shadow-active: rgb(68, 159, 151, 20%);
62 | --searchbar-placeholder-color: #7f7f7f;
63 | --searchbar-icon-color: #969696;
64 | --searchresults-li-bg: #303446;
65 | --search-mark-bg: #449f97;
66 | }
67 | }
68 |
69 | @media (prefers-color-scheme: dark) {
70 | :root {
71 | --bg: #181818;
72 | --fg: #afafaf;
73 |
74 | --sidebar-bg: #242424;
75 | --sidebar-fg: #c3c3c3;
76 | --sidebar-part-text-color: #a7a7a7;
77 | --sidebar-part-bg-color: #5e5e5e;
78 | --sidebar-text-active: #ffffff;
79 | --sidebar-hover-color: rgb(255, 255, 255, 3%);
80 | --sidebar-active-color: rgb(255, 255, 255, 6%);
81 | --sidebar-border: rgb(255, 255, 255, 8%);
82 | --sidebar-shadow: rgb(0, 0, 0, 40%);
83 | --sidebar-non-existant: #686868;
84 | --sidebar-active: #32746e;
85 | --sidebar-spacer: #737994;
86 |
87 | --hljs-text-color: #32746e;
88 | --hljs-background-color: rgb(50, 116, 110, 8%);
89 |
90 | --icon-button-color: #ababab;
91 | --icon-button-hover-color: #1f1f1f;
92 | --icon-button-active-color: #242424;
93 |
94 | --hr-bg: rgb(255, 255, 255, 6%);
95 |
96 | --scrollbar: #737994;
97 |
98 | --icons: #737994;
99 | --icons-hover: #838ba7;
100 |
101 | --links: #32746e;
102 |
103 | --inline-code-color: #3f9089;
104 |
105 | --quote-bg: rgb(50, 116, 110, 8%);
106 | --quote-color: #32746e;
107 |
108 | --table-border-color: #343b3a;
109 | --table-header-bg: rgb(50, 116, 110, 8%);
110 | --table-alternate-bg: rgb(50, 116, 110, 8%);
111 |
112 | --searchbar-border-color: rgb(255, 255, 255, 8%);
113 | --searchbar-bg: #242424;
114 | --searchbar-fg: #bababa;
115 | --searchbar-shadow-color: rgba(0, 0, 0, 40%);
116 | --searchresults-border-color: rgb(255, 255, 255, 8%);
117 | --searchbar-border-active: #32746e;
118 | --searchbar-shadow-active: rgb(50, 116, 110, 20%);
119 | --searchbar-placeholder-color: #7f7f7f;
120 | --searchbar-icon-color: #969696;
121 | --searchresults-li-bg: #303446;
122 | --search-mark-bg: #32746e;
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/PlayBook/theme/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PlayCover/PlayBook/e40bdea76e171aec1af5d50826d7c0b00d579b0b/PlayBook/theme/favicon.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PlayBook
2 | User documentation for PlayCover.
3 |
4 | **How to contribute to PlayBook properly**:
5 | 1. Install rust, `brew install rust`.
6 | 2. Download and extract the modified build of mdbook from [here](https://github.com/PlayCover/mdBook/releases).
7 | 3. Download the contents of the PlayBook repository, `git clone https://github.com/PlayCover/PlayBook`
8 | 4. Change the active directory to `../PlayBook/PlayBook`.
9 | 5. Run ` serve --open -n 127.0.0.1` to preview the book in a local web server to check your work. It also hot reloads.
10 |
--------------------------------------------------------------------------------
/resources/template_ipa_library.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "bundleID": "com.io.playcover.PCTT",
4 | "name": "PCTT",
5 | "version": "1.0",
6 | "itunesLookup": "",
7 | "link": "https://github.com/PlayCover/PlayCover-Test-Toolkit/releases/download/1.0/PCTT.ipa"
8 | },
9 | {
10 | "bundleID": "xyz.skitty.Aidoku",
11 | "name": "Aidoku",
12 | "version": "0.5",
13 | "itunesLookup": "",
14 | "link": "https://github.com/Aidoku/Aidoku/releases/download/v0.5/Aidoku.ipa"
15 | },
16 | {
17 | "bundleID": "com.litchie.idosgames",
18 | "name": "iDos",
19 | "version": "2.1",
20 | "itunesLookup": "",
21 | "link": "https://github.com/litchie/dospad/releases/download/2.1/iDOS.ipa"
22 | },
23 | {
24 | "bundleID": "com.example.mame4ios",
25 | "name": "MAME4iOS",
26 | "version": "2022.4-248",
27 | "itunesLookup": "",
28 | "link": "https://github.com/yoshisuga/MAME4iOS/releases/download/2002.4/MAME4iOS-2022.4-248.ipa"
29 | },
30 | {
31 | "bundleID": "net.namedfork.minivmac",
32 | "name": "Mini vMac for iOS",
33 | "version": "2.5",
34 | "itunesLookup": "",
35 | "link": "https://github.com/zydeco/minivmac4ios/releases/download/v2.5/minivmac4ios-2.5.ipa"
36 | },
37 | {
38 | "bundleID": "org.provenance-emu.provenance",
39 | "name": "Provenance",
40 | "version": "2.1.1",
41 | "itunesLookup": "",
42 | "link": "https://github.com/Provenance-Emu/Provenance/releases/download/2.1.1/Provenance-iOS.ipa"
43 | },
44 | {
45 | "bundleID": "stream.yattee.app",
46 | "name": "Yatee",
47 | "version": "1.4-alpha.7",
48 | "itunesLookup": "",
49 | "link": "https://github.com/yattee/yattee/releases/download/v1.4-alpha.7/Yattee-1.4-alpha.7-iOS.ipa"
50 | },
51 | {
52 | "bundleID": "net.yura.domination",
53 | "name": "Domination",
54 | "version": "1.2.5",
55 | "itunesLookup": "",
56 | "link": "https://master.dl.sourceforge.net/project/domination/Domination/1.2.5/Domination-4.ipa?viasf=1"
57 | },
58 | {
59 | "bundleID": "net.kdt.pojavlauncher",
60 | "name": "Pojav Launcher",
61 | "version": "2.1.3",
62 | "itunesLookup": "",
63 | "link": "https://github.com/PojavLauncherTeam/PojavLauncher_iOS/releases/download/v2.1.3/net.kdt.pojavlauncher-2.1.3.ipa"
64 | }
65 | ]
66 |
--------------------------------------------------------------------------------