2014-06-09 2 views
4

Je crée une application de menu de salle à manger d'université, dans laquelle je dois envoyer des notifications de poussée basées sur les menus quotidiens. À l'origine, j'avais l'intention de stocker des données utilisateur dans une base de données via Heroku et d'utiliser des tâches cron pour comparer les données de la base de données avec les menus quotidiens et envoyer les notifications appropriées aux utilisateurs. Après les nouvelles sur Cloudkit, cependant, j'ai pensé que je pourrais utiliser cela plutôt pour gérer la partie liée au serveur de mon code. Cependant, après une inspection plus approfondie, il semble que Cloudkit est actuellement capable de stocker les données, mais ne nous permet pas d'écrire du code côté serveur. Je me demande si j'ai interprété cette limitation correctement, ou si je peux, en fait, planifier une base de données sur CloudKit pour comparer ses données aux menus en ligne chaque jour et envoyer des notifications push appropriées.CloudKit pour envoyer des notifications push via des tâches cron?

Répondre

2

Il semble incroyable que vous ne seriez pas utiliser ou envisager Parse.com quelque chose comme ça ...

(Dans le cas contraire, d'autres Parse baas avec un ensemble de fonctionnalités similaires.)

NOTE - Parse est maintenant à back4app.com.

1) Parse est la meilleure façon possible de faire pousser avec une application iOS

2) l'idée de Parse est que vous avez le code nuage, et il est incroyablement simple,

https://parse.com/docs/cloud_code_guide

vous pouvez avoir des routines de code de nuage, et, vous pouvez avoir des routines "cron" qui se déclenchent régulièrement. C'est pourquoi tout le monde utilise Parse!

Notez qu'il est très facile d'appeler des "fonctions de cloud" à partir d'iOS, avec Parse.

Voici un exemple

-(void)tableView:(UITableView *)tableView 
     commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
     forRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    int thisRow = indexPath.row; 
    PFUser *delFriend = [self.theFriends objectAtIndex:thisRow]; 

    NSLog(@"you wish to delete .. %@", [delFriend fullName]); 

    // note, this cloud call is happily is set and forget 
    // there's no return either way. life's like that sometimes 

    [PFCloud callFunctionInBackground:@"clientRequestFriendRemove" 
      withParameters:@{ 
          @"removeThisFriendId":delFriend.objectId 
          } 
      block:^(NSString *serverResult, NSError *error) 
      { 
      if (!error) 
       { 
       NSLog(@"ok, Return (string) %@", serverResult); 
       } 
      }]; 

    [self back]; // that simple 
    } 

Avis J'appelle une fonction nuage "clientRequestFriendRemove". Donc, c'est juste un morceau de code nuage je l'ai écrit et qui est sur notre compte Parse, en fait, ici, il est

Parse.Cloud.define("clientRequestHandleInvite", function(request, response) 
{ 
// called from the client, to accept an invite from invitorPerson 

var thisUserObj = request.user; 
var invitorPersonId = request.params.invitorPersonId; 
var theMode = request.params.theMode; 

// theMode is likely "accept" or "ignore" 

console.log("clientRequestAcceptInvite called.... invitorPersonId " + invitorPersonId + " By user: " + thisUserObj.id); 
console.log("clientRequestAcceptInvite called.... theMode is " + theMode); 

if (invitorPersonId == undefined || invitorPersonId == "") 
    { 
    response.error("Problem in clientRequestAcceptInvite, 'invitorPersonId' missing or blank?"); 
    return; 
    } 

var query = new Parse.Query(Parse.User); 
query.get(
    invitorPersonId, 
    { 
    success: function(theInvitorPersonObject) 
     { 
     console.log("clientRequestFriendRemove ... internal I got the userObj ...('no response' mode)"); 

     if (theMode == "accept") 
     { 
     createOneNewHaf(thisUserObj, theInvitorPersonObject); 
     createOneNewHaf(theInvitorPersonObject, thisUserObj); 
     } 

     // in both cases "accept" or "ignore", delete the invite in question: 
     // and on top of that you have to do it both ways 

     deleteFromInvites(theInvitorPersonObject, thisUserObj); 
     deleteFromInvites(thisUserObj, theInvitorPersonObject); 

     // (those further functions exist in the cloud code) 

     // for now we'll just go with the trick of LETTING THOSE RUN 
     // so DO NOT this ........... response.success("removal attempt underway"); 
     // it's a huge problem with Parse that (so far, 2014) is poorly handled: 
     // READ THIS: 
     // parse.com/questions/can-i-use-a-cloud-code-function-within-another-cloud-code-function 
     }, 
    error: function(object,error) 
     { 
     console.log("clientRequestAcceptInvite ... internal unusual failure: " + error.code + " " + error.message); 
     response.error("Problem, internal problem?"); 
     return; 
     } 
    } 
); 

} 
); 

(exemples Fuller ... https://stackoverflow.com/a/24010828/294884)

3) il est trivial de faire pousser passer du code nuage en Parse, encore une fois c'est pourquoi « tout le monde l'utilise »

Par exemple, voici un fragment de code nuage Parse qui se rapporte Push ...

function runAPush(ownerQueryForPush, description) 
// literally run a push, given an ownerQuery 
// (could be 1 to millions of devices pushed to) 
    { 
    var pushQuery = new Parse.Query(Parse.Installation); 
    pushQuery.matchesQuery('owner', ownerQueryForPush); 
    Parse.Push.send 
     (
     { 
     where: pushQuery, 
     data: 
      { 
      swmsg: "reload", 
      alert: description, 
      badge: "Increment", 
      title: "YourClient" 
      } 
     }, 
     { 
     success: function() 
{ console.log("did send push w txt message, to all..."); }, 
     error: function(error) 
{ console.log("problem! sending the push"); } 
     } 
     ); 
    } 

4) il est incroyablement facile de faire tout ce qui concerne votre base de données de nourriture, dans un environnement nosql. rien ne pouvait être plus facile que gratuitement (pour l'ajout d'aliments, peu importe) l'approche Parse

5), vous obtenez l'arrière tout - normalement des mois de travail

6) enfin je suppose que Parse est tout à fait libre (Donc, je ne peux pas m'imaginer faire ce que vous dites d'une autre façon - ce serait un cauchemar dans le cas contraire. J'espère que ça aide

+0

Juste pour vérifier, je serais en mesure de récupérer des données sur une page Web et de les stocker dans le nuage avec juste le code backend, non? – Mahir

+0

Oui, je suis sûr que ce serait possible. Donc, ici https://parse.com/docs/cloud_code_guide#networking, il explique précisément comment vous pouvez obtenir une page sur Internet. notez aussi que vous pouvez écrire des webhooks, pour que "d'autres serveurs puissent vous appeler" ... https://parse.com/docs/cloud_code_guide#webhooks Je suggère (a) de consulter cette documentation (b) n'hésitez pas à poser une nouvelle question comme "puis-je faire cela avec analyse" car il y a beaucoup d'ingénieurs d'analyse sur ce site – Fattie

2

côté serveur

Comme vous avez dit CloudKit ne permet pas de code côté serveur.

Mais .. Bienvenue sur

Abonnements

Abonnements concept est que le client enregistre des mises à jour spécifiques. Vous pouvez par exemple créer un type d'enregistrement appelé Daily et inviter les utilisateurs à s'y inscrire. Vous devriez vérifier les vidéos Apple documentation et WWDC14 (même si les abonnements ne sont pas détaillés, c'est un bon point de départ). La bonne chose est que les notifications push sont liées au concept d'abonnement. Donc, fondamentalement, vous dites: Envoyez-moi une notification pour chaque nouveau CKRecord de type Daily ajouté.

Crons

Maintenant, le problème est que vos utilisateurs sont des registres à de nouveaux messages, mais vous ne voulez pas de se connecter au quotidien Tableau de bord iCloud afin d'effectuer la poussée en ajoutant un enregistrement. Une solution ici est de coder une application sur un serveur mac (je suppose que mac mini comme serveur deviendra plus populaire avec CloudKit) qui ajoute un nouveau DailyCKRecord tous les jours.

Limites

Le problème est AFAIK le message de notification est écrit sur le côté client, il ne dépend pas de données que vous envoyez.

+0

Comme vous l'avez mentionné, ils n'ont pas encore publié toutes les informations à ce sujet. Savez-vous quand nous aurions un accès complet à ces fonctionnalités? – Mahir

+0

"Comme vous l'avez dit, CloudKit n'autorise pas le code côté serveur ...." c'est exactement pourquoi Parse est Parse .... – Fattie

+0

"Savez-vous quand nous aurions un accès complet à ces fonctionnalités?" mahir, il est inconcevable que vous attendiez que CloudKit fasse un travail comme celui-ci qui est "fait pour un bAAs" - il suffit de choisir votre poison, Parse, Firebase, Applase, Buddy ou autre. Il y a des milliers d'articles sur "Quels bAAs devrais-je choisir?!" par exemple. http://www.developereconomics.com/backend-as-a-service-shootout-the-best-alternatives-to-parse/ – Fattie

Questions connexes