CloudKit JS via node:无法注册通知

时间:2016-02-11 21:00:28

标签: python ios node.js icloud cloudkit

我正在尝试使用node.js和Apple的CloudKit.js与我的CloudKit数据库进行交互。我成功地创建了服务器到服务器密钥,我可以使用该程序添加,删除或编辑记录。添加订阅也有效。现在我希望它能够收到通知并在收到通知时打印一行。但是,启用通知失败了。我试图注册的回调也没有被调用。

无论我在容器上调用registerForNotifications()的频率如何,在打印属性isRegisteredForNotifications时,我始终会收到false

我来自关于编程语言的“桌面/移动/本机/嵌入式”中心背景,所以node.js,JavaScript,promises,尤其是.then()语法的整个世界对我来说仍然有些陌生

这是我尝试用来接收通知的代码:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";


var fetch = require('node-fetch');

var CloudKit = require('./cloudkit');
var containerConfig = require('./config');

// A utility function for printing results to the console.
var println = function(key,value) {
    console.log("--> " + key + ":");
    console.log(value);
    console.log();
};

//CloudKit configuration
CloudKit.configure({
    services: {
        fetch: fetch,
        logger: console
    },
    containers: [ containerConfig ]
});


var container = CloudKit.getDefaultContainer();
var database = container.publicCloudDatabase; // We'll only make calls to the public database.

// Sign in using the keyID and public key file.
container.setUpAuth();

function renderNotification(notification) {
  console.log('Got notification!')
};
CloudKit.getDefaultContainer().registerForNotifications();
CloudKit.getDefaultContainer().addNotificationListener(renderNotification);
console.log(CloudKit.getDefaultContainer().isRegisteredForNotifications); // Why does this print false?

即使在使用调用.then()的{​​{1}}创建新订阅并添加回调时,该属性仍会显示addNotificationListener并且false永远不会被调用。

这是Apple的CloudKit JS中的错误还是我做错了什么?

另外,我想提一下我能够使用我用Python包装的JSON API(here)成功完成相同的任务(创建,编辑,删除记录或订阅)。但是,似乎无法接收订阅通知,这就是我尝试在此处使用node.js和Apple的CloudKit.js的原因。如果我在这里遗漏了一些东西,并且实际上既没有使用CloudKit.js也没有使用Cocoa API,我很乐意接受任何有关如何操作的建议。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是您注册通知并等待其完成的方式:

container.addNotificationListener(renderNotification);
container.registerForNotifications()
   .then(function() {
       console.log(container.isRegisteredForNotification) //should be true
   })
   .catch(function(error) {
       console.error('there was an error:', error);
   })

话虽如此,您还可以使用WS端点并进行所需的调用(例如使用python)。让nodejs接近并运行可能仍然值得,以便您可以检查网络呼叫。

通过WS处理通知的相关文档如下: