5

我正在创建一个大学餐饮菜单应用程序,我需要在其中发送基于每日菜单的推送通知。最初,我计划通过 Heroku 将用户数据存储在数据库中,并使用 cron 作业将数据库中的数据与每日菜单进行比较,并向用户发送适当的通知。

然而,在关于 Cloudkit 的消息之后,我认为我可以使用它来管理我的代码中与服务器相关的部分。但是,经过仔细检查,Cloudkit 似乎目前能够存储数据,但不允许我们编写服务器端代码。

我想知道我是否正确解释了这个限制,或者事实上我是否可以在 CloudKit 上安排一个数据库,每天将其数据与在线菜单进行比较并发送适当的推送通知。

4

2 回答 2

2

服务器端

正如您所说,CloudKit 不允许服务器端代码。

但是..欢迎来到

订阅

订阅概念是客户端注册特定更新。您可以创建一个名为Dailyinstance 的记录类型并让用户注册到它。您应该查看Apple 文档和 WWDC14 视频(即使订阅不详细,这是一个很好的起点)。

好消息是推送通知与订阅概念相关联。所以基本上你说:向我发送一个通知,为每个添加的新CKRecord类型Daily

克朗斯

现在的问题是您的用户正在注册新帖子,但您不想每天都连接到 iCloud 仪表板以便通过添加记录来执行推送。这里的一个解决方案是在 mac 服务器上编写一个应用程序(我猜 mac mini 作为服务器将在 CloudKit 中变得更流行),Daily CKRecord每天都会添加一个新的应用程序。

限制

问题是 AFAIK 通知消息是在客户端写入的,因此它不依赖于您发送的数据。

于 2014-06-13T08:36:24.200 回答
2

您不会使用或考虑Parse.com用于这样的事情似乎令人难以置信......

(如果不是 Parse,其他一些具有类似功能集的 bAA。)

注意 - Parse 现在位于 back4app.com。

1) Parse 是使用 iOS 应用进行推送的最简单方法

2) Parse 的整个想法是你有云代码,而且非常简单,

https://parse.com/docs/cloud_code_guide

您可以拥有云代码例程,并且您可以拥有定期执行的“cron”例程。这就是为什么每个人都在使用 Parse!

请注意,使用 Parse 从 iOS 调用“云函数”非常容易。

这是一个例子,

-(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
    }

请注意,我正在调用云函数“clientRequestFriendRemove”。所以这只是我写的一段云代码,它在我们的 Parse 帐户上,实际上它在这里

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;
      }
    }
  );

}
);

(更完整的例子...... https://stackoverflow.com/a/24010828/294884

3)在 Parse 中从云代码中进行推送是微不足道的,这也是“每个人都使用它”的原因

例如,这是一个与 Push 相关的 Parse 云代码片段......

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) 在 nosql 环境中,与你的食物数据库相关的所有事情都非常容易。没有什么比 Parse 方法更容易的了

5)您可以免费获得整个后端(用于添加食物等)-通常需要几个月的工作

6)最后我猜 Parse 是相当免费的(除非你有这么多用户,否则无论如何你都会发财)

所以,我无法想象以任何其他方式做你所说的——否则这将是一场噩梦。希望能帮助到你

于 2014-06-17T10:05:53.223 回答