2012-05-18 11:16:52 lizujian1990 阅读数 2025
  • JSON基础入门实战讲解

    本课程主要讲解JSON数据格式的使用和实战;讲解JSON对象,JSON数组,JSON对象和数组的嵌套,JSON数据的修改和删除,字符串如何转JSON,JSON如何转字符串,函数JSON.parse,函数JSON.stringify,函数eval的使用,如何获取远程数据转JSON等

    421 人正在学习 去看看 黄菊华

很多开发手机终端软件的朋友,假如想做一个网络的应用,除了使用大公司的api之外,就是需要自己搭建服务器了。本人,由于一直都是从事ios开发的,对服务器后台的开发,认识几乎为0,所以就一直制约了我们团队的发展,大概就是做一些本地应用啊,调用以下大公司的api的。但是,近段时间,我无意中发现了Parse,这个后台服务器。其实与其说是服务器,不是直接说就是一个空间,不过这个空间的服务相当好。几乎完完全全是傻瓜式的,官网的介绍非常详细。https://www.parse.com/

英文比较好的同学,可以直接去官网看介绍,超级简单。下面我大概讲述一下,我使用的一些想法吧。

由于很多开发者,都没有服务器,或者没有能力和精力去搭建一个服务器,所以,Parse就提供了一系列的方案。官网上,有ios和android两套的sdk,直接就可以用了,还有一个官方的例子做参考,那个例子其实也比较简单的,就是一个post数据,和一个get数据。但是不要小看这2个操作,互联网应用,几乎全部都是基于这2个操作的。Parse的好处在于,你写程序的时候,你可以默认假定你已经拥有一个别人配置好的,一流的后台服务器。你需要上传数据,只需

  1. PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
  2. [gameScore setObject:[NSNumber numberWithInt:1337] forKey:@"score"];
  3. [gameScore setObject:@"Sean Plott" forKey:@"playerName"];
  4. [gameScore setObject:[NSNumber numberWithBool:NO] forKey:@"cheatMode"];
  5. [gameScore save];
你这样设定下来,然后save一下就OK了。

使用这个函数,就可以将上传的动作后台进行,完成不会阻塞当前的线程。

[gameScore saveInBackground];


你想去把数据拿回来,操作更简单,甚至与数据库有点类似

首先说一下Parse支持的数据类型


目前Parse的table column支持NSString, NSNumber, NSDate, NSData, 或者另外一个PFObject。同时也可以使用NSDictionary and NSArray保存结构化的数据。其中NSArray 支持相对应的查询。虽然可以使用NSData保存二进制数据,但是推荐先使用PFFile保存文件,比如照片等,而在对应的column保存PFFile的引用。

常用的查询

类似SQL,查询时先创建PFQuery对象,然后设置查询条件。

先看个简单的,查询GameScore表中playName等于 “Dan Stemokoski”的所有记录。


复制代码

  1. PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];[query whereKey:@"playerName" equalTo:@"Dan Stemkoski"];NSArray *objects = [query findObjects];



这个是查NSNumber,查询 playAge大于18的所有记录。


复制代码

  1. [query whereKey:@"playerAge" greaterThan:[NSNumber numberWithInt:18]];



这个是查数组的,aryMatchTypes是一个NSArray的数组,下面的语句查询aryMatchTypes包含"Football"的所有记录。


复制代码

  1. [query whereKey:@"aryMatchTypes" equalTo:@"Football"];



既然是面向对象的,Parse也支持关联查询,下面的例子中Comment和Post都是Parse的对象,下面的代码可以查询包含myPost对象的所有comment记录。


复制代码

  1. PFQuery *query = [PFQuery queryWithClassName:@"Comment"];
  2. [query whereKey:@"post" equalTo:myPost];



Parse支持子查询,下面的例子是找到所有comments的记录,其中的post含有image。


复制代码

  1. PFQuery *innerQuery = [PFQuery queryWithClassName:@"Post"];
  2. [innerQuery whereKeyExists:@"image"];
  3. PFQuery *query = [PFQuery queryWithClassName:@"Comment"];
  4. [query whereKey:@"post" matchesQuery:innerQuery];



或查询,很遗憾,Parse不支持OR条件查询,只支持AND,要用OR的话可以用Compound query,类似SQL的Union


复制代码

  1. PFQuery *lotsOfWins = [PFQuery queryWithClassName:@"Player"];
  2. [lotsOfWins whereKey:@"wins" greaterThan:[NSNumber numberWithInt:150]];
  3. PFQuery *fewWins = [PFQuery queryWithClassName:@"Player"];
  4. [lotsOfWins whereKey:@"wins" lessThan:[NSNumber numberWithInt:5]];
  5. PFQuery *query = [PFQuery orQueryWithSubqueries:[NSArray arrayWithObjects:fewWins,lotsOfWins,nil]];
你使用PFQuery可以将你上传到parse的数据拉回来,操作如上所示,非常简单。

parse服务分收费和免费,我感觉免费用户足够使用了,起码对于我这些开发者来说。

之前一直想弄一个push notification的,但是一直不想去弄服务器,现在有了parse,一切都可以迎刃而解了,parse网站上面,提供了push notification的一整套的方案,配置什么的,简直可以说就是一直按下一步的简单。

本人刚刚开始去了解这个后台,所以一些东西还是理解得比较表面的,如果大家还有更好的想法和建议的,欢迎和我交流。

2015-08-28 23:39:27 worldzhy 阅读数 1421
  • JSON基础入门实战讲解

    本课程主要讲解JSON数据格式的使用和实战;讲解JSON对象,JSON数组,JSON对象和数组的嵌套,JSON数据的修改和删除,字符串如何转JSON,JSON如何转字符串,函数JSON.parse,函数JSON.stringify,函数eval的使用,如何获取远程数据转JSON等

    421 人正在学习 去看看 黄菊华

最近的项目需要用到iOS的push功能,在配置push功能的过程中遇到了一些不清楚的地方,经过查阅资料和思考,已有初步认识,下面进行一下梳理,我们的服务器端用的是Facebook的Parse。


完整的push流程是这样的,服务器端将信息传递给APNS(Apple Push Notification Service),再由APNS将信息push到目标设备。


服务器——APNS   

服务器与APNS之间是通过SSL(Secure Sockets Layer)协议进行通信的,简单的原因应该是这样的,Apple的推送服务器肯定不能随便接受外界的push请求,只有经过它的认证才可以,于是我们的服务端程序需要有一个Apple授予的SSL证书。这个证书怎样获得呢?分几步:


1.生成SSL证书请求文件CertificateSigningRequest.certSigningRequest

  • 打开Keychain Access
  • 选择Keychain Access > Certificate Assistant > Request a Certificate From a Certificate Authority…
  • 填写Email

       



2.将SSL证书请求文件上传至 Apple Developer Member Center以取得真正的SSL证书,我们假设已经创建好了App ID

       


  • 向下滑动页面至 Push Notifications,在这里我们就可以创建即将配置在服务器上的SSL证书了,开发证书和发布证书申请的流程是一样的,我们这里以开发证书为例。 

                 


  • 在下一页点击Continue,我们将会被要求上传之前生成的Certificate Signing Request (CSR)文件,即CertificateSigningRequest.certSigningRequest。
  • 上传后点击Generate,至此SSL证书便生成出来了,我们需要将它下载到本地,本地便有了这样一个文件aps_development.cer。

3.将SSL证书配置在服务器端

虽然本地已经有了服务器端所需的SSL证书aps_development.cer,但是它并不能直接送给服务器端,还需要一点工序,如何加工请看下面的流程。

  • 双击SSL证书aps_development.cer,它将自动导入到Keychain中,注意观察双击前后Keychain Access中的变化。
  • Keychain Access的"My Certificates"分类中右击刚才导入SSL证书(名字是Apple Development iOS Push Services:App的Bundle ID),选择图中的Export。

    


  • 选择Export后会出现一个页面,以便我将证书以.p12格式导出,.p12是服务器端所需的文件,至少是Parse所需的。*注意*,一定确保上一步中我们选中了"My Certificates"分类,否则在这一步中.p12格式是disable的。终于得到了服务器端所要的“Apple签证”,按照服务器端的配置要求去配置吧,在Parse中只需将这个.p12文件上传就可以了。

        


至此,服务器端——APNS已打通,我们继续考虑APNS——设备之间的通信。



APNS——设备(设备将Push信息分发至App)


APNS怎么知道要将服务器端要将信息push给哪个设备或是哪一群设备呢?显然是服务器端将目标设备告诉了APNS,经了解,APNS要求服务器端以JSON(JavaScript Object Notation) 格式将目标设备的Device ID集合告诉它,然后它再将push信息发到相应设备上,push信息到了设备,设备再根据push信息内容把push信息指定到具体的App。于是,设备中安装的App也需要有一些能够验明正身的东西,这个东西肯定也是由Apple Developer Member Center提供的。


1. 创建Provisioning Profile


2. 配置App
  • provisioning profile下载到本地,双击,自动导入到Xcode。
  • 在Xcode中设置code signing。




到这里,App的验明正身工作已经做完了,服务器端——APNS——设备(准确的说是App)全部打通,剩下就是代码层面的工作了。最后总结一下Apple Push的配置,想要实现Server——APNS——App的Push通信,就要让APNS认识Server和App,于是需要两个物件,一个是给Server的SSL证书(最终形式为.p12),一个是给App的provisioning profile,这两个物件肯定都是要向Apple申请的,这便是上面一系列流程要达到的目的。


另外,再补充一点关于CertificateSigningRequest.certSigningRequest文件的事情,这个文件是我们向Apple申请证书的证书请求文件,在Keychain Access中可以随意生成,那么,每次制作证书都要生成一次吗?不是的,这个CertificateSigningRequest.certSigningRequest文件中可能只是包含一些Mac设备信息,时间戳等,在同一台Mac上生成的多个CertificateSigningRequest.certSigningRequest文件可能只是时间戳不同,其他是一样的,所以它只需生成一个,之后做各种SSL证书均可使用。



2013-01-04 17:50:14 quding0308 阅读数 8
  • JSON基础入门实战讲解

    本课程主要讲解JSON数据格式的使用和实战;讲解JSON对象,JSON数组,JSON对象和数组的嵌套,JSON数据的修改和删除,字符串如何转JSON,JSON如何转字符串,函数JSON.parse,函数JSON.stringify,函数eval的使用,如何获取远程数据转JSON等

    421 人正在学习 去看看 黄菊华

公司使用的是Parse服务,可以同时做IOS和Android的推送

Parse官网:https://www.parse.com/

 

证书配置:http://docs.jpush.cn/pages/viewpage.action?pageId=1343727

 

详细介绍:

http://www.cnblogs.com/gpwzw/archive/2012/03/31/Apple_Push_Notification_Services_Tutorial_Part_1-2.html

 

用来判断是否接收推送:

if([UIApplication sharedApplication].enabledRemoteNotificationTypes == UIRemoteNotificationTypeNone)

2016-07-27 14:42:11 woaiwangting 阅读数 731
  • JSON基础入门实战讲解

    本课程主要讲解JSON数据格式的使用和实战;讲解JSON对象,JSON数组,JSON对象和数组的嵌套,JSON数据的修改和删除,字符串如何转JSON,JSON如何转字符串,函数JSON.parse,函数JSON.stringify,函数eval的使用,如何获取远程数据转JSON等

    421 人正在学习 去看看 黄菊华
解析的基本概念:从事先规定好的格式中提取数据。
解析的前提:数据提供方按照格式提供数据,获取方从规定的格式中获取数据。

iOS常见的解析方式:XML解析和JOSN解析。
XML:Extensible Mark Language,可扩展标记语言,主流数据格式之一,可以用来存储和传输数据。
功能:
1.数据交换
2.内容管理
3.配置文件
XML数据结构的语法:
  • 声明式语法
  • 节点使用一对标签表示:开始标签和结束标签
  • 根节点是起始节点,只有一个,节点可以嵌套
  • 节点可以有值,存储在一对标签中

解析工具:
SAX解析:Simple API for XML:基于事件驱动的解析方式,逐行解析数据(采用协议回调机制)
初始化解析器:NSXMLParse,包含的方法
initWithContentsOfURL:通过NSURL创建解析器
initWithData:通过NSData创建解析器
setDelegate:设置解析器委托
parse:运行解析器

NSXMLParaDelegate:解析协议
parserDidStartDocument:报告解析开始
parser:didStartElement:namespaceURI:qualifiedName:attributes:发现开始标签的处理函数(即报告元素的开始及元素的属性)
parser:foundCharacters:处理标签包含的字符(报告标签包含的部分或全部内容)对于解析到数据需要使用全局属性接收数据
parser:didEndElement:namespaceURI:qualifiedName:attributes:发现结束标签的处理函数(即报告元素的结束,保存标签的各项数据)
parserDidElement:报告解析的结束
parser:parserErrorOccurred:报告不可恢复的解析错误

DOM解析:
DOM:Document Object Model(文档对象模型)
DOM方式解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意的XML节点,读取它的属性和值。
而且通常情况下,可以使用XPath,直接查询XML节点。

GDataXMLNode:
1.采用DOM解析方式
2.iOS中包含一个C语言的动态链接库libxml2.tbd,解析速度比NSXMLParse要快
3.GDataXMLNode是Google提供的开源XML解析类,对libxml2.tbd进行了Object-C进行了封装,能对中等或较小的XML文档进行读写操作且支持Path语法。

GDataXMLElement类的方法:
name:取标签名
attributeForName:取属性节点
stringValue:取标签间的值
rootElement:根节点

JSON(JavaScript Object Notation):
是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,易于阅读和编写,同时易于机器解析和生成。这些特性使JSON成为理想的数据交换格式。

JSON文件有两种结构:
对象:以{开始,以}结束
数组:以[开始,以]结束

JSON中的数据类型:字符串 数值 BOOL 数组 对象

功能:
数据交换
配置文件
存储内容

使用Foundation进行JSON解析
NSJSONSerialization里面包含了两个方法来通过不同数据形式解析JSON数据
1.JSONObjectWithData:options:error:使用缓冲区数据解析JSON
2.writeJSONObject:toStream:options:error:使用文件流的形式解析JSON

XML
优点:
1.格式统一,符合标准
2.容易与其他系统进行远程交互,数据共享比较方便

缺点:
1.XML文件格式庞大,格式复杂,传输占用带宽
2.服务器端和客户端都需要花费大量时间解析数据,不论是服务器端还是客户端都使代码变得异常复杂和难以维护
3.客户端不同浏览器之间解析XML方式不一致,需要重复编写很多代码
4.服务器端和客户端解析花费资源和时间

JSON
优点:
1.格式比较简单,易于读写,数据都是压缩的,占用带宽较小
2.易于解析这种语言
3.支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby等服务器端语言,便于服务器端的解析
4.因为JSON能够直接作为服务器端代码使用,大大简化了服务器端和客户端的代码量,但是完成的任务不变,易于维护

缺点:
1.没有像XML推广的深入人心和广泛使用,没有XML那么通用性
2.JSON格式目前在Web Server中还属于推广阶段

使用NSJSONSerialization的读取选项:
1.MutableContainers:让返回的JSON数据中的数组和字典是可更改的
2.AllowFragment:允许JSON返回的数据有多个根节点(允许你的JSON数据是一个字面值,比如字符串,数字等等)
3.MutableLeaves:使JSON返回的字符串是可更改的


2014-04-09 10:02:38 u011140147 阅读数 1151
  • JSON基础入门实战讲解

    本课程主要讲解JSON数据格式的使用和实战;讲解JSON对象,JSON数组,JSON对象和数组的嵌套,JSON数据的修改和删除,字符串如何转JSON,JSON如何转字符串,函数JSON.parse,函数JSON.stringify,函数eval的使用,如何获取远程数据转JSON等

    421 人正在学习 去看看 黄菊华
生成证书 
证书生成参考:https://parse.com/tutorials/ios-push-notifications 
会生成三个文件 
xxx.cer 
xxx.certSigningRequest 
xxx.p12 


用PHP做推送需要 
推送证书生成。 
生成pem步骤: 
1.下载下来你配置好的推送证书aps_developer_identity.cer 文件。 
2.转换 .cer 文件到 .pem 文件: 
openssl x509 -in aps_developer_identity.cer -inform der -out PushChatCert.pem 
3.在把你“钥匙”推送证书导出成的.p12到.pem文件: 
openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12 
Enter Import Password:  
MAC verified OK 
Enter PEM pass phrase:  
Verifying - Enter PEM pass phrase:  
4.合并两个pem文件:cat PushChatCert.pem PushChatKey.pem > ck.pem 
5.测试证书是否可用: 
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem 


****************客户端推送处理,以下在AppDelegate文添加**************** 
  //是否支持注册推送 
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    /*............... */ 
   //消息推送支持的类型 
    UIRemoteNotificationType types =(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert); 
    //注册消息推送 
    [[UIApplication sharedApplication]registerForRemoteNotificationTypes:types]; 



发送推送的思路:先获取手机的 deviceToken ,然后发送到我们的服务器 
 //获取DeviceToken成功 
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 

    NSLog(@"注册device token"); 
    NSLog(@"DeviceToken: {%@}",deviceToken); 
    //这里进行的操作,是将Device Token发送到服务端 
    NSString *tokenStr = [deviceToken description]; 
    NSString *pushToken = [[[tokenStr stringByReplacingOccurrencesOfString:@"<" withString:@""] 
                            stringByReplacingOccurrencesOfString:@">" withString:@""] 
                           stringByReplacingOccurrencesOfString:@" " withString:@""]; 


    //注册到我们的服务器 
    NSString *url = @"http://api.xxxxxxcom/index.php?r=site/saveIphoneDeviceToken&device_token=";
    url = [url stringByAppendingFormat:@"%@", pushToken]; 
    [[AFOSCClient sharedClient]getPath:url parameters:Nil 
                                success:^(AFHTTPRequestOperation *operation, id responseObject) { 
                                    NSLog(@"注册成功"); 
                               } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
                                   NSLog(@"注册失败"); 
                               }]; 



然后是处理接收推送消息 
 //注册消息推送失败 
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 

    NSLog(@"注册消息推送失败"); 
    NSLog(@"Register Remote Notifications error:{%@}",[error localizedDescription]); 



//处理收到的消息推送 
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

//    NSLog(@"Receive remote notification : %@",userInfo); 
//    NSLog(@"%@",[userInfo objectForKey:@"aps"]); 
    NSDictionary *aps = [userInfo objectForKey:@"aps"]; 
//    NSLog(@"%@",[aps objectForKey:@"alert"]); 
    NSString *msg = [aps objectForKey:@"alert"]; 
//    NSLog(@"%@",[userInfo objectForKey:@"alert"]); 
    UIAlertView *alert = 
    [[UIAlertView alloc] initWithTitle:@"温馨提示" 
                               message:msg 
                              delegate:nil 
                     cancelButtonTitle:@"确定" 
                     otherButtonTitles:nil]; 
    [alert show]; 
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;//把badge设置为0 

//或者用下面的代码:

NSString* nsalert = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];

if(nsalert && [nsalert length] > 0)

{

        UIAlertView *pAlert = [[UIAlertView alloc] initWithTitle:@"消息提示"

                                                         message:nsalert

                                                        delegate:self

                                               cancelButtonTitle:@"详细"

                                               otherButtonTitles:@"关闭", nil];

        [pAlert show];

        [pAlert release];

}

CFShow([userInfo description]);

//接收到push  打开程序以后设置badge的值

NSString *badgeStr = [[userInfo objectForKey:@"aps"] objectForKey:@"badge"];

if (badgeStr != nil)

[UIApplication sharedApplication].applicationIconBadgeNumber = [badgeStr intValue];

//接收到push  打开程序以后会震动

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);






****************服务器端push.php**************** 


<?php 
//手机注册应用返回唯一的deviceToken 
$deviceToken = 'eb87b209 6395a040 a1cf85e5 15b6e972 20ec883f 6b3ac80f 02b92a1a 58cf273e'; 
//ck.pem通关密码 
$pass = '13!@#23';    
//消息内容 
$message = '这是一条推送测试通知1'.time(); 
//badge我也不知是什么 
//$badge = 1; 
//sound我也不知是什么(或许是推送消息到手机时的提示音) 
$sound = 'Duck.wav'; 
//建设的通知有效载荷(即通知包含的一些信息) 
$body = array(); 
$body['aps'] = array('alert' => $message); 
//if ($badge) 
//  $body['aps']['badge'] = $badge; 
if ($sound) 
  $body['aps']['sound'] = $sound; 
//把数组数据转换为json数据 
$payload = json_encode($body); 
echo strlen($payload),"\r\n"; 


//下边的写法就是死写法了,一般不需要修改, 
//唯一要修改的就是:ssl://gateway.sandbox.push.apple.com:2195这个是沙盒测试地址,ssl://gateway.push.apple.com:2195正式发布地址 
$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', dirname(__FILE__) . '\\' . 'dev_ck.pem');   
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); 
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 
if (!$fp) { 
    print "Failed to connect $err $errstr\n"; 
    return; 

else { 
   print "Connection OK\n<br/>"; 

// send message 
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload; 
print "Sending message :" . $payload . "\n";   
fwrite($fp, $msg); 
fclose($fp); 
?> 


php服务端如果出问题,请检查是否开通ssl模块 
Apache需要开启ssl模块,通过查看Apache的官方文档得知,使用ssl需要Apache开启三个支持模块分别是: 
mod_include 
mod_cgi 
mod_expires 
*注意:ios 的推送消息有256个字符长度限制;超出范围不能发送 

iOS 推送小结

阅读数 273

IOS推送

阅读数 2339

没有更多推荐了,返回首页