react-native:推送通知+解析

问题描述:

我目前正在研究一个小应用项目,以在iOS上学习并尝试使用react-native。我有一些解析(parse.com)的经验,并希望在新应用中整合解析。目前,我没有任何问题,包括将js解析为react-native。我可以登录帐户等。现在我需要发送推送通知给一定数量的用户(不是所有用户)。react-native:推送通知+解析

我不明白的是推送通知应该如何与react-native和parse一起工作。通常,我会将设备安装与用户ID连接,然后将推送发送给特定数量的用户(这意味着具有相应安装的设备)。反应原生指南(https://facebook.github.io/react-native/docs/pushnotificationios.html#content)没有提到类似的东西。即使它给出了解析指南作为参考,但我没有看到我应该如何通过解析来发送推送。指南也留下了很多信息。这些“听众”订阅的来源是什么?我将从哪个服务器发送通知等?

据我所知,解析js无法读取当前的安装。我不愿意将Parse iOS添加到该项目中。这感觉不自然,不应该成为必需的事情,尽管它可以让我阅读当前的安装。 (但仍然解析js无法注册该安装以订阅推送通知)。

在这一点上,我感觉有点失落。这条信息(https://news.ycombinator.com/item?id=9271687)告诉我,它应该有可能以某种方式。我只是想不通:(

希望有人能怎样帮助我与一些意见,将忠实地感激。

+0

我本指南[链接](https://www.parse.com/docs/push_guide#top/iOS) – rob180

+1

非常感谢您的回复做到了。本指南的JavaScript部分告诉我,它主要用于发送推送,但不能接收推送(可以通过react-native处理)或订阅设备推送。 因为我想尽量减少项目中的objc和swift代码,所以这似乎不能解决我的问题。 (注意:我之前都是这么做的,现在的挑战是转移到反应本地) – MrMuetze

+0

@MrMuetze有什么好运气?你有工作吗?如果是,请分享如何? – Nachiket

编辑:react-native现在默认实现这种行为。有趣的部分是现在返回设备令牌的注册事件的事件监听器。程序现在非常简单。只需看看docs也可以查看JWindey的答案。在他们中有一些非常重要的点需要实际触发事件。

经过一段时间和大量尝试,我们今天想出了一个答案。这是我们的解决方案,它似乎工作得很好。

我们使用下面的资源:

按照分析指南进行推送通知(https://parse.com/tutorials/ios-push-notifications),并正确设置所有内容(配置文件,certificat es等)。稍后使用react-native-remote-push组件,您不必按照步骤5和步骤6.

现在将react-native-remote-push添加到您的项目中。我们必须对代码进行一些小的调整(主要处理遗留的objC代码),但这可能取决于您自己的项目。

我们的项目有一些“开始页面”,每次打开应用程序时都会显示。在此页面上,我们处理推送通知权限以及注册设备令牌和监听器以进行推送通知。我们的目标是模仿与解析iOS SDK相同的行为。

我们需要先注册设备并订阅推送通道。 react-native-remote-push允许我们处理权限并接收设备令牌。然后,我们继续使用此设备令牌通过Rest API注册此安装。此代码是我们的componentDidMount()调用的一部分。

var PushManager = require('./RemotePushIOS'); 
var registerInstallation = require('./Installation'); 

componentDidMount() { 
    PushManager.requestPermissions(function(err, data) { 
     if (err) { 
      console.log("Could not register for push"); 
     } else { 
      registerInstallation({ 
       "deviceType": "ios", 
       "deviceToken": data.token, 
       "channels": ["global"] 
      }); 
     } 
    }); 

    PushManager.setListenerForNotifications(this.receiveRemoteNotification); 
} 

PushManager是react-native-remote-push中的必需组件,registerInstallation是包含Rest API调用的函数。

/** 
* registers an installation 
* data should look like the following: 
* { 
* "deviceType": "ios", // or "android" 
* // if android is targeted set 
* // "pushType": "gcm", 
* // "GCMSenderId": "56712320625545", // whatever the later means 
* "deviceToken": "29e32a686fd09d053e1616cb48", 
* "channels": [ 
*  "" 
* ] 
* }; 
* for more information visit: 
* https://www.parse.com/docs/rest#installations-uploading 
*/ 
var registerInstallation = function(data) { 
    var url = "https://api.parse.com"; 
    url += "/1/installations"; 
    fetch(url, { 
     method: 'post', 
     headers: { 
      'Accept': 'application/json', 
      'X-Parse-Application-Id': PARSE_APP_ID, 
      'X-Parse-REST-API-Key': PARSE_REST_KEY, 
      'Content-Type': 'application/json' 
     }, 
     body: JSON.stringify(data) 
    }) 
    .then(processStatus) 
    .then(parseJson) 
    .catch(error); 
}; 

module.exports = registerInstallation; 

“processStatus”,“parseJson”和“error”只是处理API调用结果的一些小函数。如有必要,我可以提供更多细节。这个函数允许我们通过“data”对象添加大量信息,例如userid,app版本,解析版本等,就像您从iOS SDK中习惯的那样。我们现在只有一个基本的例子,但在这个基础上扩展应该很容易。这一步对我们来说非常重要,因为我们需要将每个安装与特定用户相关联。

您现在应该能够收到推送通知。您可以在充当监听器的“receiveRemoteNotification”函数中处理它们。在react-native-remote-push组件的网站上提供了一个基本功能。

我希望我能分享一些关于这个话题的见解。如果我应该详细说明某些部分,我会很乐意添加更多信息。

+0

非常感谢你!这工作对我来说,虽然我用PushNotificationIOS,但你的代码是超级超级有用:-) –

+0

我用你的答案,它的工作。但是我有问题重置徽章号码。我遵循Parse ios sdk并在 - (void)applicationDidBecomeActive:(UIApplication *)应用程序中添加徽章重置代码{...但它不像解释的那样工作。你有什么建议吗? –

+0

对不起,我还没有查看徽章号码。在这一点上无法帮助你。 – MrMuetze

我做了一些调查与解析+反应本土组合,并有工作。

你必须解析SDK(跟着导游)添加到您的项目,并链接了所有必要的库

不要忘了加上5点的步骤:a。https://parse.com/tutorials/ios-push-notifications

然后添加RCTPushNotificatio nManager.h + m(来自react-native/Libraries)到您的项目。之后,在AppDelegate.m中添加以下代码:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
[[NSNotificationCenter defaultCenter] postNotificationName:@"RemoteNotificationReceived" 
                object:self 
                userInfo:userInfo]; 
} 

应该这样做。

+0

如果我错了,请告诉我,但在这种情况下,您没有将用户分配给设备安装,对吗? – MrMuetze

+0

这是文档中缺少的部分!非常感谢。 – eluleci

官方PushNotificationIOS有register事件,我们可以从中获取令牌。因此,通过拥有@ MrMuetze的REST API,我可以将设备安装到Parse。

PushNotificationIOS.addEventListener('register', function(token){ 
registerInstallation({ 
    "deviceType": "ios", 
    "deviceToken": token, 
    "channels": ["global"] 
}) 
});