diff --git a/README.md b/README.md index 2927705a1..11612b72e 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Then run webpack and Jekyll: npm start ``` -Finally, open http://localhost:4000/docs/ in your web browser. +Finally, open http://localhost:4000/ in your web browser. ----- diff --git a/_includes/android/analytics.md b/_includes/android/analytics.md index 6fef1085f..5f1bdcc5e 100644 --- a/_includes/android/analytics.md +++ b/_includes/android/analytics.md @@ -16,7 +16,7 @@ ParseAnalytics.trackAppOpenedInBackground(getIntent()); Graphs and breakdowns of your statistics are accessible from your app's Dashboard. -Further analytics are available around push notification delivery and open rates. Take a look at the [Tracking Pushes and App Opens subsection](/docs/android/guide#push-notifications-tracking-pushes-and-app-opens) of our Push Guide for more detailed information on handling notification payloads and push-related callbacks. +Further analytics are available around push notification delivery and open rates. Take a look at the [Tracking Pushes and App Opens subsection]({{ site.baseUrl }}/android/guide/#tracking-pushes-and-app-openss) of our Push Guide for more detailed information on handling notification payloads and push-related callbacks. ## Custom Analytics diff --git a/_includes/android/files.md b/_includes/android/files.md index 1e3aee687..61a03280d 100644 --- a/_includes/android/files.md +++ b/_includes/android/files.md @@ -67,6 +67,6 @@ file.saveInBackground(new SaveCallback() { }); ``` -You can delete files that are referenced by objects using the [REST API](/docs/rest/guide/#files-deleting-files). You will need to provide the master key in order to be allowed to delete a file. +You can delete files that are referenced by objects using the [REST API]({{ site.baseUrl }}/rest/guide/#files-deleting-files). You will need to provide the master key in order to be allowed to delete a file. If your files are not referenced by any object in your app, it is not possible to delete them through the REST API. You may request a cleanup of unused files in your app's Settings page. Keep in mind that doing so may break functionality which depended on accessing unreferenced files through their URL property. Files that are currently associated with an object will not be affected. diff --git a/_includes/android/push-notifications.md b/_includes/android/push-notifications.md index 177211421..84168f28f 100644 --- a/_includes/android/push-notifications.md +++ b/_includes/android/push-notifications.md @@ -2,11 +2,11 @@ Push notifications are a great way to keep your users engaged and informed about your app. You can reach your entire user base quickly and effectively. This guide will help you through the setup process and the general usage of Parse to send push notifications. -If you haven't installed the SDK yet, [head over to the Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running. +If you haven't installed the SDK yet, [head over to the Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running. ## Setting Up Push -If you want to start using push, start by completing the [Android Push Notifications QuickStart Guide](/docs/parse-server/guide/#push-notifications-quick-start) to learn how to configure your app and send your first push notification. Come back to this guide afterwards to learn more about the push features offered by Parse. +If you want to start using push, start by completing the [Android Push Notifications QuickStart Guide]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to learn how to configure your app and send your first push notification. Come back to this guide afterwards to learn more about the push features offered by Parse. The Parse library provides push notifications using Google Cloud Messaging (GCM) if Google Play Services are available. Learn more about Google Play Services [here](https://developers.google.com/android/guides/overview). @@ -66,7 +66,7 @@ The Parse Android SDK will avoid making unnecessary requests. If a `ParseInstall There are two ways to send push notifications using Parse: [channels](#push-notifications-using-channels) and [advanced targeting](#push-notifications-using-advanced-targeting). Channels offer a simple and easy to use model for sending pushes, while advanced targeting offers a more powerful and flexible model. Both are fully compatible with each other and will be covered in this section. -Sending notifications is often done from the Parse.com push console, the [REST API](/docs/rest/guide#push-notifications-sending-pushes) or from [Cloud Code](/docs/js/guide#push-notifications-sending-pushes). However, push notifications can also be triggered by the existing client SDKs. If you decide to send notifications from the client SDKs, you will need to set **Client Push Enabled** in the Push Notifications settings of your Parse app. +Sending notifications is often done from the Parse.com push console, the [REST API]({{ site.baseUrl }}/rest/guide#push-notifications-sending-pushes) or from [Cloud Code]({{ site.baseUrl }}/js/guide#push-notifications-sending-pushes). However, push notifications can also be triggered by the existing client SDKs. If you decide to send notifications from the client SDKs, you will need to set **Client Push Enabled** in the Push Notifications settings of your Parse app. 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. @@ -319,11 +319,11 @@ wpPush.sendPushInBackground(); ## Scheduling Pushes -Sending scheduled push notifications is not currently supported by the Android SDK. Take a look at the [REST API](/docs/rest/guide#push-notifications-scheduling-pushes), [JavaScript SDK](/docs/js/guide#push-notifications-scheduling-pushes) or the push console on your Parse Dashboard. +Sending scheduled push notifications is not currently supported by the Android SDK. Take a look at the [REST API]({{ site.baseUrl }}/rest/guide#push-notifications-scheduling-pushes), [JavaScript SDK]({{ site.baseUrl }}/js/guide#push-notifications-scheduling-pushes) or the push console on your Parse Dashboard. ## Receiving Pushes -Make sure you've gone through the [Android Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to set up your app to receive pushes. +Make sure you've gone through the [Android Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to set up your app to receive pushes. When a push notification is received, the “title” is displayed in the status bar and the “alert” is displayed alongside the “title” when the user expands the notification drawer. If you choose to subclass `com.parse.ParsePushBroadcastReceiver`, be sure to replace that name with your class' name in the registration. @@ -472,7 +472,7 @@ Basically, you will need to run the same push query you're using for your target #### Debugging using the REST API -The REST API is quite easy to use for this sort of purpose as you can easily recreate the push query using the information provided in your push notification logs. If you look closely at the “Full Target” value in your push campaign log item, you may notice that it matches the query format for a REST API query. You can grab an example of what a [REST API query](/docs/rest#queries-constraints) over `ParseInstallation`s would look like from the REST API docs. Don't forget to use the `X-Parse-Master-Key` header to ensure that the Master Key is used to run this query. +The REST API is quite easy to use for this sort of purpose as you can easily recreate the push query using the information provided in your push notification logs. If you look closely at the “Full Target” value in your push campaign log item, you may notice that it matches the query format for a REST API query. You can grab an example of what a [REST API query]({{ site.baseUrl }}/rest#queries-constraints) over `ParseInstallation`s would look like from the REST API docs. Don't forget to use the `X-Parse-Master-Key` header to ensure that the Master Key is used to run this query. ```bash # Query over installations @@ -508,9 +508,9 @@ You can check the Push Delivery Report for the cause of failed deliveries: Misma If everything looks great so far, but push notifications are not showing up on your phone, there are a few more things you can check. -* [Upgrade to the latest SDK](/docs/downloads). This documentation covers the push API introduced in the 1.7.0 version of the Android Parse SDK. Please upgrade if you are getting compiler errors following these instructions. +* [Upgrade to the latest SDK]({{ site.baseUrl }}/downloads). This documentation covers the push API introduced in the 1.7.0 version of the Android Parse SDK. Please upgrade if you are getting compiler errors following these instructions. * Make sure you are using the correct `packageName` in your `AndroidManifest.xml`. -* Make sure you have the correct permissions listed in your `AndroidManifest.xml` file, as outlined in the [Android Push Quickstart](/docs/parse-server/guide/#push-notifications-quick-start). If you are using a a custom receiver, be sure you have registered it in the Manifest file with the correct `android:name` property and the proper intent filters. +* Make sure you have the correct permissions listed in your `AndroidManifest.xml` file, as outlined in the [Android Push Quickstart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start). If you are using a a custom receiver, be sure you have registered it in the Manifest file with the correct `android:name` property and the proper intent filters. * Make sure you've used the correct App ID and client key, and that `Parse.initialize()` is being called. `Parse.initialize()` lets the service know which application it is listening for; this code must be in your `Application.onCreate` rather than `Activity.onCreate` for a particular `Activity`, so that any activation technique will know how to use Parse. * Check that the push registration call is being called successfully. Your device must successfully register a ParseInstallation object with a valid GCM Registration id in the "deviceToken" field, if using GCM. * Check that the device is set to accept push notifications from your app. diff --git a/_includes/android/users.md b/_includes/android/users.md index b1e067be4..eb27988f5 100644 --- a/_includes/android/users.md +++ b/_includes/android/users.md @@ -45,7 +45,7 @@ This call will asynchronously create a new user in your Parse App. Before it doe Note that we used the `signUpInBackground` method, not the `saveInBackground` method. New `ParseUser`s should always be created using the `signUpInBackground` (or `signUp`) method. Subsequent updates to a user can be done by calling `save`. -The `signUpInBackground` method comes in various flavors, with the ability to pass back errors, and also synchronous versions. As usual, we highly recommend using the asynchronous versions when possible, so as not to block the UI in your app. You can read more about these specific methods in our [API docs](/docs/android/). +The `signUpInBackground` method comes in various flavors, with the ability to pass back errors, and also synchronous versions. As usual, we highly recommend using the asynchronous versions when possible, so as not to block the UI in your app. You can read more about these specific methods in our [API docs]({{ site.baseUrl }}/android/). If a signup isn't successful, you should read the error object that is returned. The most likely case is that the username or email has already been taken by another user. You should clearly communicate this to your users, and ask them try a different username. diff --git a/_includes/arduino/cloud-code.md b/_includes/arduino/cloud-code.md index 3e33ce599..b7ed8e276 100644 --- a/_includes/arduino/cloud-code.md +++ b/_includes/arduino/cloud-code.md @@ -2,7 +2,7 @@ Cloud Functions allow you to run custom app logic in the Parse Cloud. This is especially useful for running complex app logic in the cloud so that you can reduce the memory footprint of your code on the IoT device. In a Cloud Function, you can query/save Parse data, send push notifications, and log analytics events. -You write your Cloud Code in JavaScript using the Parse JavaScript SDK. We provide a command-line tool to help you deploy your Cloud Code. See our [Cloud Code guide](/docs/cloud_code_guide) for details. +You write your Cloud Code in JavaScript using the Parse JavaScript SDK. We provide a command-line tool to help you deploy your Cloud Code. See our [Cloud Code guide]({{ site.baseUrl }}/cloud_code_guide) for details. For example, you define a Cloud Function as below. diff --git a/_includes/arduino/objects.md b/_includes/arduino/objects.md index abf79f613..256cb253b 100644 --- a/_includes/arduino/objects.md +++ b/_includes/arduino/objects.md @@ -82,7 +82,7 @@ del.send(); ## Data Types -So far we've used values with type `string`, `double`, and `bool`. The Parse Arduino SDK also supports `GeoPoint`s (latitude and longitude). In addition, you can set values on objects via JSON and be able to represent Arrays, Objects, Dates, and more. Read more about representing these types as JSON in the [REST API guide](/docs/rest#objects-types). +So far we've used values with type `string`, `double`, and `bool`. The Parse Arduino SDK also supports `GeoPoint`s (latitude and longitude). In addition, you can set values on objects via JSON and be able to represent Arrays, Objects, Dates, and more. Read more about representing these types as JSON in the [REST API guide]({{ site.baseUrl }}/rest#objects-types). Overall, the following types are allowed for each field in your object: @@ -112,6 +112,6 @@ create.addJSONValue("emptyField", "null"); create.send(); ``` -We do not recommend storing large pieces of binary data like images or documents in a `ParseObject`. `ParseObject`s should not exceed 128 kilobytes in size. We recommend you use `ParseFile`s to store images, documents, and other types of files. You can do so by instantiating a `ParseFile` object and setting it on a field. See the [Files section in the REST documentation](/docs/rest#files) for more details. +We do not recommend storing large pieces of binary data like images or documents in a `ParseObject`. `ParseObject`s should not exceed 128 kilobytes in size. We recommend you use `ParseFile`s to store images, documents, and other types of files. You can do so by instantiating a `ParseFile` object and setting it on a field. See the [Files section in the REST documentation]({{ site.baseUrl }}/rest#files) for more details. -For more information about how Parse handles data, check out our documentation on [Data](/docs/rest#data). +For more information about how Parse handles data, check out our documentation on [Data]({{ site.baseUrl }}/rest#data). diff --git a/_includes/arduino/push-notifications.md b/_includes/arduino/push-notifications.md index c3f695a7e..30d32af1a 100644 --- a/_includes/arduino/push-notifications.md +++ b/_includes/arduino/push-notifications.md @@ -61,4 +61,4 @@ if (Parse.pushAvailable()) { ## Sending Pushes -There are many ways to send a push notification. It's possible to send from the Arduino SDK via a call to the REST API, but you'll most likely be sending from another environment. [Read here for more information on how to send pushes](/docs/rest#push-notifications). +There are many ways to send a push notification. It's possible to send from the Arduino SDK via a call to the REST API, but you'll most likely be sending from another environment. [Read here for more information on how to send pushes]({{ site.baseUrl }}/rest#push-notifications). diff --git a/_includes/arduino/requests.md b/_includes/arduino/requests.md index 37d646424..de44dafba 100644 --- a/_includes/arduino/requests.md +++ b/_includes/arduino/requests.md @@ -10,4 +10,4 @@ ParseResponse response = Parse.sendRequest("POST", "/1/users", "{\"username\":\" In this case, the response will contain the objectId of the created user, assuming it was created successfully. -Head on over to the [REST API documentation](/docs/rest) to discover what's possible. For each code sample, you can switch it to cURL to see what the endpoint and payload would look like. +Head on over to the [REST API documentation]({{ site.baseUrl }}/rest) to discover what's possible. For each code sample, you can switch it to cURL to see what the endpoint and payload would look like. diff --git a/_includes/arduino/users.md b/_includes/arduino/users.md index 25c9a133e..b2ded6f36 100644 --- a/_includes/arduino/users.md +++ b/_includes/arduino/users.md @@ -2,7 +2,7 @@ At the core of many apps, there is a notion of user accounts that lets users access their information in a secure manner. In our other SDKs, we provide a specialized user class that automatically handles much of the functionality required for user account management. Users are a special class of Parse Objects and has all the same features, such as flexible schema, automatic persistence, and a key value interface. -The Arduino SDK does not provide methods to directly sign in as a user. If you want to have the Arduino device act on behalf of a user, you will need to [create a Session through a companion app](/docs/ios#sessions) or another Parse SDK and pass a Restricted Session to the device. You can read more about users in our [REST API](/docs/rest#users) or one of our other [SDK guides](/docs). +The Arduino SDK does not provide methods to directly sign in as a user. If you want to have the Arduino device act on behalf of a user, you will need to [create a Session through a companion app]({{ site.baseUrl }}/ios#sessions) or another Parse SDK and pass a Restricted Session to the device. You can read more about users in our [REST API]({{ site.baseUrl }}/rest#users) or one of our other [SDK guides](/docs). ## Setting a Session @@ -16,4 +16,4 @@ From then on, the device will act on behalf of the user. ## Security -Parse uses ACLs to make sure objects can be accessed by users who are authorized with access. When creating objects, you can set the ACL field of the object to restrict access to a set of users. Read about this and more in the [REST API documentation](/docs/rest#users-security). +Parse uses ACLs to make sure objects can be accessed by users who are authorized with access. When creating objects, you can set the ACL field of the object to restrict access to a set of users. Read about this and more in the [REST API documentation]({{ site.baseUrl }}/rest#users-security). diff --git a/_includes/cloudcode/getting-started.md b/_includes/cloudcode/getting-started.md index 8fa2c913f..1d5a89b99 100644 --- a/_includes/cloudcode/getting-started.md +++ b/_includes/cloudcode/getting-started.md @@ -1,6 +1,6 @@ # Getting Started -Cloud Code is [built into Parse Server](/docs/parse-server/guide/). The default entry point for your Cloud Code is at `./cloud/main.js`. +Cloud Code is [built into Parse Server]({{ site.baseUrl }}/parse-server/guide/). The default entry point for your Cloud Code is at `./cloud/main.js`. ## What is Cloud Code? diff --git a/_includes/common/performance.md b/_includes/common/performance.md index 376ff2caa..96c635452 100644 --- a/_includes/common/performance.md +++ b/_includes/common/performance.md @@ -786,7 +786,7 @@ var results = await ParseObject.GetQuery("GameScore") ## Client-side Caching -For queries run from iOS and Android, you can turn on query caching. See the [iOS](/docs/ios/guide#queries-caching-queries) and [Android](/docs/android/guide#queries-caching-queries) guides for more details. Caching queries will increase your mobile app's performance especially in cases where you want to display cached data while fetching the latest data from Parse. +For queries run from iOS and Android, you can turn on query caching. See the [iOS]({{ site.baseUrl }}/ios/guide#queries-caching-queries) and [Android]({{ site.baseUrl }}/android/guide#queries-caching-queries) guides for more details. Caching queries will increase your mobile app's performance especially in cases where you want to display cached data while fetching the latest data from Parse. ## Use Cloud Code @@ -794,7 +794,7 @@ Cloud Code allows you to run custom JavaScript logic on Parse Server instead of You can use this to offload processing to the Parse servers thus increasing your app's perceived performance. You can create hooks that run whenever an object is saved or deleted. This is useful if you want to validate or sanitize your data. You can also use Cloud Code to modify related objects or kick off other processes such as sending off a push notification. -We saw examples of limiting the data returned by writing restrictive queries. You can also use [Cloud Functions](/docs/cloudcode/guide#cloud-code-cloud-functions) to help limit the amount of data returned to your app. In the following example, we use a Cloud Function to get a movie's average rating: +We saw examples of limiting the data returned by writing restrictive queries. You can also use [Cloud Functions]({{ site.baseUrl }}/cloudcode/guide#cloud-code-cloud-functions) to help limit the amount of data returned to your app. In the following example, we use a Cloud Function to get a movie's average rating: ```javascript Parse.Cloud.define("averageStars", function(request, response) { @@ -815,7 +815,7 @@ Parse.Cloud.define("averageStars", function(request, response) { You could have ran a query on the Review class on the client, returned only the stars field data and computed the result on the client. As the number of reviews for a movie increases you can see that the data being returned to the device using this methodology also increases. Implementing the functionality through a Cloud Function returns the one result if successful. -As you look at optimizing your queries, you'll find that you may have to change the queries - sometimes even after you've shipped your app to the App Store or Google Play. The ability to change your queries without a client update is possible if you use [Cloud Functions](/docs/cloudcode/guide#cloud-code-cloud-functions). Even if you have to redesign your schema, you could make all the changes in your Cloud Functions while keeping the client interface the same to avoid an app update. Take the average stars Cloud Function example from before, calling it from a client SDK would look like this: +As you look at optimizing your queries, you'll find that you may have to change the queries - sometimes even after you've shipped your app to the App Store or Google Play. The ability to change your queries without a client update is possible if you use [Cloud Functions]({{ site.baseUrl }}/cloudcode/guide#cloud-code-cloud-functions). Even if you have to redesign your schema, you could make all the changes in your Cloud Functions while keeping the client interface the same to avoid an app update. Take the average stars Cloud Function example from before, calling it from a client SDK would look like this: ```javascript Parse.Cloud.run("averageStars", { "movie": "The Matrix" }).then(function(ratings) { diff --git a/_includes/common/security.md b/_includes/common/security.md index 3955b1449..160fee71d 100644 --- a/_includes/common/security.md +++ b/_includes/common/security.md @@ -72,7 +72,7 @@ When a user logs into an app, they initiate a session with Parse. Through this s The easiest way to control who can access which data is through access control lists, commonly known as ACLs. The idea behind an ACL is that each object has a list of users and roles along with what permissions that user or role has. A user needs read permissions (or must belong to a role that has read permissions) in order to retrieve an object's data, and a user needs write permissions (or must belong to a role that has write permissions) in order to update or delete that object. -Once you have a User, you can start using ACLs. Remember: Users can be created through traditional username/password signup, through a third-party login system like Facebook or Twitter, or even by using Parse's [automatic anonymous users](/docs/ios/guide#users-anonymous-users) functionality. To set an ACL on the current user's data to not be publicly readable, all you have to do is: +Once you have a User, you can start using ACLs. Remember: Users can be created through traditional username/password signup, through a third-party login system like Facebook or Twitter, or even by using Parse's [automatic anonymous users]({{ site.baseUrl }}/ios/guide#users-anonymous-users) functionality. To set an ACL on the current user's data to not be publicly readable, all you have to do is:

 PFUser *user = [PFUser currentUser];
@@ -470,17 +470,17 @@ There are some special classes in Parse that don't follow all of the same securi
 
 6. Get requests on installations follow ACLs normally. Find requests without master key is not allowed unless you supply the `installationId` as a constraint.
 
-7. Update requests on installations do adhere to the ACL defined on the installation, but Delete requests are master-key-only. For more information about how installations work, check out the [installations section of the REST guide](/docs/rest#installations).
+7. Update requests on installations do adhere to the ACL defined on the installation, but Delete requests are master-key-only. For more information about how installations work, check out the [installations section of the REST guide]({{ site.baseUrl }}/rest#installations).
 
 ## Data Integrity in Cloud Code
 
-For most apps, care around keys, class-level permissions, and object-level ACLs are all you need to keep your app and your users' data safe. Sometimes, though, you'll run into an edge case where they aren't quite enough. For everything else, there's [Cloud Code](/docs/cloudcode/guide#cloud-code).
+For most apps, care around keys, class-level permissions, and object-level ACLs are all you need to keep your app and your users' data safe. Sometimes, though, you'll run into an edge case where they aren't quite enough. For everything else, there's [Cloud Code]({{ site.baseUrl }}/cloudcode/guide#cloud-code).
 
 Cloud Code allows you to upload JavaScript to Parse's servers, where we will run it for you. Unlike client code running on users' devices that may have been tampered with, Cloud Code is guaranteed to be the code that you've written, so it can be trusted with more responsibility.
 
 One particularly common use case for Cloud Code is preventing invalid data from being stored. For this sort of situation, it's particularly important that a malicious client not be able to bypass the validation logic.
 
-To create validation functions, Cloud Code allows you to implement a `beforeSave` trigger for your class. These triggers are run whenever an object is saved, and allow you to modify the object or completely reject a save. For example, this is how you create a [Cloud Code beforeSave trigger](/docs/cloudcode/guide#cloud-code-beforesave-triggers) to make sure every user has an email address set:
+To create validation functions, Cloud Code allows you to implement a `beforeSave` trigger for your class. These triggers are run whenever an object is saved, and allow you to modify the object or completely reject a save. For example, this is how you create a [Cloud Code beforeSave trigger]({{ site.baseUrl }}/cloudcode/guide#cloud-code-beforesave-triggers) to make sure every user has an email address set:
 
 ```js
 Parse.Cloud.beforeSave(Parse.User, function(request, response) {
@@ -493,7 +493,7 @@ Parse.Cloud.beforeSave(Parse.User, function(request, response) {
 });
 ```
 
-Our [Cloud Code guide](/docs/cloudcode/guide#cloud-code) provides instructions on how to upload this trigger to our servers.
+Our [Cloud Code guide]({{ site.baseUrl }}/cloudcode/guide#cloud-code) provides instructions on how to upload this trigger to our servers.
 
 Validations can lock down your app so that only certain values are acceptable. You can also use `afterSave` validations to normalize your data (e.g. formatting all phone numbers or currency identically). You get to retain most of the productivity benefits of accessing Parse data directly from your client applications, but you can also enforce certain invariants for your data on the fly.
 
diff --git a/_includes/dotnet/analytics.md b/_includes/dotnet/analytics.md
index 806797acc..5f5dec019 100644
--- a/_includes/dotnet/analytics.md
+++ b/_includes/dotnet/analytics.md
@@ -16,7 +16,7 @@ ParseAnalytics.TrackAppOpenedAsync();
 
 Graphs and breakdowns of your statistics are accessible from your app's Dashboard.
 
-Further analytics are available around push notification delivery and open rates. Take a look at the [Tracking Pushes and App Opens subsection](/docs/push_guide#receiving-tracking/.NET) of our Push Guide for more detailed information on handling remote notification payloads and push-related callbacks.
+Further analytics are available around push notification delivery and open rates. Take a look at the [Tracking Pushes and App Opens subsection]({{ site.baseUrl }}/push_guide#receiving-tracking/.NET) of our Push Guide for more detailed information on handling remote notification payloads and push-related callbacks.
 
 
 ## Custom Analytics
diff --git a/_includes/dotnet/files.md b/_includes/dotnet/files.md
index c07a75555..721df878f 100644
--- a/_includes/dotnet/files.md
+++ b/_includes/dotnet/files.md
@@ -51,6 +51,6 @@ await file.SaveAsync(new Progress(e => {
 }));
 ```
 
-You can delete files that are referenced by objects using the [REST API](/docs/rest#files-deleting). You will need to provide the master key in order to be allowed to delete a file.
+You can delete files that are referenced by objects using the [REST API]({{ site.baseUrl }}/rest#files-deleting). You will need to provide the master key in order to be allowed to delete a file.
 
 If your files are not referenced by any object in your app, it is not possible to delete them through the REST API. You may request a cleanup of unused files in your app's Settings page. Keep in mind that doing so may break functionality which depended on accessing unreferenced files through their URL property. Files that are currently associated with an object will not be affected.
diff --git a/_includes/dotnet/push-notifications.md b/_includes/dotnet/push-notifications.md
index de2c15735..be8a770f5 100644
--- a/_includes/dotnet/push-notifications.md
+++ b/_includes/dotnet/push-notifications.md
@@ -2,7 +2,7 @@
 
 Push Notifications are a great way to keep your users engaged and informed about your app. You can reach your entire user base quickly and effectively. This guide will help you through the setup process and the general usage of Parse to send push notifications.
 
-If you haven't installed the SDK yet, please [head over to the Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running.
+If you haven't installed the SDK yet, please [head over to the Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running.
 
 
The .NET SDK can send push notifications from all runtimes, but only Windows 8, Windows Phone 8, and Xamarin apps can receive pushes from the push servers. @@ -35,7 +35,7 @@ If you want to start using push on Unity Android, start by completing [Android P Every Parse application installed on a device registered for push notifications has an associated `Installation` object. The `Installation` object is where you store all the data needed to target push notifications. For example, in a baseball app, you could store the teams a user is interested in to send updates about their performance. Saving the `Installation` object is also required for tracking push-related app open events. -On .NET, `Installation` objects are available through the `ParseInstallation` class, a subclass of `ParseObject`. It uses the [same API](/docs/dotnet/guide#objects) for storing and retrieving data. To access the current `Installation` object from your .NET app, use the `ParseInstallation.CurrentInstallation` property. +On .NET, `Installation` objects are available through the `ParseInstallation` class, a subclass of `ParseObject`. It uses the [same API]({{ site.baseUrl }}/dotnet/guide#objects) for storing and retrieving data. To access the current `Installation` object from your .NET app, use the `ParseInstallation.CurrentInstallation` property. While it is possible to modify a `ParseInstallation` just like you would a `ParseObject`, there are several special fields that help manage and target devices. @@ -139,13 +139,13 @@ If you want to target multiple channels with a single push notification, you can ### Using Advanced Targeting -While channels are great for many applications, sometimes you need more precision when targeting the recipients of your pushes. Parse allows you to write a query for any subset of your `Installation` objects using the [querying API](/docs/dotnet/guide#queries) and to send them a push. +While channels are great for many applications, sometimes you need more precision when targeting the recipients of your pushes. Parse allows you to write a query for any subset of your `Installation` objects using the [querying API]({{ site.baseUrl }}/dotnet/guide#queries) and to send them a push. Since `ParseInstallation` is a subclass of `ParseObject`, you can save any data you want and even create relationships between `Installation` objects and your other objects. This allows you to send pushes to a very customized and dynamic segment of your user base. #### Saving Installation Data -Storing data on an `Installation` object is just as easy as storing [any other data](/docs/dotnet/guide#objects) on Parse. In our Baseball app, we could allow users to get pushes about game results, scores and injury reports. +Storing data on an `Installation` object is just as easy as storing [any other data]({{ site.baseUrl }}/dotnet/guide#objects) on Parse. In our Baseball app, we could allow users to get pushes about game results, scores and injury reports. ```cs // Store the category of push notifications the user would like to receive. @@ -167,7 +167,7 @@ await installation.SaveAsync(); #### Sending Pushes to Queries -Once you have your data stored on your `Installation` objects, you can use a `ParseQuery` to target a subset of these devices. `Installation` queries work just like any other [Parse query](/docs/dotnet/guide#queries), but we use the special static property `ParseInstallation.Query` to create it. We set this query on our `ParsePush` object, before sending the notification. +Once you have your data stored on your `Installation` objects, you can use a `ParseQuery` to target a subset of these devices. `Installation` queries work just like any other [Parse query]({{ site.baseUrl }}/dotnet/guide#queries), but we use the special static property `ParseInstallation.Query` to create it. We set this query on our `ParsePush` object, before sending the notification. ```cs var push = new ParsePush(); @@ -470,5 +470,5 @@ Setting up Push Notifications is often a source of frustration for developers. T * Clean and build your project. * Check the number of recipients in your Parse Push Console. Does it match the expected number of recipients? Your push might be targeted incorrectly. * Open your project's `package.appxmanifest` file and make sure "Toast Capable" is set to "yes."* If your app has been released for a while, it's possible for the recipient estimate on the push composer page to be higher than the pushes sent value on the push results page. The push composer estimate is generated via running your push segment query over your app's installation table. We do not automatically delete installation objects when the users uninstall your app. When we try to send a push, we detect uninstalled installations and do not include them in the pushes sent value on the results page. -* If you're receiving push from Unity iOS, refer to [iOS Push Troubleshooting Guide](/docs/ios/guide#push-notifications-troubleshooting). -* If you're receiving push from Unity Android, refer to [Android Push Troubleshooting Guide](/docs/android/guide#push-notifications-troubleshooting). +* If you're receiving push from Unity iOS, refer to [iOS Push Troubleshooting Guide]({{ site.baseUrl }}/ios/guide#push-notifications-troubleshooting). +* If you're receiving push from Unity Android, refer to [Android Push Troubleshooting Guide]({{ site.baseUrl }}/android/guide#push-notifications-troubleshooting). diff --git a/_includes/dotnet/users.md b/_includes/dotnet/users.md index 43e29bb46..9df9deee0 100644 --- a/_includes/dotnet/users.md +++ b/_includes/dotnet/users.md @@ -307,7 +307,7 @@ When this code is run, the following happens: 4. The awaited `Task` completes and your code continues executing. 5. The current user reference will be updated to this user. -You may optionally provide a list of strings that specifies what [permissions](https://developers.facebook.com/docs/authentication/permissions/) your app requires from the Facebook user. For example: +You may optionally provide a list of strings that specifies what [permissions](https://developers.facebook.com{{ site.baseUrl }}/authentication/permissions/) your app requires from the Facebook user. For example: ```cs // Make your browser control visible @@ -324,7 +324,7 @@ catch // Hide your browser control ``` -`ParseUser` integration doesn't require any permissions to work out of the box (ie. `null` or specifying no permissions is perfectly acceptable). [Read more about permissions on Facebook's developer guide.](https://developers.facebook.com/docs/reference/api/permissions/) +`ParseUser` integration doesn't require any permissions to work out of the box (ie. `null` or specifying no permissions is perfectly acceptable). [Read more about permissions on Facebook's developer guide.](https://developers.facebook.com{{ site.baseUrl }}/reference/api/permissions/) ### Linking diff --git a/_includes/embedded_c/cloud-code.md b/_includes/embedded_c/cloud-code.md index dc3f39760..88da9aee7 100644 --- a/_includes/embedded_c/cloud-code.md +++ b/_includes/embedded_c/cloud-code.md @@ -2,7 +2,7 @@ Cloud Functions allow you to run custom app logic in the Parse Cloud. This is especially useful for running complex app logic in the cloud so that you can reduce the memory footprint of your code on the IoT device. In a Cloud Function, you can query/save Parse data, send push notifications, and log analytics events. -You write your Cloud Code in JavaScript using the Parse JavaScript SDK. We provide a command-line tool to help you deploy your Cloud Code. See our [Cloud Code guide](/docs/ios#cloud-code) for details. +You write your Cloud Code in JavaScript using the Parse JavaScript SDK. We provide a command-line tool to help you deploy your Cloud Code. See our [Cloud Code guide]({{ site.baseUrl }}/ios#cloud-code) for details. For example, you define a Cloud Function as below. diff --git a/_includes/embedded_c/handling-errors.md b/_includes/embedded_c/handling-errors.md index fef60b977..601c24d8c 100644 --- a/_includes/embedded_c/handling-errors.md +++ b/_includes/embedded_c/handling-errors.md @@ -6,6 +6,6 @@ All functions that return a result will return 0 on success and a non-zero value The errors passed through callbacks are again OS-specific errors. The one exception is if there is an HTTP error status (4xx or 5xx) for a request, in which case, the HTTP status will be passed as separate parameters to the request callback. -In the case of an HTTP error status, you should also check the request body. If the request body contains a valid JSON document, the document will contain a Parse error code, as defined by the [REST API documentation](/docs/rest). +In the case of an HTTP error status, you should also check the request body. If the request body contains a valid JSON document, the document will contain a Parse error code, as defined by the [REST API documentation]({{ site.baseUrl }}/rest). For a list of all possible error codes, scroll down to [Error Codes](#errors). diff --git a/_includes/embedded_c/objects.md b/_includes/embedded_c/objects.md index 403bf61f8..ed779b187 100644 --- a/_includes/embedded_c/objects.md +++ b/_includes/embedded_c/objects.md @@ -16,4 +16,4 @@ Each object has a class name that you can use to distinguish different sorts of ## Data Types -So far we've used values with type `double` and `bool`. The Parse REST API also supports strings, arrays, dates, and more. Read more about representing these and other types as JSON in the [REST API Guide](/docs/rest#objects-data-types). +So far we've used values with type `double` and `bool`. The Parse REST API also supports strings, arrays, dates, and more. Read more about representing these and other types as JSON in the [REST API Guide]({{ site.baseUrl }}/rest#objects-data-types). diff --git a/_includes/embedded_c/requests.md b/_includes/embedded_c/requests.md index 8fe141948..b0613dffe 100644 --- a/_includes/embedded_c/requests.md +++ b/_includes/embedded_c/requests.md @@ -18,4 +18,4 @@ void mySaveCallback(ParseClient client, int error, int httpStatus, const char* h parseSendRequest(client, "GET", "/1/classes/TestObject/gsMHOY3MAx", NULL, myCallback); ``` -Using this function, you have full access to the REST API to create objects, delete objects, send analytics events, and more. Take a look at the [REST API Guide](/docs/rest) to find out all the details. +Using this function, you have full access to the REST API to create objects, delete objects, send analytics events, and more. Take a look at the [REST API Guide]({{ site.baseUrl }}/rest) to find out all the details. diff --git a/_includes/embedded_c/users.md b/_includes/embedded_c/users.md index 364954698..61f6688dc 100644 --- a/_includes/embedded_c/users.md +++ b/_includes/embedded_c/users.md @@ -2,7 +2,7 @@ At the core of many apps, there is a notion of user accounts that lets users access their information in a secure manner. In our other SDKs, we provide a specialized user class that automatically handles much of the functionality required for user account management. Users are a special class of Parse Objects and has all the same features, such as flexible schema, automatic persistence, and a key value interface. -You can sign in users via the REST API, but we do not recommend doing so unless your hardware device actually provides user keyboard input. In some cases, you may want to have a companion mobile or desktop app that lets the user sign up, and, that app [creates a restricted session](/docs/ios#sessions) for the device running the embedded SDK. During your hardware device provisioning process, the phone can send this restricted session's token to the device. You can read more about users in our [REST API](/docs/rest#users) or one of our other [SDK guides](/docs). +You can sign in users via the REST API, but we do not recommend doing so unless your hardware device actually provides user keyboard input. In some cases, you may want to have a companion mobile or desktop app that lets the user sign up, and, that app [creates a restricted session]({{ site.baseUrl }}/ios#sessions) for the device running the embedded SDK. During your hardware device provisioning process, the phone can send this restricted session's token to the device. You can read more about users in our [REST API]({{ site.baseUrl }}/rest#users) or one of our other [SDK guides](/docs). Once you have a session token, you can use it to act on the behalf of a particular user. The session token used by the SDK can be set with`parseSetSessionToken`: diff --git a/_includes/ios/analytics.md b/_includes/ios/analytics.md index 9dc898b40..09ac07550 100644 --- a/_includes/ios/analytics.md +++ b/_includes/ios/analytics.md @@ -32,7 +32,7 @@ PFAnalytics.trackAppOpenedWithLaunchOptions(nil) Graphs and breakdowns of your statistics are accessible from your app's Dashboard. -Further analytics are available around push notification delivery and open rates. Be sure to take a look at the [Tracking Pushes and App Opens subsection](/docs/push_guide#receiving-tracking/iOS) of our Push Guide for more detailed information on handling remote notification payloads and push-related callbacks. +Further analytics are available around push notification delivery and open rates. Be sure to take a look at the [Tracking Pushes and App Opens subsection]({{ site.baseUrl }}/push_guide#receiving-tracking/iOS) of our Push Guide for more detailed information on handling remote notification payloads and push-related callbacks. ## Custom Analytics diff --git a/_includes/ios/files.md b/_includes/ios/files.md index 293ce437a..be7bb1b2e 100644 --- a/_includes/ios/files.md +++ b/_includes/ios/files.md @@ -132,6 +132,6 @@ file.saveInBackgroundWithBlock({ })
-You can delete files that are referenced by objects using the [REST API](/docs/rest/guide#files-deleting-files). You will need to provide the master key in order to be allowed to delete a file. +You can delete files that are referenced by objects using the [REST API]({{ site.baseUrl }}/rest/guide#files-deleting-files). You will need to provide the master key in order to be allowed to delete a file. If your files are not referenced by any object in your app, it is not possible to delete them through the REST API. You may request a cleanup of unused files in your app's Settings page. Keep in mind that doing so may break functionality which depended on accessing unreferenced files through their URL property. Files that are currently associated with an object will not be affected. diff --git a/_includes/ios/push-notifications.md b/_includes/ios/push-notifications.md index 16b27d81d..067116a5e 100644 --- a/_includes/ios/push-notifications.md +++ b/_includes/ios/push-notifications.md @@ -2,11 +2,11 @@ Push Notifications are a great way to keep your users engaged and informed about your app. You can reach your entire user base quickly and effectively. This guide will help you through the setup process and the general usage of Parse to send push notifications. -If you haven't installed the SDK yet, please [head over to the Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running. +If you haven't installed the SDK yet, please [head over to the Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running. ## Setting Up Push -If you want to start using push, start by completing the [Push Notifications QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to learn how to configure your app. Come back to this guide afterwards to learn more about the push features offered by Parse. +If you want to start using push, start by completing the [Push Notifications QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to learn how to configure your app. Come back to this guide afterwards to learn more about the push features offered by Parse. ## Installations @@ -72,7 +72,7 @@ The Parse SDK will avoid making unnecessary requests. If a `PFInstallation` is s There are two ways to send push notifications using Parse: [channels](#push-notifications-using-channels) and [advanced targeting](#push-notifications-using-advanced-targeting). Channels offer a simple and easy to use model for sending pushes, while advanced targeting offers a more powerful and flexible model. Both are fully compatible with each other and will be covered in this section. -Sending notifications is often done from the Parse.com push console, the [REST API](/docs/rest/guide#push-notifications-sending-pushes) or from [Cloud Code](/docs/js/guide#push-notifications-sending-pushes). However, push notifications can also be triggered by the existing client SDKs. If you decide to send notifications from the client SDKs, you will need to set **Client Push Enabled** in the Push Notifications settings of your Parse app. +Sending notifications is often done from the Parse.com push console, the [REST API]({{ site.baseUrl }}/rest/guide#push-notifications-sending-pushes) or from [Cloud Code]({{ site.baseUrl }}/js/guide#push-notifications-sending-pushes). However, push notifications can also be triggered by the existing client SDKs. If you decide to send notifications from the client SDKs, you will need to set **Client Push Enabled** in the Push Notifications settings of your Parse app. 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. @@ -515,7 +515,7 @@ if let query = query { ## Scheduling Pushes -Sending scheduled push notifications is not currently supported by the iOS or OS X SDKs. Take a look at the [REST API](/docs/rest/guide/#push-notifications-scheduling-pushes), [JavaScript SDK](/docs/js/guide/#push-notifications-scheduling-pushes) or the Parse.com push console. +Sending scheduled push notifications is not currently supported by the iOS or OS X SDKs. Take a look at the [REST API]({{ site.baseUrl }}/rest/guide/#push-notifications-scheduling-pushes), [JavaScript SDK]({{ site.baseUrl }}/js/guide/#push-notifications-scheduling-pushes) or the Parse.com push console. ## Receiving Pushes @@ -867,7 +867,7 @@ Basically, you will need to run the same push query you're using for your target #### Debugging using the REST API -The REST API is quite easy to use for this sort of purpose as you can easily recreate the push query using the information provided in your push notification logs. If you look closely at the “Full Target” value in your push campaign log item, you may notice that it matches the query format for a REST API query. You can grab an example of what a [REST API query](/docs/rest#queries-constraints) over Installations would look like from the REST API docs. Don't forget to use the `X-Parse-Master-Key` header to ensure that the Master Key is used to run this query. +The REST API is quite easy to use for this sort of purpose as you can easily recreate the push query using the information provided in your push notification logs. If you look closely at the “Full Target” value in your push campaign log item, you may notice that it matches the query format for a REST API query. You can grab an example of what a [REST API query]({{ site.baseUrl }}/rest#queries-constraints) over Installations would look like from the REST API docs. Don't forget to use the `X-Parse-Master-Key` header to ensure that the Master Key is used to run this query.

 # Query over installations
@@ -925,7 +925,7 @@ If your app has been released for a while, it is expected that a percentage of y
 
 ### Handling Push Notifications
 
-If everything looks great so far, but push notifications are not showing up on your phone, there are a few more things you can check. For example, if your app is in the foreground when the push notification is received, an alert will not be displayed by default. You will need to handle the incoming push notification and perform the necessary action as documented in [Responding to the Payload](/docs/ios/guide#push-notifications-responding-to-the-payload).
+If everything looks great so far, but push notifications are not showing up on your phone, there are a few more things you can check. For example, if your app is in the foreground when the push notification is received, an alert will not be displayed by default. You will need to handle the incoming push notification and perform the necessary action as documented in [Responding to the Payload]({{ site.baseUrl }}/ios/guide#push-notifications-responding-to-the-payload).
 
 If your app is not running in the foreground and the push notification is not showing up, make sure that you're specifying an "alert" key in your payload. Otherwise, the push notification will be treated as a silent push notification.
 
diff --git a/_includes/ios/users.md b/_includes/ios/users.md
index a816718dc..b99c1e945 100644
--- a/_includes/ios/users.md
+++ b/_includes/ios/users.md
@@ -63,7 +63,7 @@ This call will asynchronously create a new user in your Parse App. Before it doe
 
 Note that we used the `signUp` method, not the `save` method. New `PFUser`s should always be created using the `signUp` method. Subsequent updates to a user can be done by calling `save`.
 
-The `signUp` method comes in various flavors, with the ability to pass back errors, and also synchronous versions. As usual, we highly recommend using the asynchronous versions when possible, so as not to block the UI in your app. You can read more about these specific methods in our [API docs](/docs/ios/).
+The `signUp` method comes in various flavors, with the ability to pass back errors, and also synchronous versions. As usual, we highly recommend using the asynchronous versions when possible, so as not to block the UI in your app. You can read more about these specific methods in our [API docs]({{ site.baseUrl }}/ios/).
 
 If a signup isn't successful, you should read the error object that is returned. The most likely case is that the username or email has already been taken by another user. You should clearly communicate this to your users, and ask them try a different username.
 
diff --git a/_includes/js/files.md b/_includes/js/files.md
index 05d17ca70..cfa0535e0 100644
--- a/_includes/js/files.md
+++ b/_includes/js/files.md
@@ -83,6 +83,6 @@ Parse.Cloud.httpRequest({ url: profilePhoto.url() }).then(function(response) {
 });
 
-You can delete files that are referenced by objects using the [REST API](/docs/rest#files-deleting-files). You will need to provide the master key in order to be allowed to delete a file. +You can delete files that are referenced by objects using the [REST API]({{ site.baseUrl }}/rest#files-deleting-files). You will need to provide the master key in order to be allowed to delete a file. If your files are not referenced by any object in your app, it is not possible to delete them through the REST API. You may request a cleanup of unused files in your app's Settings page. Keep in mind that doing so may break functionality which depended on accessing unreferenced files through their URL property. Files that are currently associated with an object will not be affected. diff --git a/_includes/js/live-queries.md b/_includes/js/live-queries.md index ffa5cae91..1507c4f00 100644 --- a/_includes/js/live-queries.md +++ b/_includes/js/live-queries.md @@ -1,7 +1,7 @@ # Live Queries ## Standard API -As we discussed in our [LiveQuery protocol](https://github.com/parse-community/parse-server/wiki/Parse-LiveQuery-Protocol-Specification), we maintain a WebSocket connection to communicate with the Parse LiveQuery server. When used server side we use the [`ws`](https://www.npmjs.com/package/ws) package and in the browser we use [`window.WebSocket`](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API). We think in most cases it isn't necessary to deal with the WebSocket connection directly. Thus, we developed a simple API to let you focus on your own business logic. +As we discussed in our [LiveQuery protocol](https://github.com/parse-community/parse-server/wiki/Parse-LiveQuery-Protocol-Specification), we maintain a WebSocket connection to communicate with the Parse LiveQuery server. When used server side we use the [`ws`](https://www.npmjs.com/package/ws) package and in the browser we use [`window.WebSocket`](https://developer.mozilla.org/en-US{{ site.baseUrl }}/Web/API/WebSockets_API). We think in most cases it isn't necessary to deal with the WebSocket connection directly. Thus, we developed a simple API to let you focus on your own business logic. Note: Live Queries is supported only in [Parse Server](https://github.com/parse-community/parse-server) with [JS SDK ~1.8](https://github.com/parse-community/Parse-SDK-JS). diff --git a/_includes/js/push-notifications.md b/_includes/js/push-notifications.md index 9f999ba62..d375f1332 100644 --- a/_includes/js/push-notifications.md +++ b/_includes/js/push-notifications.md @@ -1,6 +1,6 @@ # Push Notifications -If you haven't installed the SDK yet, please [head over to the Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running. +If you haven't installed the SDK yet, please [head over to the Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running. ## Introduction @@ -12,7 +12,7 @@ The JavaScript SDK does not currently support receiving pushes. It can only be u ## Setting Up Push -There is no setup required to use the JavaScript SDK for sending push notifications. If you haven't configured your [iOS](/docs/ios/guide#push-notifications-setting-up-push) or [Android](/docs/android/guide#push-notifications-setting-up-push) clients to use Push, take a look at their respective setup instruction using the platform toggle at the top. +There is no setup required to use the JavaScript SDK for sending push notifications. If you haven't configured your [iOS]({{ site.baseUrl }}/ios/guide#push-notifications-setting-up-push) or [Android]({{ site.baseUrl }}/android/guide#push-notifications-setting-up-push) clients to use Push, take a look at their respective setup instruction using the platform toggle at the top. ## Installations @@ -55,7 +55,7 @@ The simplest way to start sending notifications is using channels. This allows y #### Subscribing to Channels -The JavaScript SDK does not currently support subscribing iOS and Android devices for pushes. Take a look at the [iOS](/docs/ios/guide#push-notifications-using-channels), [Android](/docs/android/guide#push-notifications-using-channels) or [REST](/docs/rest/guide#push-notifications-using-channels) Push guide using the platform toggle at the top. +The JavaScript SDK does not currently support subscribing iOS and Android devices for pushes. Take a look at the [iOS]({{ site.baseUrl }}/ios/guide#push-notifications-using-channels), [Android]({{ site.baseUrl }}/android/guide#push-notifications-using-channels) or [REST]({{ site.baseUrl }}/rest/guide#push-notifications-using-channels) Push guide using the platform toggle at the top. #### Sending Pushes to Channels @@ -86,7 +86,7 @@ Since `Installation` objects are just like any other object stored in Parse, you #### Saving Installation Data -The JavaScript SDK does not currently support modifying `Installation` objects. Take a look at the [iOS](/docs/ios/guide#push-notifications-installations), [Android](/docs/android/guide#push-notifications-installations) or [REST](/docs/rest/guide#push-notifications-installations) Push guide for more on this topic. +The JavaScript SDK does not currently support modifying `Installation` objects. Take a look at the [iOS]({{ site.baseUrl }}/ios/guide#push-notifications-installations), [Android]({{ site.baseUrl }}/android/guide#push-notifications-installations) or [REST]({{ site.baseUrl }}/rest/guide#push-notifications-installations) Push guide for more on this topic. #### Sending Pushes to Queries @@ -197,7 +197,7 @@ Parse.Push.send({ }); -It is also possible to specify your own data in this dictionary. As explained in the Receiving Notifications section for [iOS](/docs/ios/guide#push-notifications-scheduling-pushes) and [Android](/docs/android/guide#push-notifications-scheduling-pushes), iOS will give you access to this data only when the user opens your app via the notification and Android will provide you this data in the `Intent` if one is specified. +It is also possible to specify your own data in this dictionary. As explained in the Receiving Notifications section for [iOS]({{ site.baseUrl }}/ios/guide#push-notifications-scheduling-pushes) and [Android]({{ site.baseUrl }}/android/guide#push-notifications-scheduling-pushes), iOS will give you access to this data only when the user opens your app via the notification and Android will provide you this data in the `Intent` if one is specified.

 var query = new Parse.Query(Parse.Installation);
@@ -353,8 +353,8 @@ The scheduled time cannot be in the past, and can be up to two weeks in the futu
 
 ## Receiving Pushes
 
-The JavaScript SDK does not currently support receiving pushes. To learn more about handling received notifications in [iOS](/docs/ios/guide#push-notifications-scheduling-pushes) or [Android](/docs/android/guide#push-notifications-scheduling-pushes), use the platform toggle at the top.
+The JavaScript SDK does not currently support receiving pushes. To learn more about handling received notifications in [iOS]({{ site.baseUrl }}/ios/guide#push-notifications-scheduling-pushes) or [Android]({{ site.baseUrl }}/android/guide#push-notifications-scheduling-pushes), use the platform toggle at the top.
 
 ## Troubleshooting
 
-For tips on troubleshooting push notifications, check the troubleshooting sections for [iOS](/docs/ios/guide#push-notifications-troubleshooting), [Android](/docs/android/guide#push-notifications-troubleshooting), and [.NET](/docs/dotnet/guide#push-notifications-troubleshooting) using the platform toggle at the top.
+For tips on troubleshooting push notifications, check the troubleshooting sections for [iOS]({{ site.baseUrl }}/ios/guide#push-notifications-troubleshooting), [Android]({{ site.baseUrl }}/android/guide#push-notifications-troubleshooting), and [.NET]({{ site.baseUrl }}/dotnet/guide#push-notifications-troubleshooting) using the platform toggle at the top.
diff --git a/_includes/js/users.md b/_includes/js/users.md
index 9175c6ec8..5d93be749 100644
--- a/_includes/js/users.md
+++ b/_includes/js/users.md
@@ -307,7 +307,7 @@ To start using Facebook with Parse, you need to:
 
 The function assigned to `fbAsyncInit` is run as soon as the Facebook JavaScript SDK has completed loading. Any code that you want to run after the Facebook JavaScript SDK is loaded should be placed within this function and after the call to `Parse.FacebookUtils.init()`.
 
-If you encounter any issues that are Facebook-related, a good resource is the [official getting started guide from Facebook](https://developers.facebook.com/docs/reference/javascript/).
+If you encounter any issues that are Facebook-related, a good resource is the [official getting started guide from Facebook](https://developers.facebook.com{{ site.baseUrl }}/reference/javascript/).
 
 If you encounter issues that look like they're being returned from Parse's servers, try removing your Facebook application's App Secret from your app's settings page.
 
@@ -339,7 +339,7 @@ When this code is run, the following happens:
 3.  Our SDK receives the Facebook data and saves it to a `Parse.User`. If it's a new user based on the Facebook ID, then that user is created.
 4.  Your `success` callback is called with the user.
 
-You may optionally provide a comma-delimited string that specifies what [permissions](https://developers.facebook.com/docs/authentication/permissions/) your app requires from the Facebook user.  For example:
+You may optionally provide a comma-delimited string that specifies what [permissions](https://developers.facebook.com{{ site.baseUrl }}/authentication/permissions/) your app requires from the Facebook user.  For example:
 
 

 Parse.FacebookUtils.logIn("user_likes,email", {
@@ -352,7 +352,7 @@ Parse.FacebookUtils.logIn("user_likes,email", {
 });
 
-`Parse.User` integration doesn't require any permissions to work out of the box (ie. `null` or specifying no permissions is perfectly acceptable). [Read more about permissions on Facebook's developer guide.](https://developers.facebook.com/docs/reference/api/permissions/) +`Parse.User` integration doesn't require any permissions to work out of the box (ie. `null` or specifying no permissions is perfectly acceptable). [Read more about permissions on Facebook's developer guide.](https://developers.facebook.com{{ site.baseUrl }}/reference/api/permissions/)
It is up to you to record any data that you need from the Facebook user after they authenticate. To accomplish this, you'll need to do a graph query using the Facebook SDK. @@ -390,7 +390,7 @@ Parse.FacebookUtils.unlink(user, { ### Facebook SDK and Parse -The Facebook Javascript SDK provides a main `FB` object that is the starting point for many of the interactions with Facebook's API. [You can read more about their SDK here](https://developers.facebook.com/docs/reference/javascript/). +The Facebook Javascript SDK provides a main `FB` object that is the starting point for many of the interactions with Facebook's API. [You can read more about their SDK here](https://developers.facebook.com{{ site.baseUrl }}/reference/javascript/). Facebook login using the Parse SDK requires that the Facebook SDK already be loaded before calling `Parse.FacebookUtils.init()`. diff --git a/_includes/parse-server/class-level-permissions.md b/_includes/parse-server/class-level-permissions.md index a1ad7ab11..1dc79ba99 100644 --- a/_includes/parse-server/class-level-permissions.md +++ b/_includes/parse-server/class-level-permissions.md @@ -1,6 +1,6 @@ # Class Level Permissions -Class level permissions are a security feature from that allows one to restrict access on a broader way than the [ACL based permissions](/docs/rest/guide/#security). +Class level permissions are a security feature from that allows one to restrict access on a broader way than the [ACL based permissions]({{ site.baseUrl }}/rest/guide/#security). ## `requireAuthentication` diff --git a/_includes/parse-server/compatibility.md b/_includes/parse-server/compatibility.md index e596643aa..fcbd3ba4a 100644 --- a/_includes/parse-server/compatibility.md +++ b/_includes/parse-server/compatibility.md @@ -166,7 +166,7 @@ Hosted Parse applications could disable a security setting in order to allow cli Parse supports sending pushes to Android devices via Google Cloud Messaging (GCM). By default, the GCM registration IDs (stored in the `deviceToken` field) for your app are associated with Parse's GCM sender ID, which won't work after Parse is retired. You may want to take these actions to have your app register with a different GCM sender ID, which will make the registration IDs in the `deviceToken` field exportable to other push providers: * Enable GCM for your Android project in the [Google Developer Console](https://console.developers.google.com). Take note of your project number (it should be a large integer like `123427208255`). This is also known as your GCM sender ID. -* Add the `com.parse.push.gcm_sender_id` metadata attribute to your app manifest so that Parse registers for push with your GCM sender ID. For instance, if your GCM sender ID is `123427208255`, then you should add a metadata attribute named `com.parse.push.gcm_sender_id` with the value `id:123427208255` (note that the "id:" prefix is required). This attribute requires Android SDK 1.8.0 or higher. See our [Android push guide](/docs/android/guide#push-notifications-setting-up-push) for more details on this attribute. +* Add the `com.parse.push.gcm_sender_id` metadata attribute to your app manifest so that Parse registers for push with your GCM sender ID. For instance, if your GCM sender ID is `123427208255`, then you should add a metadata attribute named `com.parse.push.gcm_sender_id` with the value `id:123427208255` (note that the "id:" prefix is required). This attribute requires Android SDK 1.8.0 or higher. See our [Android push guide]({{ site.baseUrl }}/android/guide#push-notifications-setting-up-push) for more details on this attribute. * Parse will now register for GCM with both its GCM sender ID and your GCM sender ID on app startup. You can use the resulting GCM registration IDs (stored in the `deviceToken` field of ParseInstallation) with other GCM push providers. ### Parse IoT Devices diff --git a/_includes/parse-server/file-adapters.md b/_includes/parse-server/file-adapters.md index bf86e11b2..d68cc9498 100644 --- a/_includes/parse-server/file-adapters.md +++ b/_includes/parse-server/file-adapters.md @@ -112,7 +112,7 @@ new S3Adapter(accessKey, secretKey, bucket, options) ## Configuring `GCSAdapter` -Unlike the S3 adapter, you must create a new Cloud Storage bucket, as this is not created automatically. See the Google Cloud guide on [Authentication](https://googlecloudplatform.github.io/gcloud-node/#/docs/master/guides/authentication) for more details. +Unlike the S3 adapter, you must create a new Cloud Storage bucket, as this is not created automatically. See the Google Cloud guide on [Authentication](https://googlecloudplatform.github.io/gcloud-node/#{{ site.baseUrl }}/master/guides/authentication) for more details. ### Installation diff --git a/_includes/parse-server/getting-started.md b/_includes/parse-server/getting-started.md index 24f901cbb..0e4ecb8c2 100644 --- a/_includes/parse-server/getting-started.md +++ b/_includes/parse-server/getting-started.md @@ -33,7 +33,7 @@ That's it! You are now running a standalone version of Parse Server on your mach ## Saving your first object -Now that you're running Parse Server, it is time to save your first object. We'll use the [REST API](/docs/rest/guide), but you can easily do the same using any of the [Parse SDKs](/docs). Run the following: +Now that you're running Parse Server, it is time to save your first object. We'll use the [REST API]({{ site.baseUrl }}/rest/guide), but you can easily do the same using any of the [Parse SDKs](/docs). Run the following: ```bash curl -X POST \ diff --git a/_includes/parse-server/live-query.md b/_includes/parse-server/live-query.md index 1d321cbbf..9b2233e0d 100644 --- a/_includes/parse-server/live-query.md +++ b/_includes/parse-server/live-query.md @@ -78,9 +78,9 @@ We support five types of event: You can check the [LiveQuery protocol specification](https://github.com/parse-community/parse-server/wiki/Parse-LiveQuery-Protocol-Specification) to learn more about each event type. -For more details about the JavaScript LiveQuery Client SDK, check out the [open source code](https://github.com/parse-community/Parse-SDK-JS) and the [Live Query section in the JavaScript Guide](/docs/js/guide#live-queries). +For more details about the JavaScript LiveQuery Client SDK, check out the [open source code](https://github.com/parse-community/Parse-SDK-JS) and the [Live Query section in the JavaScript Guide]({{ site.baseUrl }}/js/guide#live-queries). -For the iOS LiveQuery Client SDK, check out the [open source code](https://github.com/parse-community/Parse-SDK-iOS-OSX) and the [Live Query section in the iOS Guide](/docs/ios/guide#live-queries). +For the iOS LiveQuery Client SDK, check out the [open source code](https://github.com/parse-community/Parse-SDK-iOS-OSX) and the [Live Query section in the iOS Guide]({{ site.baseUrl }}/ios/guide#live-queries). ## LiveQuery Protocol diff --git a/_includes/parse-server/push-notifications-clients.md b/_includes/parse-server/push-notifications-clients.md index 0d791e6f3..cb5502f06 100644 --- a/_includes/parse-server/push-notifications-clients.md +++ b/_includes/parse-server/push-notifications-clients.md @@ -157,7 +157,7 @@ IMPORTANT: Change "YOUR_SENDER_ID" to your GCM Sender Id. Change the `android:name` attribute of `` element above to match your application's package name. -Change "YOUR_SENDER_ID" to the GCM Sender Id you obtained back in Step 1. See our [Android push guide](/docs/android/guide#push-notifications-setting-up-push) for more details on this attribute. +Change "YOUR_SENDER_ID" to the GCM Sender Id you obtained back in Step 1. See our [Android push guide]({{ site.baseUrl }}/android/guide#push-notifications-setting-up-push) for more details on this attribute. **Migrating a hosted Parse app?** Note that you cannot send GCM pushes to old versions of your app that do not contain the `com.parse.push.gcm_sender_id` attribute in your app manifest, since those versions of the app haven't registered for push using your GCM sender ID. diff --git a/_includes/parse-server/push-notifications.md b/_includes/parse-server/push-notifications.md index 55e3236bf..8407d3f1d 100644 --- a/_includes/parse-server/push-notifications.md +++ b/_includes/parse-server/push-notifications.md @@ -16,7 +16,7 @@ However, there are a few caveats: * Scheduled push is not supported ## API -We support most of the sending options similar to the hosted Parse.com service. Check the detailed doc [here](/docs/rest/guide#push-notifications-sending-options). Parse Server supports the following: +We support most of the sending options similar to the hosted Parse.com service. Check the detailed doc [here]({{ site.baseUrl }}/rest/guide#push-notifications-sending-options). Parse Server supports the following: * `channels` to target installations by channels * `where` to target installations by `ParseQuery` diff --git a/_includes/php/push-notifications.md b/_includes/php/push-notifications.md index 0bceef6af..d18442a78 100644 --- a/_includes/php/push-notifications.md +++ b/_includes/php/push-notifications.md @@ -56,7 +56,7 @@ ParsePush::send(array( ### Using Advanced Targeting -While channels are great for many applications, sometimes you need more precision when targeting the recipients of your pushes. Parse allows you to write a query for any subset of your `Installation` objects using the [querying API](/docs/php_guide#queries) and to send them a push. +While channels are great for many applications, sometimes you need more precision when targeting the recipients of your pushes. Parse allows you to write a query for any subset of your `Installation` objects using the [querying API]({{ site.baseUrl }}/php_guide#queries) and to send them a push. Since `Installation` objects are just like any other object stored in Parse, you can save any data you want and even create relationships between `Installation` objects and your other objects. This allows you to send pushes to a very customized and dynamic segment of your user base. @@ -66,7 +66,7 @@ The PHP SDK does not currently support modifying `Installation` objects. Take a #### Sending Pushes to Queries -Once you have your data stored on your `Installation` objects, you can use a query to target a subset of these devices. `Parse.Installation` queries work just like any other [Parse query](/docs/php_guide#queries). +Once you have your data stored on your `Installation` objects, you can use a query to target a subset of these devices. `Parse.Installation` queries work just like any other [Parse query]({{ site.baseUrl }}/php_guide#queries).

 $query = ParseInstallation::query();
diff --git a/_includes/rest/cloud-code.md b/_includes/rest/cloud-code.md
index 86799bdf7..4cc9a5057 100644
--- a/_includes/rest/cloud-code.md
+++ b/_includes/rest/cloud-code.md
@@ -31,7 +31,7 @@ print result
 Similarly, you can trigger a background job from the REST API. For example, to trigger the job named `userMigration`:
 
 
- Take a look at the Cloud Code Guide to learn more about Cloud Functions and Background Jobs. + Take a look at the Cloud Code Guide to learn more about Cloud Functions and Background Jobs.

diff --git a/_includes/rest/hooks.md b/_includes/rest/hooks.md
index 7c4237703..08c80150e 100644
--- a/_includes/rest/hooks.md
+++ b/_includes/rest/hooks.md
@@ -9,11 +9,11 @@ There are two kinds of cloud code webhooks: function webhooks and trigger webhoo
 
 Cloud functions are functions that run in the cloud and allow you to build functions
 common to all platforms.
-For more details please read [cloud code functions](/docs/cloudcode/guide/#cloud-code-cloud-functions).
+For more details please read [cloud code functions]({{ site.baseUrl }}/cloudcode/guide/#cloud-code-cloud-functions).
 
 Cloud triggers are invoked whenever you save or delete a parse object.
 Triggers are commonly used to validate your objects before saving them.
-For more details please read [cloud code triggers](/docs/cloudcode/guide/#beforesave-triggers).
+For more details please read [cloud code triggers]({{ site.baseUrl }}/cloudcode/guide/#beforesave-triggers).
 
 Lets establish some basic terminology used throughout the rest of this section.
 
diff --git a/_includes/rest/push-notifications.md b/_includes/rest/push-notifications.md
index 386e46a14..f19dffe8f 100644
--- a/_includes/rest/push-notifications.md
+++ b/_includes/rest/push-notifications.md
@@ -2,7 +2,7 @@
 
 Push Notifications are a great way to keep your users engaged and informed about your app. You can reach your entire user base quickly and effectively. This guide will help you through the setup process and the general usage of Parse to send push notifications.
 
-If you haven't installed the SDK yet, please [head over to the Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running.
+If you haven't installed the SDK yet, please [head over to the Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running.
 
 ## Installations
 
@@ -645,7 +645,7 @@ result = json.loads(connection.getresponse().read())
 print result
 
-It is also possible to specify your own data in this dictionary. As explained in the Receiving Notifications section for [iOS](/docs/ios/guide#push-notifications-receiving-pushes) and [Android](/docs/android/guide#push-notifications-receiving-pushes), iOS will give you access to this data only when the user opens your app via the notification and Android will provide you this data in the `Intent` if one is specified. +It is also possible to specify your own data in this dictionary. As explained in the Receiving Notifications section for [iOS]({{ site.baseUrl }}/ios/guide#push-notifications-receiving-pushes) and [Android]({{ site.baseUrl }}/android/guide#push-notifications-receiving-pushes), iOS will give you access to this data only when the user opens your app via the notification and Android will provide you this data in the `Intent` if one is specified.

 
diff --git a/_includes/unity/files.md b/_includes/unity/files.md index 01d9b53ba..e78ff70ea 100644 --- a/_includes/unity/files.md +++ b/_includes/unity/files.md @@ -53,6 +53,6 @@ Task saveTask = file.SaveAsync(new Progress(e => { })); ``` -You can delete files that are referenced by objects using the [REST API](/docs/rest#files-deleting). You will need to provide the master key in order to be allowed to delete a file. +You can delete files that are referenced by objects using the [REST API]({{ site.baseUrl }}/rest#files-deleting). You will need to provide the master key in order to be allowed to delete a file. If your files are not referenced by any object in your app, it is not possible to delete them through the REST API. You may request a cleanup of unused files in your app's Settings page. Keep in mind that doing so may break functionality which depended on accessing unreferenced files through their URL property. Files that are currently associated with an object will not be affected. diff --git a/_includes/unity/push-notifications.md b/_includes/unity/push-notifications.md index 61b02d53d..24fc58f2f 100644 --- a/_includes/unity/push-notifications.md +++ b/_includes/unity/push-notifications.md @@ -2,7 +2,7 @@ Push Notifications are a great way to keep your users engaged and informed about your app. You can reach your entire user base quickly and effectively. This guide will help you through the setup process and the general usage of Parse to send push notifications. -If you haven't installed the SDK yet, please [head over to the Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running. +If you haven't installed the SDK yet, please [head over to the Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to get our SDK up and running.
The Unity SDK can send push notifications from all runtimes, but only iOS and Android apps can receive pushes from APNS and GCM push servers. @@ -11,8 +11,8 @@ The Unity SDK can send push notifications from all runtimes, but only iOS and An ## Setting Up Push Currently, only two platforms are supported to receive push from Parse, Unity iOS and Unity Android. -* If you want to start using push on Unity iOS, start by completing the [iOS Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to learn how to configure your push certificate. -* If you want to start using push on Unity Android, start by completing [Android Push QuickStart](/docs/parse-server/guide/#push-notifications-quick-start) to learn how to configure your app. +* If you want to start using push on Unity iOS, start by completing the [iOS Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to learn how to configure your push certificate. +* If you want to start using push on Unity Android, start by completing [Android Push QuickStart]({{ site.baseUrl }}/parse-server/guide/#push-notifications-quick-start) to learn how to configure your app. Come back to this guide afterwards to learn more about the push features offered by Parse. @@ -20,7 +20,7 @@ Come back to this guide afterwards to learn more about the push features offered Every Parse application installed on a device registered for push notifications has an associated `Installation` object. The `Installation` object is where you store all the data needed to target push notifications. For example, in a baseball app, you could store the teams a user is interested in to send updates about their performance. Saving the `Installation` object is also required for tracking push-related app open events. -On Unity, `Installation` objects are available through the `ParseInstallation` class, a subclass of `ParseObject`. It uses the [same API](/docs/windows/guide#objects) for storing and retrieving data. To access the current `Installation` object from your .NET app, use the `ParseInstallation.CurrentInstallation` property. +On Unity, `Installation` objects are available through the `ParseInstallation` class, a subclass of `ParseObject`. It uses the [same API]({{ site.baseUrl }}/windows/guide#objects) for storing and retrieving data. To access the current `Installation` object from your .NET app, use the `ParseInstallation.CurrentInstallation` property. While it is possible to modify a `ParseInstallation` just like you would a `ParseObject`, there are several special fields that help manage and target devices. @@ -124,13 +124,13 @@ If you want to target multiple channels with a single push notification, you can ### Using Advanced Targeting -While channels are great for many applications, sometimes you need more precision when targeting the recipients of your pushes. Parse allows you to write a query for any subset of your `Installation` objects using the [querying API](/docs/unity/guide#queries) and to send them a push. +While channels are great for many applications, sometimes you need more precision when targeting the recipients of your pushes. Parse allows you to write a query for any subset of your `Installation` objects using the [querying API]({{ site.baseUrl }}/unity/guide#queries) and to send them a push. Since `ParseInstallation` is a subclass of `ParseObject`, you can save any data you want and even create relationships between `Installation` objects and your other objects. This allows you to send pushes to a very customized and dynamic segment of your user base. #### Saving Installation Data -Storing data on an `Installation` object is just as easy as storing [any other data](/docs/unity/guide#objects) on Parse. In our Baseball app, we could allow users to get pushes about game results, scores and injury reports. +Storing data on an `Installation` object is just as easy as storing [any other data]({{ site.baseUrl }}/unity/guide#objects) on Parse. In our Baseball app, we could allow users to get pushes about game results, scores and injury reports. ```cs // Store the category of push notifications the user would like to receive. @@ -152,7 +152,7 @@ installation.SaveAsync(); #### Sending Pushes to Queries -Once you have your data stored on your `Installation` objects, you can use a `ParseQuery` to target a subset of these devices. `Installation` queries work just like any other [Parse query](/docs/unity/guide#queries), but we use the special static property `ParseInstallation.Query` to create it. We set this query on our `ParsePush` object, before sending the notification. +Once you have your data stored on your `Installation` objects, you can use a `ParseQuery` to target a subset of these devices. `Installation` queries work just like any other [Parse query]({{ site.baseUrl }}/unity/guide#queries), but we use the special static property `ParseInstallation.Query` to create it. We set this query on our `ParsePush` object, before sending the notification. ```cs var push = new ParsePush(); @@ -382,5 +382,5 @@ Our web push console guides you through every step of setting up a Localized Pus Setting up Push Notifications is often a source of frustration for developers. The process is complicated and invites problems to happen along the way. If you run into issues, try some of these troubleshooting tips. -* If you're receiving push from Unity iOS, refer to [iOS Push Troubleshooting Guide](/docs/ios/guide#push-notifications-troubleshooting). -* If you're receiving push from Unity Android, refer to [Android Push Troubleshooting Guide](/docs/android/guide#push-notifications-troubleshooting). +* If you're receiving push from Unity iOS, refer to [iOS Push Troubleshooting Guide]({{ site.baseUrl }}/ios/guide#push-notifications-troubleshooting). +* If you're receiving push from Unity Android, refer to [Android Push Troubleshooting Guide]({{ site.baseUrl }}/android/guide#push-notifications-troubleshooting). diff --git a/_site/android/guide/index.html b/_site/android/guide/index.html index 52b0d2ce2..296b9f3b6 100644 --- a/_site/android/guide/index.html +++ b/_site/android/guide/index.html @@ -1291,7 +1291,7 @@

Signing Up

Note that we used the signUpInBackground method, not the saveInBackground method. New ParseUsers should always be created using the signUpInBackground (or signUp) method. Subsequent updates to a user can be done by calling save.

-

The signUpInBackground method comes in various flavors, with the ability to pass back errors, and also synchronous versions. As usual, we highly recommend using the asynchronous versions when possible, so as not to block the UI in your app. You can read more about these specific methods in our API docs.

+

The signUpInBackground method comes in various flavors, with the ability to pass back errors, and also synchronous versions. As usual, we highly recommend using the asynchronous versions when possible, so as not to block the UI in your app. You can read more about these specific methods in our API docs.

If a signup isn’t successful, you should read the error object that is returned. The most likely case is that the username or email has already been taken by another user. You should clearly communicate this to your users, and ask them try a different username.

@@ -2305,7 +2305,7 @@

Progress

-

You can delete files that are referenced by objects using the REST API. You will need to provide the master key in order to be allowed to delete a file.

+

You can delete files that are referenced by objects using the REST API. You will need to provide the master key in order to be allowed to delete a file.

If your files are not referenced by any object in your app, it is not possible to delete them through the REST API. You may request a cleanup of unused files in your app’s Settings page. Keep in mind that doing so may break functionality which depended on accessing unreferenced files through their URL property. Files that are currently associated with an object will not be affected.

@@ -2573,11 +2573,11 @@

Push Notifications

Push notifications are a great way to keep your users engaged and informed about your app. You can reach your entire user base quickly and effectively. This guide will help you through the setup process and the general usage of Parse to send push notifications.

-

If you haven’t installed the SDK yet, head over to the Push QuickStart to get our SDK up and running.

+

If you haven’t installed the SDK yet, head over to the Push QuickStart to get our SDK up and running.

Setting Up Push

-

If you want to start using push, start by completing the Android Push Notifications QuickStart Guide to learn how to configure your app and send your first push notification. Come back to this guide afterwards to learn more about the push features offered by Parse.

+

If you want to start using push, start by completing the Android Push Notifications QuickStart Guide to learn how to configure your app and send your first push notification. Come back to this guide afterwards to learn more about the push features offered by Parse.

The Parse library provides push notifications using Google Cloud Messaging (GCM) if Google Play Services are available. Learn more about Google Play Services here.

@@ -2641,7 +2641,7 @@

Sending Pushes

There are two ways to send push notifications using Parse: channels and advanced targeting. Channels offer a simple and easy to use model for sending pushes, while advanced targeting offers a more powerful and flexible model. Both are fully compatible with each other and will be covered in this section.

-

Sending notifications is often done from the Parse.com push console, the REST API or from Cloud Code. However, push notifications can also be triggered by the existing client SDKs. If you decide to send notifications from the client SDKs, you will need to set Client Push Enabled in the Push Notifications settings of your Parse app.

+

Sending notifications is often done from the Parse.com push console, the REST API or from Cloud Code. However, push notifications can also be triggered by the existing client SDKs. If you decide to send notifications from the client SDKs, you will need to set Client Push Enabled in the Push Notifications settings of your Parse app.

However, be sure you understand that enabling Client Push can lead to a security vulnerability in your app, as outlined on our blog. 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.

@@ -2896,11 +2896,11 @@

Targeting by Platform

Scheduling Pushes

-

Sending scheduled push notifications is not currently supported by the Android SDK. Take a look at the REST API, JavaScript SDK or the push console on your Parse Dashboard.

+

Sending scheduled push notifications is not currently supported by the Android SDK. Take a look at the REST API, JavaScript SDK or the push console on your Parse Dashboard.

Receiving Pushes

-

Make sure you’ve gone through the Android Push QuickStart to set up your app to receive pushes.

+

Make sure you’ve gone through the Android Push QuickStart to set up your app to receive pushes.

When a push notification is received, the “title” is displayed in the status bar and the “alert” is displayed alongside the “title” when the user expands the notification drawer. If you choose to subclass com.parse.ParsePushBroadcastReceiver, be sure to replace that name with your class’ name in the registration.

@@ -3053,7 +3053,7 @@

Verify your Targeting

Debugging using the REST API

-

The REST API is quite easy to use for this sort of purpose as you can easily recreate the push query using the information provided in your push notification logs. If you look closely at the “Full Target” value in your push campaign log item, you may notice that it matches the query format for a REST API query. You can grab an example of what a REST API query over ParseInstallations would look like from the REST API docs. Don’t forget to use the X-Parse-Master-Key header to ensure that the Master Key is used to run this query.

+

The REST API is quite easy to use for this sort of purpose as you can easily recreate the push query using the information provided in your push notification logs. If you look closely at the “Full Target” value in your push campaign log item, you may notice that it matches the query format for a REST API query. You can grab an example of what a REST API query over ParseInstallations would look like from the REST API docs. Don’t forget to use the X-Parse-Master-Key header to ensure that the Master Key is used to run this query.

# Query over installations
 curl -X GET \
@@ -3090,9 +3090,9 @@ 

Check your Device Configuration

If everything looks great so far, but push notifications are not showing up on your phone, there are a few more things you can check.

    -
  • Upgrade to the latest SDK. This documentation covers the push API introduced in the 1.7.0 version of the Android Parse SDK. Please upgrade if you are getting compiler errors following these instructions.
  • +
  • Upgrade to the latest SDK. This documentation covers the push API introduced in the 1.7.0 version of the Android Parse SDK. Please upgrade if you are getting compiler errors following these instructions.
  • Make sure you are using the correct packageName in your AndroidManifest.xml.
  • -
  • Make sure you have the correct permissions listed in your AndroidManifest.xml file, as outlined in the Android Push Quickstart. If you are using a a custom receiver, be sure you have registered it in the Manifest file with the correct android:name property and the proper intent filters.
  • +
  • Make sure you have the correct permissions listed in your AndroidManifest.xml file, as outlined in the Android Push Quickstart. If you are using a a custom receiver, be sure you have registered it in the Manifest file with the correct android:name property and the proper intent filters.
  • Make sure you’ve used the correct App ID and client key, and that Parse.initialize() is being called. Parse.initialize() lets the service know which application it is listening for; this code must be in your Application.onCreate rather than Activity.onCreate for a particular Activity, so that any activation technique will know how to use Parse.
  • Check that the push registration call is being called successfully. Your device must successfully register a ParseInstallation object with a valid GCM Registration id in the “deviceToken” field, if using GCM.
  • Check that the device is set to accept push notifications from your app.
  • @@ -3225,7 +3225,7 @@

    App-Open & Push Analytics

    Graphs and breakdowns of your statistics are accessible from your app’s Dashboard.

    -

    Further analytics are available around push notification delivery and open rates. Take a look at the Tracking Pushes and App Opens subsection of our Push Guide for more detailed information on handling notification payloads and push-related callbacks.

    +

    Further analytics are available around push notification delivery and open rates. Take a look at the Tracking Pushes and App Opens subsection of our Push Guide for more detailed information on handling notification payloads and push-related callbacks.

    Custom Analytics

    @@ -5232,7 +5232,7 @@

    Access Control Lists

    The easiest way to control who can access which data is through access control lists, commonly known as ACLs. The idea behind an ACL is that each object has a list of users and roles along with what permissions that user or role has. A user needs read permissions (or must belong to a role that has read permissions) in order to retrieve an object’s data, and a user needs write permissions (or must belong to a role that has write permissions) in order to update or delete that object.

    -

    Once you have a User, you can start using ACLs. Remember: Users can be created through traditional username/password signup, through a third-party login system like Facebook or Twitter, or even by using Parse’s automatic anonymous users functionality. To set an ACL on the current user’s data to not be publicly readable, all you have to do is:

    +

    Once you have a User, you can start using ACLs. Remember: Users can be created through traditional username/password signup, through a third-party login system like Facebook or Twitter, or even by using Parse’s automatic anonymous users functionality. To set an ACL on the current user’s data to not be publicly readable, all you have to do is:

    
     PFUser *user = [PFUser currentUser];
    @@ -5635,19 +5635,19 @@ 

    Security Edge Cases

    Get requests on installations follow ACLs normally. Find requests without master key is not allowed unless you supply the installationId as a constraint.

  • -

    Update requests on installations do adhere to the ACL defined on the installation, but Delete requests are master-key-only. For more information about how installations work, check out the installations section of the REST guide.

    +

    Update requests on installations do adhere to the ACL defined on the installation, but Delete requests are master-key-only. For more information about how installations work, check out the installations section of the REST guide.

  • Data Integrity in Cloud Code

    -

    For most apps, care around keys, class-level permissions, and object-level ACLs are all you need to keep your app and your users’ data safe. Sometimes, though, you’ll run into an edge case where they aren’t quite enough. For everything else, there’s Cloud Code.

    +

    For most apps, care around keys, class-level permissions, and object-level ACLs are all you need to keep your app and your users’ data safe. Sometimes, though, you’ll run into an edge case where they aren’t quite enough. For everything else, there’s Cloud Code.

    Cloud Code allows you to upload JavaScript to Parse’s servers, where we will run it for you. Unlike client code running on users’ devices that may have been tampered with, Cloud Code is guaranteed to be the code that you’ve written, so it can be trusted with more responsibility.

    One particularly common use case for Cloud Code is preventing invalid data from being stored. For this sort of situation, it’s particularly important that a malicious client not be able to bypass the validation logic.

    -

    To create validation functions, Cloud Code allows you to implement a beforeSave trigger for your class. These triggers are run whenever an object is saved, and allow you to modify the object or completely reject a save. For example, this is how you create a Cloud Code beforeSave trigger to make sure every user has an email address set:

    +

    To create validation functions, Cloud Code allows you to implement a beforeSave trigger for your class. These triggers are run whenever an object is saved, and allow you to modify the object or completely reject a save. For example, this is how you create a Cloud Code beforeSave trigger to make sure every user has an email address set:

    Parse.Cloud.beforeSave(Parse.User, function(request, response) {
       var user = request.object;
    @@ -5660,7 +5660,7 @@ 

    Data Integrity in Cloud Code

    -

    Our Cloud Code guide provides instructions on how to upload this trigger to our servers.

    +

    Our Cloud Code guide provides instructions on how to upload this trigger to our servers.

    Validations can lock down your app so that only certain values are acceptable. You can also use afterSave validations to normalize your data (e.g. formatting all phone numbers or currency identically). You get to retain most of the productivity benefits of accessing Parse data directly from your client applications, but you can also enforce certain invariants for your data on the fly.

    @@ -6425,7 +6425,7 @@

    Write Restrictive Queries

    Client-side Caching

    -

    For queries run from iOS and Android, you can turn on query caching. See the iOS and Android guides for more details. Caching queries will increase your mobile app’s performance especially in cases where you want to display cached data while fetching the latest data from Parse.

    +

    For queries run from iOS and Android, you can turn on query caching. See the iOS and Android guides for more details. Caching queries will increase your mobile app’s performance especially in cases where you want to display cached data while fetching the latest data from Parse.

    Use Cloud Code

    @@ -6433,7 +6433,7 @@

    Use Cloud Code

    You can use this to offload processing to the Parse servers thus increasing your app’s perceived performance. You can create hooks that run whenever an object is saved or deleted. This is useful if you want to validate or sanitize your data. You can also use Cloud Code to modify related objects or kick off other processes such as sending off a push notification.

    -

    We saw examples of limiting the data returned by writing restrictive queries. You can also use Cloud Functions to help limit the amount of data returned to your app. In the following example, we use a Cloud Function to get a movie’s average rating:

    +

    We saw examples of limiting the data returned by writing restrictive queries. You can also use Cloud Functions to help limit the amount of data returned to your app. In the following example, we use a Cloud Function to get a movie’s average rating:

    Parse.Cloud.define("averageStars", function(request, response) {
       var Review = Parse.Object.extend("Review");
    @@ -6454,7 +6454,7 @@ 

    Use Cloud Code

    You could have ran a query on the Review class on the client, returned only the stars field data and computed the result on the client. As the number of reviews for a movie increases you can see that the data being returned to the device using this methodology also increases. Implementing the functionality through a Cloud Function returns the one result if successful.

    -

    As you look at optimizing your queries, you’ll find that you may have to change the queries - sometimes even after you’ve shipped your app to the App Store or Google Play. The ability to change your queries without a client update is possible if you use Cloud Functions. Even if you have to redesign your schema, you could make all the changes in your Cloud Functions while keeping the client interface the same to avoid an app update. Take the average stars Cloud Function example from before, calling it from a client SDK would look like this:

    +

    As you look at optimizing your queries, you’ll find that you may have to change the queries - sometimes even after you’ve shipped your app to the App Store or Google Play. The ability to change your queries without a client update is possible if you use Cloud Functions. Even if you have to redesign your schema, you could make all the changes in your Cloud Functions while keeping the client interface the same to avoid an app update. Take the average stars Cloud Function example from before, calling it from a client SDK would look like this:

    Parse.Cloud.run("averageStars", { "movie": "The Matrix" }).then(function(ratings) {
       // ratings is 4.5