欢呼声热烈 谷歌宣布 KOTLIN 成 ANDROID 开发一级语言


谷歌I/O大会一开始就宣布了Android设备超过20亿部的好消息,会议推进至此,果然Android才是大会的压轴大戏么?

首先,今年夏末应该就可以收到Android O的推送,当然,国内用户就先别想了,除非你一直都用原生的。其次,有两个关键词需要注意,一是“Fluid Experience(流畅体验)”,二是“Vitals(核心功能)”。

地图、Netflix、浏览器中的视频等将支持安卓O画中画功能,随后还会有更多应用支持画中画,相当于另一种形态的多任务处理,这是Fluid Experience(流畅体验)的一部分。另外,通知部分也有升级,所谓“Notification Dots(通知点)”有点像是iOS App右上角的提示标,但是长按的话会显示更多信息。

Android O也带来了更加智能化的信息填充系统,未来不仅仅是Chrome中的表格信息,App中的信息也可以自动填充了。另外,新增的”智能文本选择”,可用于更加效率的复制和粘贴。最后,名为“TensorFlow Lite”的机器学习功能专用于手机,将会在之后的一段时间上线,具体功能并未详细提及。

Vitals(核心功能)部分,谷歌更强调电池续航、安全性、启动时间和稳定性。安全性方面,Google Play商店采用机器学习,每天都会扫描500亿次应用程序,告知你手机上的App已经经过扫描,让安全性更具可视化。

启动时间方面,谷歌给出的数据是,在Pixel上,Android O的启动时间是上代的一半。Android O的运行也会更加高效,保持闲置后台回收;太多的后台程序会消耗电池电量, Android O将提供智能节点措施。针对开发者,Play Console Dashboard可以告诉开发者他们的应用耗电、闪退情况;告知开发者有多少用户受到不良应用侵犯,协同开发者一起为用户提供更好的App体验。

然而并没有太多能和用户挂钩的功能性升级,至少大会上提到的这些内容,如果不算那一波更新的emoji,我们目前很难有什么实质性的感受。

最后,谷歌宣布,将Kotlin语言作为安卓开发的一级编程语言。Kotlin由JetBrains公司开发,与Java 100%互通,并具备诸多Java尚不支持的新特性。谷歌称还将与JetBrains公司合作,为Kotlin设立一个非盈利基金会。

JetBrains在2010年首次推出Kotlin编程语言,并在次年将之开源。下一版的Android Studio(3.0)也将提供支持。

(转)JS之on与addEventListener的使用与两者的不同

JS之ON和ADDEVENTLISTENER的使用与不同

一.首先介绍两者的用法:
1.on的用法:以onclick为例
第一种:
“`javascript
obj.onclick = function(){
//do something..
}

第二种:
```javascript
    obj.onclick= fn;
    function fn (){
    //do something...
    }

第三种:当函数fn有参数的情况下使用
匿名函数来传参:

obj.onclick = function(){fn(param)};
function fn(param){
//do something..
}

不能够这样写:
错误写法:obj.onclick= fn(param):
因为这样写函数会立即执行,不会等待点击触发,
特别注意一下

2.addEventListener的用法:
形式:
addEventListener(event,funtionName,useCapture)
参数:
event:事件的类型如 “click”
funtionName:方法名
useCapture(可选):布尔值,指定事件是否在捕获或冒泡阶段执行。
true – 事件句柄在捕获阶段执行
false- false- 默认。事件句柄在冒泡阶段执行
写法:
第一种:

obj.addEventListener("click",function(){
//do something
}));

第二种,没参数可以直接写函数名
obj.addEventListener(“click”,fn,fasle));
function fn(){
//do something..
}
第三种:函数有参数时需要使用匿名函数来传递参数

obj.addEventListener("click",function(){fn(parm)},false);

二.两者的区别
1.on事件会被后面的on的事件覆盖
以onclick为例:

//obj是一个dom对象,下同
//注册第一个点击事件
obj.onclick(function(){
alert("hello world");
});
//注册第二个点击事件
obj.onclick(function(){
alert("hello world too");
});

最终会只有弹框输出:
hello world too

2.addEventListener 则不会覆盖。

//注册第一个点击事件
obj.addEventListener("click",function(){
alert("hello world");
}));
//注册第二个点击事件
obj.addEventListener("click",function(){
alert("hello world too");
}));

这样会连续输出:
hello world
hello world too

三.addEventListener注意事项:
特别说明addEventListener不被
IE9以下兼容,IE9以下用使用
addEvent()
obj.addEvent(event,funtionName);
参数:
event:事件类型(需要写成“onclick”前面加on,这个与addEventListener不同)
funtionName:方法名(要参数是也是需要使用匿名函数来传参)

四.事件集合:
1.鼠标事件:
click(单击)
dbclick(双击)
mousedown(鼠标按下)
mouseout(鼠标移走)
mouseover(鼠标移入)
mouseup(鼠标弹起)
mousemove(鼠标移动)
2.键盘事件:
keydown(键按下)
keypress(按键)
keyup(键起来)
3.HTML事件:
load(加载页面)
unload(卸载离开页面)
change(改变内容)
scroll(滚动)
focus(获得焦点)
blur(失去焦点)
五.总结:
onXXX与addEventListener都是为dom元素添加事件监听,使其在事件发生后执行相应的代码,操作。有了它们我们实现了页面与用户交互。

作者:Ry-yuan

本文是个人总结得出。
转载请标明出处,本文地址:
http://www.cnblogs.com/Ry-yuan/p/6865632.html

react-native 创建桌面APP

1:Electron 是什么

引用官网的一句话:
Build cross platform desktop apps with JavaScript, HTML, and CSS

1.2 诞生

技术背景:

JavaScript近几年的全领域发展,个人理解JavaScript是思想对java的前进,从compile once,run everywhere转变为code once,run everywhere,由于JavaScript本身的是一门解释性的脚本语言,这让它逐渐的成为全宇宙使用最广泛的语言,没有之一。

JavaScript只是JavaScript,在浏览器中,它操作DOM和BOM,在服务器端它操作FileSystem,HTTP,所以在任何环境,他都可以执行,即使是在几M的内存环境,这点对物联网来说很重要。

调用需求:

传统的PC软件开发成本太高,和网络的兴起,让传统的开发逐渐被在线系统吊打,高成本必然逐渐的走下坡路,这是符合经济上发展的趋势,但是由于性能的问题,不管是VR还是直播,需要采集视频,音频,网卡信息,而这些模块大多数还是C、C++来获取

传统局限:
在浏览器里,Web页面通常运行在一个沙盒环境里,它不能访问本地的资源。
比如在Web页面里,调用本地GUI是不允许的,因为在Web页面里管理本地GUI资源是非常危险的而且非常容易导致资源泄露。如果你想在Web页面进行GUI操作,该Web页面的渲染进程必须通过和主进程通信来请求主进程处理这些操作。

2:electron-react-boilerplate 是什么

electron-react-boilerplate 可扩展的跨平台桌面程序的样板

基于Electron基础上使用了 React, Redux, React Router, Webpack, React Transform HMR开发的 快速桌面应用程序开发模板

2.1Install 初始化项目

版本要求:
node 版本大于>= 6 npm 版本大于 >= 3

git clone --depth=1 https://github.com/chentsulin/electron-react-boilerplate.git your-project-name

cd到相应目录初始化依赖关系

$ cd your-project-name && npm install

注:这个过程可能很慢会很慢一定要有耐心

####2.2 运行

启动应用程序在开发环境中。这个过程开始渲染器在hot-module-replacement模式和启动一个服务器发送热更新渲染器的过程:
方式1:
$ npm run dev

方式2:
打开多个终端分别执行下面2行代码
$ npm run hot-updates-server
$ npm run start-hot-renderer

react-native-on-web

一、简介

使React-Native 支持Web平台开发

同时支持React同构模式,以及支持单页模式与多页模式共存,资源按需加载等。
二、安装

npm install react-native-on-web –g
三、生成

react-native-on-web init //在你的react-native目录下执行此命令 -> 生成web平台

react-native-on-web start //在你的react-native目录下执行此命令 -> 启动web平台

react-native-on-web remove //在你的react-native目录下执行此命令 -> 移除web平台

开源代码: https://github.com/Beven91/react-native-on-web#readme

IOS开发中,INFO.PLIST配置用户隐私的保护

info.plist 配置【用户隐私的保护】

>= iOS10
Privacy – Bluetooth Peripheral Usage Description –> App需要您的同意,才能访问蓝牙
Privacy – Calendars Usage Description –> App需要您的同意,才能访问日历
Privacy – Camera Usage Description –> App需要您的同意,才能访问相机
Privacy – Microphone Usage Description –> App需要您的同意,才能访问麦克风
Privacy – Photo Library Usage Description –> App需要您的同意,才能访问相册
Privacy – Motion Usage Description –> App需要您的同意,才能访问运动与健身(运动使用)
Privacy – Health Update Usage Description -> 健康更新开发
Privacy – Health Share Usage Description -> 健康分享开发
Privacy – HomeKit Usage Description ->沟通和控制家庭自动化配件
Privacy – Contacts Usage Description   –> 通讯录权限
Privacy – Speech Recognition Usage Description –> 语音转文字权限、语音
Privacy – NSSiriUsageDescription –> Siri的权限
Privacy – Reminders Usage Description –> 提醒事项
Privacy – Media Libaray Usage Description -> 媒体资源库
Privacy – Music Usage Description –> 音乐
Privacy – Location When In Use Usage Description –>定位权限
Privacy – Location Always Usage Description  –>定位权限
Privacy – Location Usage Description –> 位置权限
Privacy – TV Provider Usage Description –> 电视供应商使用权限
Privacy – Video Subscriber Account Usage Description –> 视频用户账号使用权限
>=iOS8
 NSLocationAlwaysUsageDescription –>  允许永远可获取GPS的描述
 NSLocationWhenInUseUsageDescription –>  允许在前台使用时获取GPS的描述 

转 IOS应用程序间共享数据

我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等。虽然我们不能直接通过文件系统来分享数据,不过还是有些方法可以实现,为了方便说明,这里同时创建了两个工程Example1和Example2,实现这两个app之间的信息共享,Example1负责写数据,Example2负责读数据,具体的demo代码可以到这里获取

UIPasteboard

剪贴板是应用程序之间传递数据的简单方式,建议不要使用全局的粘贴板,而是自己根据名字创建一个新的粘贴板,防止其它地方全局拷贝的影响。然后把需要共享的内容复制到粘贴板,粘贴板的内容可以是文本、URL、图片和UIColor等,另一个app就可以根据粘贴板的名字去读取相关的信息。

Example1设置粘贴板的内容:

    UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:YES];
    pasteboard.string = @"myShareData";
Example2读取粘贴板的内容:

    UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"myPasteboard" create:NO];
    NSString *content = pasteboard.string;

Custom URL Scheme

URL Scheme能够让我们通过自定义的协议在应用程序间传递信息,当你想要发送数据给一个实现了自定义URL Scheme的应用时,只需要创建好合适格式的URL,然后调用openURL:方法,系统就会载入注册了该scheme的应用然后将你的URL传递给他,比如如下的代码,todolist是一个其它应用注册的scheme,通过openURL便可以将服务请求发送到该应用(自定义的URL Scheme要能够唯一标示该APP,如果你的URL Scheme跟别人冲突了,那么你的app就不一定会被调起,iOS并不保证调用哪个应用)。

NSURL *myURL = [NSURL URLWithString:@”todolist://newid=20″];
[[UIApplication sharedApplication] openURL:myURL];
注册URL Scheme
为了能够处理URL请求,我们需要先注册自定义的URL Scheme,只需要在Info tab下的URL Types添加即可,比如我们这里注册Example2的URL Scheme。

Identifier用于标示名称,为了唯一性可以采用反转域名的形式,另外我们设置URL Scheme为Example2,以及role为Viewer(Viewer表示只能读取改URL但不能修改,Editor可以对URL进行读写),这样Example2就能够接受类似”Example2:\”的URL请求了,可以在浏览器中输入”Example2:\”链接打开app。

处理URL请求
当有URL请求到来时,所有的URL都会传递给你的app delegate,我们需要实现application:openURL:sourceApplication:annotation:方法来接收处理对应的URL,所以假如你想通过URL方式来传递数据,只需要将数据添加到URL中即可,另外的通过解析该URL来获取对应的数据。

Eaxmple1发送携带参数的URL到Example2:

NSString *string = @”Example2://name=jiangbin#age=1″;
NSURL *url = [NSURL URLWithString:string];
[[UIApplication sharedApplication] openURL:url];
Example2处理URL请求并解析:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([[url scheme] isEqualToString:@"Example2"]) {
        NSString *content = [url resourceSpecifier];
        //解析content获取数据
        //...
        return YES;
    }
    return NO;
}

Shared Keychain Access

iOS的keychain提供一种安全保存信息的方式,可以保存密码等数据,而且keychain中的数据不会因为你删除app而丢失,你可以在重新安装后继续读取keychain中的数据。通常每个应用程序只允许访问自己在keychain中保存的数据,不过假如你使用同一个证书的话,不同的app也可以通过keychain来实现应用间的数据共享。

为了实现keychain共享数据,我们需要开启Keychain Sharing,开启方法如下,然后添加设置相同的Keychain Group,不过别忘记了添加Security.framework。

Example1保存数据到keychain(为了简单使用SSKeychian)

  • (void)setKeyChain
    {
    [SSKeychain setPassword:@”shareData” forService:@”myservice” account:@”jiangbin”];
    }
    Example2读取数据
- (IBAction)getByKeychain:(id)sender
{
    NSString *myData = [SSKeychain passwordForService:@"myservice" account:@"jiangbin"];
}

App Groups

iOS8之后苹果加入了App Groups功能,应用程序之间可以通过同一个group来共享资源,app group可以通过NSUserDefaults进行小量数据的共享,如果需要共享较大的文件可以通过NSFileCoordinator、NSFilePresenter等方式。
开启app groups,需要添加一个group name,app之间通过这个group共享数据:

Example1根据group name设置内容:

- (void)setAppGroup{
    NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
    initWithSuiteName:@"group.com.jiangbin.SharedData"];
    [myDefaults setObject:@"shared data" forKey:@"mykey"];
}

Example2根据group name读取数据

- (void)getByAppGroup
 {
    NSUserDefaults *myDefaults = [[NSUserDefaults alloc]
                                  initWithSuiteName:@"group.com.jiangbin.SharedData"];
    NSString *content = [myDefaults objectForKey:@"mykey"];
}

PYTHON3网络爬虫:爱奇艺等主流视频网站的VIP视频破解(在线观看+视频下载)

转载请注明作者和出处:http://blog.csdn.net/c406495762
运行平台: Windows
Python版本: Python3.x
IDE: Sublime text3

#一、前言

没有会员,想在线观看或下载爱奇艺、PPTV、优酷、网易公开课、腾讯视频、搜狐视频、乐视、土豆、A站、B站等主流视频网站的VIP视频?又不想充会员怎么办?博主本次写的VIP视频破解助手也许可以帮你解决烦恼。

PS:本软件只用来交流学习,请勿用于商业用途。如涉及版权侵权等问题,请联系我,我会删除文章。我可是守法的好公民….

#二、软件使用说明

####1、软件下载
软件运行平台:Windows
注意:该软件已经打包成exe可执行文件,无需Python环境即可运行。将软件压缩包解压,即可使用。
百度云盘下载地址:链接:http://pan.baidu.com/s/1bp8aMPD 密码:otw8
exe可执行文件,即助手软件保存在dist文件夹下:

运行软件,如果误报木马。将此应用程序添加到信任区,或者关闭杀毒软件,即可。PS:软件无毒,可放心使用。
####2、在线播放视频(以爱奇艺为例讲解)

在主界面我们可以选择视频的播放通道(默认通道一)。在视频连接文本框中输入视频连接,点击播放按钮,该助手软件将启动默认浏览器,视频即可在线观看。

视频连接如何获取呢?

在菜单栏的友情链接的下拉列表中,我们可以选择打开一个我们喜欢的视频网站,比如点击爱奇艺,默认浏览器将自动打开爱奇艺首页。

选择一部自己喜欢的电影,浏览器地址栏的内容即为视频连接。

降龙大师:URL:http://www.iqiyi.com/v_19rrb2yq04.html?fc=8b62d5327a54411b#vfrm=19-9-0-1
![](http://www.zhwios.cn/wp-content/uploads/2017/05/20170507160751297-300x193.png)

在助手软件文本输入框中输入地址,点击播放即可在线观看视频:


####3、视频下载(以爱奇艺为例讲解 )

注意:暂只支持爱奇艺和优酷的视频下载,视频在线观看不受影响。

点击菜单,出现下拉菜单,在下拉菜单选择视频下载(注意:请先添加视频连接)

此时,默认浏览器会打开网页,等待几秒钟,待加载完成,点击下图按钮,即可通过浏览器下载视频。

#三、代码编写

介绍完该助手软件,进入本次爬虫教程的正题:视频抓包

###1、软件原理:

a)视频播放

在讲解视频抓包之前,先介绍下两个视频解析网站:

VIP视频解析:http://www.vipjiexi.com/
无名小站:http://www.wmxz.wang/
这两个网站为我们提供了免费的视频解析,他们的通用解析方式是:

VIP视频解析: http://www.vipjiexi.com/tong.php?url=[播放地址或视频id]
无名小站:http://www.wmxz.wang/video.php?url=[播放地址或视频id]

笔者正式调用了这两个网站,实现视频在线播放的。至于,视频下载界面如何调出,即是本文的重点。

b)视频下载

这两个网站均没有提供下载功能,当然如果你使用chrome视频抓包插件,也可以实现视频的下载,例如使用chrome插件:Flash Video Downloader。不过为了学习,我们使用python程序进行抓包。因此,笔者使用无名小站进行视频下载,对无名小站视频进行抓包分析。

看过笔者之前的Python3网络爬虫的读者,一定知道如何进行抓包分析,在这里不再啰嗦,直接进入正题:我们可以看到这里有一个POST请求,Form Data中有两个参数,一个是up,另一个是url。因此,我们向服务器发送这个数据请求,对返回的数据进行json解析,即可得到视频的真实地址,打开这个视频的真实地址,就会出现之前介绍的现在视频的浏览器界面。仅仅这样就可以了吗?其实不然,因为如果你单纯使用这种方法,我们只能下载我们抓包分析时的视频。因为,这个url是随着我们解析视频的不同而改变的,因此如何获取这个改变的url,成为我们下一步的重点。


继续分析我们会发现在发送POST请求之前,有一个GET请求,如果我们向这个Request URL的地址发送GET请求,你会惊奇的发现,返回的信息里包含我们需要的url信息。

它是这个样子的:


瞧,url我们就这样得到了,通过相应的解析,提取出url信息,并将这个url信息作为之前提到的POST请求的Form Data,这样我们就可以得到真实的视频地址,通过该地址即可进行视频下载,代码如下:

#-*-coding:utf-8-*-
import re
import json
from bs4 import BeautifulSoup
from urllib import request, parse

if __name__ == '__main__':
    ip = 'http://www.iqiyi.com/v_19rrb2yq04.html?fc=8b62d5327a54411b#vfrm=19-9-0-1'
    get_url = 'http://www.sfsft.com/index.php?url=%s' % ip

    get_movie_url = 'http://www.sfsft.com/api.php'

    head = {
        'User-Agent':'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19',
        'Referer':'http://www.sfsft.com/index.php?url=%s' % ip
    }

    get_url_req = request.Request(url = get_url, headers = head)
    get_url_response = request.urlopen(get_url_req)
    get_url_html = get_url_response.read().decode('utf-8')
    bf = BeautifulSoup(get_url_html, 'lxml')

    a = str(bf.find_all('script'))

    pattern = re.compile("url : '(.+)',", re.IGNORECASE)
    url = pattern.findall(a)[0]

    get_movie_data = {
        'up':'0',
        'url':'%s' % url,
    }
    get_movie_req = request.Request(url = get_movie_url, headers = head)
    get_movie_data = parse.urlencode(get_movie_data).encode('utf-8')
    get_movie_response = request.urlopen(get_movie_req, get_movie_data)
    get_movie_html = get_movie_response.read().decode('utf-8')
    print(get_movie_data['url'])

运行结果如下图所示:

在浏览器中打开这个地址,即可出现上面提到的视频下载界面。同时,更改代码中的ip,即视频连接地址,即可解析不同的视频的真实视频地址,并对其进行下载。

###2、Tkinter

该助手软件的界面是使用Python的Tkinter设计的,由于本部分内容不是Python网络爬虫的重点,因此不在此进行讲解。

#四、总结

该软件一定还是有一些Bug的,欢迎指出问题。

除此之外,软件也有很多需要改进的地方。比如,视频的下载是在浏览器中进行的,操作不友好。可以使用该软件直接下载,选择下载路径,实现一键下载。同时,视频下载暂只支持爱奇艺和优酷的视频下载,这里也可以进行改进。但是由于笔者的时间有限,就没有继续写,后期可能会更新。

PS:如果觉得本篇文章对您有所帮助,欢迎关注、订阅、顶!

上传发布自己的npm组件包

作为前端程程序员,npm包管理是需要经常使用的,封装自己的组件包,方便使用是有必要的,文章介绍发布npm组件包的全过程,以备不时之需。

本文介绍如何上传自己的NPM组件包到NPM库中,当你写好自己的NMP组件或者根据需求修改某个组件后想共享给别人或者公司同事使用的时候,你可以使用NPM  publish 命令提交上去,要经过审核。但你可以上传到自己的公司的服务器库 如何搭建NPM私人服务器 参考 链接

初始化Package.json

npm init

 

验证npm账号

npm adduser

发布

npm publish

 

 

package.json 实例

 

{
  "name": "RNSVG",
  "version": "0.1.0",
  "description": "An easy mongodb client for node.js based on native mongodb driver.",
  "main": "./index.js",
  "directories": {
    "example": "examples"
  },
  "scripts": {
    "test": "make test"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/YuXueBJ/react-native-xsy-svg.git"
  },
  "keywords": [
    "react-component",
    "react-native",
    "ios",
    "android",
    "SVG",
    "ART",
    "VML"
  ],
  "author": "zhwios",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/YuXueBJ/react-native-xsy-svg"
  }
}

 

ReactNative No component found for view with name “ARTSurfaceView”

ReactNative 添加的第三方库

npm install --save react-native-image-progress
npm install --save react-native-progress

编译出现下图错误

Using:
“react-native”: “^0.24.1”,
“react-native-circular-progress”: “0.0.6”,

49ac3b98-1f75-11e6-92f4-fe9718c88ddb

解决办法:

从项目的根路径: node_modules/react-native/Libraries/ART/

fig16-react-native-preview-opt

ART.xcodeproj工程文件添加到Libraries中

fig17-react-native-preview-opt

打开工程tager 选择Build Phases

fig18-react-native-preview-opt (1)

fig19-react-native-preview-opt

重新运行工程问题已解决

 

ios 原生通知 ReactNative


本地模块也可以给JavaScript发送事件通知。最直接的方式是使用eventDispatcher:
- (void)calendarEventReminderReceived:(NSNotification *)notification
{
//  NSString *eventName = notification.userInfo[@"name"];
   NSString *eventName = @"123";

  [self.bridge.eventDispatcher sendAppEventWithName:@"EventReminder"
                                               body:@{@"name": eventName}];
}

在JavaScript中可以这样订阅事件:

var subscription = DeviceEventEmitter.addListener(
  'EventReminder',
  (reminder) => {
    alert(reminder.name);
    // console.log(reminder.name)
  }
);

ios原生 源码

.h

#import <Foundation/Foundation.h>
#import "RCTBridgeModule.h"


@interface CalendarManager : NSObject<RCTBridgeModule>

@end

.m

#import "CalendarManager.h"
#import "RCTBridge.h"
#import "RCTEventDispatcher.h"

@interface CalendarManager ()

//@property (nonatomic,strong)bridge;
@end

@implementation CalendarManager

@synthesize bridge = _bridge;


RCT_EXPORT_MODULE()

RCT_EXPORT_METHOD(notification){
  
//    [[NSNotificationCenter defaultCenter] postNotificationName:@"EventReminder" object:nil userInfo:nil];
  [self calendarEventReminderReceived:nil];
}


- (void)calendarEventReminderReceived:(NSNotification *)notification
{
//  NSString *eventName = notification.userInfo[@"name"];
   NSString *eventName = @"123";

  [self.bridge.eventDispatcher sendAppEventWithName:@"EventReminder"
                                               body:@{@"name": eventName}];
}


@end

js 调用代码

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */



import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  TouchableOpacity,
  NativeAppEventEmitter,
  DeviceEventEmitter,
  View
} from 'react-native';

import CalendarManagerModel  from './CalendarManagerModel';


var subscription = DeviceEventEmitter.addListener(
  'EventReminder',
  (reminder) => {
    alert(reminder.name);
    // console.log(reminder.name)
  }
);

class RNProject extends Component {
  render() {
    return (
      <View style={styles.container}>
          <TouchableOpacity onPress={()=>{
            CalendarManagerModel.notification();
          }} >
            <Text style={styles.emptyTxt}>{
              '点击'
            }</Text>
       </TouchableOpacity>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
  },
});

AppRegistry.registerComponent('RNProject', () => RNProject);