Skip to content

Commit

Permalink
Stylesheets and fonts
Browse files Browse the repository at this point in the history
  • Loading branch information
hramos committed May 24, 2016
1 parent 12c076d commit 0925254
Show file tree
Hide file tree
Showing 164 changed files with 18,009 additions and 11,273 deletions.
2 changes: 2 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ support_url: https://www.parse.com/help
# Build settings
markdown: kramdown
exclude: [ Gemfile, Gemfile.lock, README.md, config.codekit ]
sass:
sass_dir: css
10 changes: 5 additions & 5 deletions _includes/android/push-notifications.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Sending notifications is often done from the Parse.com push console, the [REST A

However, be sure you understand that enabling Client Push can lead to a security vulnerability in your app, as outlined [on our blog](http://blog.parse.com/2014/09/03/the-dangerous-world-of-client-push/). We recommend that you enable Client Push for testing purposes only, and move your push notification logic into Cloud Code when your app is ready to go into production.

![](/images/docs/client_push_settings.png)
![](/assets/images/client_push_settings.png)

You can view your past push notifications on the Parse.com push console for up to 30 days after creating your push. For pushes scheduled in the future, you can delete the push on the push console as long as no sends have happened yet. After you send the push, the push console shows push analytics graphs.

Expand All @@ -95,7 +95,7 @@ By default, the main activity for your app will be run when a user responds to n

Once subscribed to the "Giants" channel, your `Installation` object should have an updated `channels` field.

![](/images/docs/installation_channel.png)
![](/assets/images/installation_channel.png)

Unsubscribing from a channel is just as easy:

Expand Down Expand Up @@ -389,15 +389,15 @@ Our web push console guides you through every step of setting up an A/B test.

For each push campaign sent through the Parse web push console, you can allocate a subset of your devices to be in the experiment's test audience, which Parse will automatically split into two equally-sized experiment groups. For each experiment group, you can specify a different push message. The remaining devices will be saved so that you can send the winning message to them later. Parse will randomly assign devices to each group to minimize the chance for a test to affect another test's results (although we still don't recommend running multiple A/B tests over the same devices on the same day).

![](/images/docs/ios_push/experiment_enable.png)
![](/assets/images/experiment_enable.png)

After you send the push, you can come back to the push console to see in real time which version resulted in more push opens, along with other metrics such as statistical confidence interval. It's normal for the number of recipients in each group to be slightly different because some devices that we had originally allocated to that experiment group may have uninstalled the app. It's also possible for the random group assignment to be slightly uneven when the test audience size is small. Since we calculate open rate separately for each group based on recipient count, this should not significantly affect your experiment results.

![](/images/docs/ios_push/experiment_results.png)
![](/assets/images/experiment_results.png)

If you are happy with the way one message performed, you can send that to the rest of your app's devices (i.e. the “Launch Group”). This step only applies to A/B tests where you vary the message.

![](/images/docs/ios_push/experiment_launch.png)
![](/assets/images/experiment_launch.png)

Push experiments are supported on all recent Parse SDKs (iOS v1.2.13+, Android v1.4.0+, .NET v1.2.7+). Before running experiments, you must instrument your app with [push open tracking](#push-notifications-tracking-pushes-and-app-opens).

Expand Down
10 changes: 10 additions & 0 deletions _includes/common/errors.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `AppNameInvalid` | 256 | App name is invalid. |
| `MissingAPIKeyError` | 902 | The request is missing an API key. |
| `InvalidAPIKeyError` | 903 | The request is using an invalid API key. |
{: .docs_table}

## Push related errors

Expand All @@ -66,6 +67,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `InvalidExpirationError` | 138 | Invalid expiration value. |
| `MissingPushIdError` | 156 | A push id is missing. Deprecated. |
| `MissingDeviceTypeError` | 157 | The device type field is missing. Deprecated. |
{: .docs_table}

## File related errors

Expand All @@ -78,6 +80,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `FileTooLarge` | 129 | File size exceeds maximum allowed. |
| `FileSaveError` | 130 | Error saving a file. |
| `FileDeleteError` | 131 | File could not be deleted. |
{: .docs_table}

## Installation related errors

Expand All @@ -88,6 +91,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `InvalidChannelsArrayError` | 134 | Invalid channels array value. |
| `MissingRequiredFieldError` | 135 | Required field is missing. |
| `ChangedImmutableFieldError` | 136 | An immutable field was changed. |
{: .docs_table}

## Purchase related errors

Expand All @@ -100,6 +104,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `ProductNotFoundInAppStore` | 147 | The product is not found in the App Store. |
| `InvalidServerResponse` | 148 | The Apple server response is not valid. |
| `ProductDownloadFilesystemError` | 149 | The product fails to download due to file system error. |
{: .docs_table}

## User related errors

Expand All @@ -115,6 +120,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `MustCreateUserThroughSignup` | 207 | A user can only be created through signup. |
| `AccountAlreadyLinked` | 208 | An account being linked is already linked to another user. |
| `InvalidSessionToken` | 209 | The device's session token is no longer valid. The application should ask the user to log in again. |
{: .docs_table}

## Linked services errors

Expand All @@ -138,6 +144,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `TwitterSigninDisabled` | 252 | Authentication by Twitter is not supported for this application. Check your Parse app's authentication settings. |
| `InvalidAuthDataError` | 253 | An invalid authData value was passed. Check error message for more details. |
| `LinkingNotSupportedError` | 999 | Linking to an external account not supported yet with signup_or_login. Use update instead. |
{: .docs_table}

## Client-only errors

Expand All @@ -147,6 +154,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `AggregateError` | 600 | There were multiple errors. Aggregate errors have an "errors" property, which is an array of error objects with more detail about each error that occurred. |
| `FileReadError ` | 601 | Unable to read input for a %{ParseFile} on the client. |
| `XDomainRequest` | 602 | A real error code is unavailable because we had to use an XDomainRequest object to allow CORS requests in Internet Explorer, which strips the body from HTTP responses that have a non-2XX status code. |
{: .docs_table}

## Operational issues

Expand All @@ -157,6 +165,7 @@ The following is a list of all the error codes that can be returned by the Parse
| `RequestLimitExceeded` | 155 | This application has exceeded its request limit. Please retry in one minute or raise your request limit at https://parse.com/account. Check error message for more details. |
| `TemporaryRejectionError` | 159 | An application's requests are temporary rejected by the server. |
| `DatabaseNotMigratedError` | 428 | You should migrate your database as soon as possible. |
{: .docs_table}

If your requests are rejected with a 155 error code, your application may be [exceeding its request limit](/plans/faq#request-limit-exceeded). You can learn more about [how the request limit is calculated in the Pricing FAQ](/plans/faq#how-are-requests-per-second-calculated). If waiting one minute or [increasing the request limit](/plans/faq#increasing-request-limit) does not resolve the issue, [please file a bug report](https://parse.com/help#report). If your requests are being rejected with a 159 error code, [please file a bug report](https://parse.com/help#report) for further instructions on how to resolve the issue. If your requests are rejected with a 428 error code, please [migrate your database](https://parse.com/migration) as soon as possible.

Expand All @@ -168,3 +177,4 @@ If your requests are rejected with a 155 error code, your application may be [ex
| `InternalServerError` | 1 | Internal server error. No information available. |
| `ServiceUnavailable` | 2 | The service is currently unavailable. |
| `ClientDisconnected` | 4 | Connection failure. |
{: .docs_table}
4 changes: 2 additions & 2 deletions _includes/common/security.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Almost every class that you create should have these permissions tweaked to some

As a start, you can configure your application so that clients cannot create new classes on Parse. This is done from the Settings tab on the Data Browser. Scroll down to the **App Permissions** section and turn off **Allow client class creation**. Once enabled, classes may only be created from the Data Browser. This will prevent attackers from filling your database with unlimited, arbitrary new classes.

![](/images/docs/security/client_class_creation.png)
![](/assets/images/client_class_creation.png)

### Configuring Class-Level Permissions

Expand Down Expand Up @@ -323,7 +323,7 @@ Note that this ACL is not actually created on each object. Any existing ACLs wil

Class-Level Permissions (CLPs) and Access Control Lists (ACLs) are both powerful tools for securing your app, but they don't always interact exactly how you might expect. They actually represent two separate layers of security that each request has to pass through to return the correct information or make the intended change. These layers, one at the class level, and one at the object level, are shown below. A request must pass through BOTH layers of checks in order to be authorized. Note that despite acting similarly to ACLs, [Pointer Permissions](#security-pointer-permissions) are a type of class level permission, so a request must pass the pointer permission check in order to pass the CLP check.

![](/images/docs/security/clp_vs_acl_diagram.png)
![](/assets/images/clp_vs_acl_diagram.png)

As you can see, whether a user is authorized to make a request can become complicated when you use both CLPs and ACLs. Let's look at an example to get a better sense of how CLPs and ACLs can interact. Say we have a `Photo` class, with an object, `photoObject`. There are 2 users in our app, `user1` and `user2`. Now lets say we set a Get CLP on the `Photo` class, disabling public Get, but allowing `user1` to perform Get. Now let's also set an ACL on `photoObject` to allow Read - which includes GET - for only `user2`.

Expand Down
105 changes: 81 additions & 24 deletions _includes/head.html
Original file line number Diff line number Diff line change
@@ -1,26 +1,83 @@
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
<meta name="description" content="{{ site.description }}">
<meta name="viewport" content="width=device-width, initial-scale=1">

<meta property="og:site_name" content="{{ site.name }}"/>
<meta property="og:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}"/>
<meta property="og:description" content="{{ site.description }}"/>
<meta property="og:image" content="http://parseplatform.github.io/img/preview.png">

<link rel="icon" type="image/png" href="/img/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/img/favicon/favicon-194x194.png" sizes="194x194">
<link rel="icon" type="image/png" href="/img/favicon/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="/img/favicon/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="/img/favicon/favicon-16x16.png" sizes="16x16">

<link rel="stylesheet" href="/css/normalize.css">
<link rel="stylesheet" href="/css/main.css">
<script src="/js/vendor/modernizr-2.8.3.min.js"></script>
<script src="https://www.parsecdn.com/js/parse-1.6.7.min.js"></script>
<script>
var gitJson = {{ site.github.public_repositories | jsonify }};
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>iOS Developers Guide | Parse</title>

<link rel="apple-touch-icon" sizes="57x57" href="https://parse.com/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="114x114" href="https://parse.com/apple-touch-icon-114x114.png">
<link rel="apple-touch-icon" sizes="72x72" href="https://parse.com/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="144x144" href="https://parse.com/apple-touch-icon-144x144.png">
<link rel="apple-touch-icon" sizes="60x60" href="https://parse.com/apple-touch-icon-60x60.png">
<link rel="apple-touch-icon" sizes="120x120" href="https://parse.com/apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" sizes="76x76" href="https://parse.com/apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" sizes="152x152" href="https://parse.com/apple-touch-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="https://parse.com/apple-touch-icon-180x180.png">
<meta name="apple-mobile-web-app-title" content="Parse">
<link rel="icon" type="image/png" href="https://parse.com/favicon-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="https://parse.com/favicon-160x160.png" sizes="160x160">
<link rel="icon" type="image/png" href="https://parse.com/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="https://parse.com/favicon-16x16.png" sizes="16x16">
<link rel="icon" type="image/png" href="https://parse.com/favicon-32x32.png" sizes="32x32">
<meta name="msapplication-TileColor" content="#5298fc">
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
<meta name="application-name" content="Parse">

<meta name="theme-color" content="#5298fc">

<!-- CSS -->
<!-- build:css -->
<link href="/css/lib/vendor/prism.css" rel="stylesheet" />
<link href="/css/lib/vendor/custom_prism-okaidia.css" rel="stylesheet" />
<link href="/css/lib/vendor/prism-line-numbers.css" rel="stylesheet" />
<link href="/css/docs.css" rel="stylesheet" />
<!-- endbuild -->


<!--[if lte IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/classlist/2014.01.31/classList.min.js"></script>
<![endif]-->

<script src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>



<!--[if lt IE 8]>
<link rel="stylesheet" type="text/css" href="/stylesheets/ie7.css" />
<![endif]-->
<!--[if IE 8]>
<link rel="stylesheet" type="text/css" href="/stylesheets/ie8.css" />
<![endif]-->
<!--[if lt IE 10]>
<link rel="stylesheet" type="text/css" href="/stylesheets/ie89.css" />
<![endif]-->
<script>if(Function('/*@cc_on return document.documentMode===10@*/')()){document.documentElement.className+=' ie10';}</script>

<meta name="csrf-param" content="authenticity_token">
<meta name="csrf-token" content="KxDoKysxiXDIRV8VXwDYlQStDGzjbGZ24y6ZgQLYAsE=">
<meta name="description" content="Focus on creating unique &amp; engaging apps on any platform. We take care of everything else your app needs, from the core of your app to analytics and push notifications.">
<meta name="keywords" content="backend, mobile, development, server, code">
<meta property="fb:app_id" content="361736430535656">
<meta property="og:type" content="website">
<meta property="og:title" content="Parse">
<meta property="og:image" content="http://parse.com/images/og/default.jpg">
<meta property="og:description" content="Focus on creating unique &amp; engaging apps on any platform. We take care of everything else your app needs, from the core of your app to analytics and push notifications.">
<meta property="og:url" content="https://parse.com/docs/ios/guide">
<meta name="viewport" content="width=device-width, initial-scale=1">


<script type="text/javascript">var _sf_startpt=(new Date()).getTime()</script>
<script type="text/javascript" async="" src="./docs-detail_files/tagjs"></script><meta name="chromesniffer" id="chromesniffer_meta" content="{&quot;Google Analytics&quot;:-1,&quot;jQuery&quot;:&quot;1.7.2&quot;,&quot;jQuery UI&quot;:&quot;1.8.21&quot;,&quot;Backbone.js&quot;:&quot;0.9.2&quot;,&quot;Underscore.js&quot;:&quot;1.4.4&quot;}"><script type="text/javascript" src="chrome-extension://homgcnaoacgigpkkljjjekpignblkeae/detector.js"></script><style id="style-1-cropbar-clipper">/* Copyright 2014 Evernote Corporation. All rights reserved. */
.en-markup-crop-options {
top: 18px !important;
left: 50% !important;
margin-left: -100px !important;
width: 200px !important;
border: 2px rgba(255,255,255,.38) solid !important;
border-radius: 4px !important;
}

.en-markup-crop-options div div:first-of-type {
margin-left: 0px !important;
}
</style>
</head>
Loading

0 comments on commit 0925254

Please sign in to comment.