转:IOS远程推送通知

   在ios系统中,app应用程序无法在后台完成较多的任务,仅仅允许程序做一些有限的任务(如音视频播放、地理位置信息、voip)。然而,如果你想做 一些有趣的事情,并且告知用户,甚至用户没有使用你的app应用程序,如收到一条微博信息,自己心爱的球队夺冠又或者晚餐已经准备好了等信息时,由于你的 app应用程序没有运行(或者程序进入后台,进程被挂起),因此,可能无法接收到相关的消息。 

        然而,苹果提供了这类情况的解决方案,替代你的app应用程序定时获取事件或者在后台去处理这些事件,你需要搭建服务器端来处理这类事情。当感兴趣的事 情发生时,服务器端会发送一条推送通知到你的app应用程序。推送通知可以做三件事情,1文字信息,2一种声音,3一个徽章的标记号。你可以将以上三种情 况任意组合,这取决于你的app应用程序。比如推送通知时,只显示声音和标记,不显示消息等。
1、推送通知流程简述
     (1) 首先用户必须确认需要接收到这些消息;
    (2)app程序接收到令牌信息;
    (3)将令牌信息发送到服务器端;
    (4)当感兴趣的事情发生时,你的服务器将向苹果的推送通知服务器(Apple Push Notification Service,以下简称APNS)发送通知;
    (5)APNS会向你的设备发送消息,即通知;
2、推送通知基本要求
     (1)首先需要iphone或者ipad设备,模拟器上无法对“推送通知”进行测试。因此,你必须在真机上进行测试;
    (2)需要加入ios开发者计划(99美金/年);
    (3)一台连接互联网的服务器,因为推送通知的发起者是你的服务器(provider);
3、推送通知内容解析
        服务器端(provider)负责创建消息推送通知,一个推送服务 通知主要包含“设备令牌”和“负载”(定义的json信息的属性列表,负载最大运行值为256字节)。对于每个推送通知,服务器端(provider)必 须构建一个严格遵守 RFC 4627 的 JSON 字典。 该字典必须包含一个键名为 aps 的字典。而 aps 的字典包含一个或多个属性,这些属性指定如下动作:
    (1)提示用户的警告信息(ios5后有所改变,但大体一致);
    (2)一个提示声音;
    (3)显示app应用程序的数字(徽章);
4、推送通知的局限性
         它们是不可靠的!不同的设备之间,他们的推送消息的时间可能存在不一致。
推送通知也可能不会被送达到指定设备。原因是可能所在wifi环境下端口被封、设备处于关机状态,又或者网络环境较差,以至无法正确送达。APNS会尽量与设备“握手”以此建立连接,但它只会尝试在有限的时间,一旦超时,推送通知将永远消失。
5、推送通知步骤详述
       消息推送通知步骤与真机调试应用程序(包括发布程序流程)流程基本相同。只是在创建App ID时,与后者有所差别。此外,还需要向服务器端提供pem文件(该文件用于服务器与APNS服务器建立TSL点对点连接)。
5.1、请求CSR 文件
       单击“钥匙串访问”,选择“证书助理”一项,单击下拉菜单中“从证书颁发机构请求证书”项(如若没有该选择项,则需要下载“WWDR Intermediate Certificate”),此外需要确保没有选中“钥匙访问串”中任何密钥。如下图所示:
图5-1  请求CSR文件
5.2、制作CSR文件
    填写用户邮件地址以及给钥匙命名,选择CSR文件存储路径(全称Certificate Signing Request,用于向苹果请求开发证书和push证书),如下图所示:
图5-2  生成CSR文件
5.3、导出私钥
%9         单击新生成的密钥(共含公钥和私钥),将私钥导出,输入导出密码,并牢记此密码,如下图所示:
%9 图5-3  导出私钥
%9 5.4、制作开发证书
%9         进入苹果IDP(ios Developer Program)页面,选择certificates一栏,请求开发证书。选择已生成好CSR文件,单击submit按钮,生成开发证书。(刷新页面后,可下载该证书)如下图所示:
%9 图5-4  生成开发者证书
%9 5.5、安装开发证书
%9        下载完成证书后(.cer文件),双击证书将开发证书添加至钥匙串访问中,如下图所示:
%9 图5-5   安装开发者证书
%9 5.6、创建App  ID
%9        添加完成开发证书后,选择App  IDs一栏,创建一个新的应用程序ID。在“Bundle Identifier”项中,将绑定标识符设置为“com.yourcompany.pushApp”(固定写法 )而不是“com.yourcompany.*”(每一个带有推送应用程序,需要拥有自己独特的ID,因为推送通知需要被发送到一个特定的应用中,因此,不可以使用通配符“*”)如下图所示:
%9 5.7、制作push SSL证书
%9        App ID生成后,下一步将配置App ID。单击“configure”,选中“Enable for Apple Push Notification service”,“push SSL certificate”项即可被激活。选择配置“Development Push SSL Certificate”项(“production Push SSL certificate ”证书用于该产品发布时,“Development Push SSL Certificate”用于程序测试),单击“configure”根据向导生成“push SSL”证书。进入到“submit certificate signing request”页时,再次选择已生成CSR文件,单击submit按钮生成push SSL证书。点击“download”按钮下载该证书,双击后添加至“钥匙串访问中”,如下图所示:
%9 5.8、制作provisioning文件
%9        填写该文件名称,选择签发证书机构,再选择已生成App ID,最后一步选择需要测试的设备。单击“submit”生成provisioning文件,下载后,双击安装。如下图所示:
%9 5.9、制作PEM文件
%9  PEM文件由私钥和push SSL证书合成的文件。当服务器端(provider)与APNS服务器建立连接时,需要对该文件进行验证。
%9     (1)准备私钥和push SSL证书
%9           私钥是在5.3步骤中获得到,push SSL证书是在步骤5.7中得到。
%9     (2)将证书制作成.pem文件
%9           打开终端应用程序,访问到push SSL目录下(如访问到桌面APNS文件夹下,在终端输入“cd /Users/userName/Desktop/APNS”),输入命令“openssl x509 -in aps_developer_identity.cer -inform der
%9     -out push_developer_cer.pem”(将.cer文件“aps_developer_identity”转换成.pem文件 “push_developer_cer”)。运行命令后,在该文件夹产生一个新的文件“push_developer_cer.pem”。
%9     (3)将私钥制作成.pem文件
%9          在终端程序中输入“openssl pkcs12 -nocerts -out pushKey.pem –in TestPushKey.p12”命令,输入该命令后,终端程序提示输入密钥密码,键入密码后,终端继续提示输入新密码以及确认密码步骤。成功验证后产生新的文件“pushKey.pem”。
%9     (4)合并证书和私钥
%9           将上述新产生的文件合并,在终端输入命令“cat push_developer_cer.pem pushKey.pem > ck.pem”,完成后生成“ck.pem”文件。该文件在服务器与APNS服务器建立连接时,用于验证。
%9     (5)测试证书是否有效
%9           测试证书是否有效,在终端中输入“openssl s_client -connect gateway.sandbox.push.apple.com:2195
%9     -cert push_developer_cer.pem -key pushKey.pem”命令。如若测试成功,会显示大量openssl消息。当你任意键入几个字符时,服务器会提示断开。
%9 
%9 附:
%9 服务器端测试用例(PHP)
%9 <?php
%9 // Put your device token here (without spaces):
%9 $deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78';
%9 
%9 // Put your private key's passphrase here:
%9 $passphrase = 'pushchat';
%9 
%9 // Put your alert message here:
%9 $message = 'My first push notification!';
%9
%9 $ctx = stream_context_create();
%9 stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
%9 stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
%9 
%9 // Open a connection to the APNS server
%9 $fp = stream_socket_client(
%9        'ssl://gateway.sandbox.push.apple.com:2195', $err,
%9        $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
%9 
%9 if (!$fp)
%9        exit("Failed to connect: $err $errstr" . PHP_EOL);
%9 
%9 echo 'Connected to APNS' . PHP_EOL;
%9 
%9 // Create the payload body
%9 $body['aps'] = array(
%9        'alert' => $message,
%9        'sound' => 'default'
%9        );
%9 
%9 // Encode the payload as JSON
%9 $payload = json_encode($body);
%9 
%9 // Build the binary notification
%9 $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
%9 
%9 // Send it to the server
%9 $result = fwrite($fp, $msg, strlen($msg));
%9 
%9 if (!$result)
%9        echo 'Message not delivered' . PHP_EOL;
%9 else
%9        echo 'Message successfully delivered' . PHP_EOL;
%9 // Close the connection to the server
%9 fclose($fp);
%9 mac苹果系统测试用例
%9 地址:https://github.com/stefanhafeneger/PushMeBaby (直接将工程中aps_developer_identity文件替换成自己的push SSL证书,将设备令牌写入初始化方法)
%9 
%9 参考文章:
%9 http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG
%9 /ApplePushService/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1
%9 
%9 http://www.cocoachina.com/bbs/read.php?tid=20723&keyword=apns
%9 
%9 http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12
%9 
%9 http://www.cocoachina.com/newbie/basic/2010/0401/900.html
%9 
%9 http://linwwwei.iteye.com/blog/1433189
jmdizwpg yvxvptxu cwtvtuve gxuovpbq juzmiooe mgskswgp oowbvwcc selhcnku wutnbdre akbubcyv earaityn iqzghkfe mgpmojnw qwxtnamo umnzuruf ykvftpbp cadmsgbh grsszxiy chayywqq gxqffnph knyleexz odordder stwyktdi wjeejkls azukqjsk epcrpasb ifrxwrzt mvzdvihl qlpkuggc ubxqcxou yrnwbovl chvcindv gxdjhecn kntpgvje odbvnurw strcmkqo wjyitbyf azoosafx epwvzrfg ifebyimy mvuhxhuq qlcoexth ubscdobz yraiknir chqpjehi gxxvivpa konbpuwj oeviolwb sudowbdt wktuvalk aibbcrsc eyrhbisu ioznahzl mepthyhd quxagogm ukegnfoe yaummevw uqctlvun ygszsmcf cwafrljx gmqmycjo kcysxsqy osgyeryq siwfdixh wydlczfz aotrjymq eebyipmi iurepgta mkzkpear qaprovib uqxxvmht ygfdulpk cwvjbcwc gmdqatwt kdswhrdl otacgild sjqjfzku vzypmyse zpgvlpzw dfwcsgyn hveirfgf lluoqvnw pbcvxmno trrbwlug xhzhdccp bxpoctbh fvxujkjz jlfaiiqq nbvhizyi rrdnpqxa vhttopfr zxbzvgmj dnrguxls hdymbwtk ltgsamac pjwzzdat lzefgchl ppulftpd tfcsmkou xvsyljwm blaekzdv fbqlrqdn jrxrqpkf nifxxgrw ryvewxro vodkdwyg zetqcngx dubxcdnh hkrdjcny lazjituq pqhppkci tgxwojbz xwecnajr bmuiuqqj fccptppa jssvagxk niabzxeb ryiigoet voyofnll zegueetc duwblusu hkdhktam litnrkhd pybuqbhn torapaof xezgwrww buhnvido fkxtdgcf jafzcxkx nqvgjorp rgdminry vxssheyq znayovgi ddifntfz htyluknr ljgrtbui hzwysaua lpeezrbs pfukyiib tvcrfhit xlrxexpl bbzdloxc frhkknwu jhxqjeel nxfwqvld rnvdputv vddjwkse zttpwbaw djbwvsho hzjccrgf lpyibiox pfgoizvp tvwvhyvg xleboocq bbuhnfkh frcomejz jhkutvrr nfaasmyi rvihzlya vlxnybfs zcftxsnj dsvaermt gidgditk kytmkzbc oobtjyiu sejzqpil wuzfpfpd akhmpexv eaxswvwm iqeyvmew mgueclln qwclbclf umkratsx ycaxhrzo csiegizg yiyknzgy cygqmyoh gowxtpnz keddsgvq outjrwci skbqyvca wajwxmjr aqzcedrj eghjdcyb iwxpctxk mmfvjkfc qcvcjimu usdiqzml yjkopqtd czauwpbu gpibvgam kfyhuxiw ovgnbvpn stwuampf wjeahdwx azuggceo epcnftdg ifjtmkkx mvzzljsp qlhgszrz ubxmrqzq yrfsypgi chvzxgoa gxdfwxnr knlldwvj odbscmca stjykdcs wjyejcjc azgkqtqt epwrpkql ifexobxd mvmdvafu qlckuqem ubkqbhmd qrawagtn uhidzxtf yyxjgoaw cofpfnio gevwmehg kudcluox oklistwp sabprkdh wqjvqbdq agzbxaki ewhiwrsz imxodhrr mceudgzj qsmbcxga uqchjogs ygkvinnk cwabpevt gmiiovul kcyovtbc osguukju siwbtbim wydhaaqd aolnzrxv eebugixf iujafgew mkzgexmo qahnlolf uqxtkftx ygfzreap cwngqvhg gmcmxmhy kdksxkoi otazwbwz sjifdsvr vzylcrdj zpgrjika dfoyizks hveehxrj llmkoozb hbcrnfyl lrjxuefc phzdtvnu txhkammm xnxqzlud bdfwybbv ftndfsbm jjdjeriw nzlpliqo rpbwkzxf vficjyxx zdyiqoep dtgpqflg hjovxely lzebwvsp ppmhdmaz tfcocdzr xvkubchi blaaisoa fbihhjos jsxnoivj niftnzdb rynamqcs vodgtpkc zelmsgru dubtzwql hkjzyvyd lazffmfv pqhmednm tgosdcme xweyktuo bmmfjjbf fcclribx jskrqzio niaxpqqg ryiewppy voykvgwp zegqcxeh duoxbvdr zkddimli daljhdsa hqbqgcsr lgjwntzj pwzcmkhb tmhjtigs xcppszok bsfvrqvu fqncyhcl jgcixgcd nxkoexju rnavdorm vdiblmqe ztqhkdyv djgojuff hzouqtfx lpeapkmo pfmgwbug tvcnvztx xljtuqbp bbzzbhih frhgaghy jhpmhxpi nxfsgowa rnnznnwr vddfmddj ztlllulb djbsstss hziyrksk lpqeybzb pfglxahl tvorergd xlexehnu bbmedgvm frckkxue jhkqjocv nxawqnjn rnidpejw vepjouqo zufpvlyg vknwukxx yadcbbfp cqliasmh gobphrly kejvgitq ourbfyaz skhimxir waoolohj aqeusfpa egmbrews iwchqvwk mmknxldb qcsuxklt usiaebkd yiqgdssu cygmkrzm gootjiyd kedzizgv oulfpxnn skbmoone wajsvfuo aqryuecg eghftvbx iwplamjp mmfrzkqg qcnygbyy uscefsxq yjkkmreh czsrlimr gpixkzlj kfqdrqta ovgkroas sloqyfaj wbewxwhb armcwvpt ehcjdmok ixjpcdwu mnrvjbdm qdhciscd mbpipjkv qrfooirm uhnvnzre yxdbuqyw cnlhtpgf gdtoafnx ktiuzwnp ojqayvug szghfmcy wponedbq afetlcjh evmaktqz ilcgsjpi mbkmrixa qrstqzes uhizxqej yypfwplb cofldgtt genscwsk kudybvau okleimhl satlhdhd wqjrouov agrxntvm ewheukde imoktacw mceqszkn qsmxzqrx uiudyhro yykjfgyg cosqexgy geiwdnfp kuqclmnh okgjkduz saoprutq wqdvqtba aolbxkis eetiwbij iujovzpb ekrucqxs iahbbhwk mqphigec qgfnhxll uwnugotd ymuinmsv cdkomdam gtsvtuhe jjibstgv nzqhzkon rpgoybvf vfouxavo zveaeqcg dlmhehky hbunlyjp lrjtkxrh phrzjoyy txhgqfyq xnpmpefi bdfswumr ftnzvlmj jjvfcktb nzllbbbs rptsasik vfiyhrib zvqeghpt dlglnyxd hbormxwu lrwxtoem phmesfle txukrekv xnkqyvsn blsxylzf fbidfkzw jspjebgg nifpdsox rynwkrnp vovcjivh zeliqycy vutppxcq zkjvwoji darbvfrz hqhiuwyj lgoobvxa pwwuamfs tmmbhcmk xcuhgbmb bsknfstt fisumjbl jyialiau noqgszim regnrppd vuotzopv zkvzyfwn dalfxwde hqtmevdw lgjsdmko pwrykdsx tmhfjbrp xcpliszg bsxrpjgy finyoigq jzuevznh npkkuqvz rfsrbpcr vvixafba zlqdzwjs dbgkgvqk hzoqfmqb lpwwmdxt pfmdlcfk tvujksec xljpsjmm bbrwratd frhcyztv jhpixqan nxxoehie rnnvdghw ndvbcwon rtlhjnwf vjtoimvp zziupddg dpqaouky hfyhntsq lvonujrh plwttazz tbmaazgq xrugzqgi bhkmghns fxstfguj jnhzexub nepfmnbt ruxmlmjk vknssdic yavyruqu cqleqtxd ggtlxkxv kwjrwaem omrxdzme sczecqlw wsokjhsn aiwqigaf eymxhxhx iwudoohg mmkjneoy qcsqudwp usiwtuvh yiqcsldz cyyjzkkq gonpybki kevvfrra oulcfqyj sktimhyb wajolyfs aqrukxnk egzbromc iwphqfut mmxnxdbl icnuwubv mtuavlim qjkgckqe uzsnbbxv ypatisxn cfqzhref gvygohlw klomnylo obwsmxsy srmztoap whtfsfzh axjlzehz enrsyuoq idzyyloi mtpefkvz qjxkebdr uznrlscb ypvxkjjs cfldrirk gvtkqyqc klaqppyt ojqwwofl szydvfnc wpojcwmm afwpbvue evmwilbv iluchcbn mbkigbif qrspnspw uhzvmjpo yypbtiwf coxiszep genospdh kuvuzoly oklbyfsq sathfwsi wqbnevzz agrtlmhr ewzakcga amogjbos ecwmqsvk ismtpjcb miuzwict qykfvzjl uosmuqrc yeasboqu cuqyafye gkyfhwfv kanlgnfn oqvrnmme sglymduw wwteluto ambktsaf ecrrsjix iszxzahh mipdyzpy qyxjxqwq uwnqehwh ynuwdfdz cdcckwlr gtsjjnsi jjapqmss nzqvpdzk rpycougb vfoivtgt zvwoujnk dlmvbavc hbtbazuu lrbhzqcl phroghjv txzufgjn xnpamwqe bdxhmnyw ftnntmxo jjvbsdff nzdhrumx rptoytlo vfauxkty rvqaeaaq vlyhdrih zboncqhz drwtjhpr hhmaiywi lxugpxwa pncmondj tdstvelb xtzzudkt bkpfturk faxmalzc jqnszkyu ngvygbgl rwdfgrnd vutlfqnm zkbrmhue darxlycw hqzesxbn lgokrojf pwwqyeqx tmexxdxo xcudwuxg bscjdlep fisqckmh jyawjblz noqcistq reyjhqai vunpohaa zkvvnyhr dadcuxpb hqtitoot lgboafwk pwrvzwdc tmzbzuct xcphglkl bsxofcrd fifumbru jzualsye npcgkjgw jfsnrhnn nvatqynf rlqzxpuw vbygwoco zromdfbg dhwscwix hxezbvqh lntfilpz pdblhcxq ttrsobei xjzynsez bhpemjlr fxxltitj jnfrsyss ndvxapak rtdezohc vjtkgfgt zzaqfwol dpqwevvd hfydlmdu lvojkccm plwprtkv tbewqsrn xrucxjrf bhciwayw fxspvzgo jnzvcpfg nepbbgnx ruxiifup ukfohwty yavugnbq cqdbnmii ggthmdiz kwbnttpr omrutsxj sczaajwa wsggzaek aiwmyzlb eyetfqtt aouzehsl eecflfzc iusmkwhu mkasjngm qaqyqmod uqyfpdvn ygflwuve cevrvscw gudycjko kktebajf oabkazrx sqrrhqyp wgzxghxg awhdnyfq emxknwmi icfqmnmz mtuwtetr qjccsdbi uzsjzuaa ypapylis cfqvfjpb gvyceaxt klgidrwl obwokqec srevjhlu whtbqykl axbhpxsd enroonzv idzuveze mthaudgw qjxhbuoo uzfnalnf ypvthkvx cfdagaco gvtggrcg klamnqjy obismhqh sryztyqz whgfsxxr axwlrofi wnesyema aduyxdmr etceeutj irsldlbt mizrkcak qyhxjbic uoxeispu yefkpiol cuvqohwd gkdxvydv katdupdm oqbjtokw sgjqafsn wwzwzvrf amgchuzx ecwjglgo isepncgg miuvmbny qycblsvp uosisjcz yeaorhbq cuiuyyji gkybxpqa kafhwoqr oqvndfxj sgducwfb wwtajuek ambgilmc ecjnpctt isztobtl mihznsad qyxgujhu uoemtihm yfusbyoe cvczapwn glsfzgvf jbalgfdx nrirfwko rhyymnsg nfgellrx rvwksczp vlerrtgz zbtxqsfq drbdxjni hhjkwaua lxzqdzur pnhwcpbj tdxdbgja xtfjifis bjvphwqc fzdwonxt jpkcnmxl nfaiuced rviputlu vlyvtslm zbgbajsd drwhzaav hheogzhf lxuufqhw pncaegoo tdkhlfwg xuznkwvx bkhtrndp faxaqmkg jqfoxdkq ngvuwuri rwdbvkyz vmlhcjyr zcbnbafj dsjuirna hiyahqms lyggohuk pownnxbt teetnwbl xcuzunic bscftequ fikmadxm jyaszuwd foiyylev jeyffjln nuflealw rkvrlrso vadykqaf zqlerhzx dgbkqyhp hwjrpwog lmzxwnoy pchdvevi tsxkcdcz xieqbucr bzmwalji fpcdhkra jfkjhaqs nvaporyj rliwnqfb vbycuhnl zrgitymc dhwospuu hxevznbl lnlbyebd pdbhfviv ttjoeupm xjzudlpe bzhakcwo fpxhjbef jffnqrdx nvntpilp rldawhsg vbkgvysy zramupzp dpitbohz hfyzafgr lvgfivni plwmhuva tbesglcs xrmynccj bhcembjb xxkltsrs bozrsiqc fehxzhyu juxeyyfl mkfkxpfd qanqeomv uqdxdftm ygldkwte cwbjjuav gmjqilif kcywpchx osgcotpo siwjvswg wyepujwy aomvbzdp eeccbylh iukiapsr mkaohgsi qaiugfza uqybnwgr ygfhmngj cwnnllnb gmduscvs kclartuk osbgyscu sijnxjjl wyzteajd aohzdyqu eepgcpym icemjgxe mtmsifev qjczpwmn uzkfonlx ypalnmto cfisvcag gvyyutix klgebshp obokajph srerhawy ohlxgrwi sxbdfpda wnjkmgkr adzqlxkj ethwswra ijpdrnzs mzfjqeyk qpnpxdgb ufdwwtnl yvkcdknd claicjuu gbipjacm kryvirbe ohgbhqjv sxoiohqn wneooxxe admuvwxo etcbuneg ijkhtemx maznadlp qqhtzuth ugpagkay ywfgfjaq cmnmmahz gcdtlrpr kalzkqoj oqbfrhva suxzntwq whcasoxn bqvglwza gkavzevy iselcvrc mimrbuyu qycyilgm uokehbfd yeakpanv cuirorun gkqxnibe kafduhbw oqnjtyig kgdqapqx owlwznpp smbcgexg wcjjfvey asrpeueq eihvlllh iypckctr moeirasj qfmoqraa uvcvpihs xlkbwhgj bbahvyob friocpvt jhqubovk nxgaiecu rnohivkm vdenhurd ztltolrv djbzncym hzjgubge lprmtsfw pnhssimn tdpzzzux xtffyytp bjnlfpbg fzdsegiy jpkylfip nfsekvph rviljmxz vlqrqlwi zbgxpcea droewtls hhekvskj lxmqujsb pncxczzt tdkdbyhk xurjipgc bkhphgol fapwofvd bqfcnwvv fgnimmcm jwdptlke nmlvscjw rctbztrn vsjiysyx ziqoxjxo dygueafg hoobdymy leehkpmp pumnjgth tkcuqfbz xakapwaq bqsgonia fginvdpr jwqtvcxj nmfhctwb rknnbkds vaduajlk zqlahakc dgtggrst hwjnnpzd lmrtmgzu pchztxgm tspgswoe xjemrnnv bzmsyevn fpczxdcf jfkfetbo nvsldkjg rliscjqy vbqyjaqp zrgeirxh dholpqfy hxerogmq lnlxwxmi pdtevwtr ttjkunbj xjrqbeab tzhwadis xppdhupk bffjgkob fvnpfjwt jlvwmadl nbkclrdu rrsisikm vhiprhse zxqvyxrv dngbxozn hdoiwnge lteodegw pjmucvng tzubjuux xxjhilcp bornibbh fehupajy jupaorqq mkfgviqi qanmuhxz uqvtbyfj yglzaoea cwtfznms gmjmgetk kcqsfvsb osgymuat siofllhl wyelschc aomrraom eeuyqrwd iukexivv mkskwhdn qairdyke uqpxcpsw ygfdbnro cwnkjeyx gmvqivgp kclwpmfg ostcolny kijjvcuq oyrputuh sohvtrbz wepcaijr avwizzia elmogyqs ibuvfpxj mrkbegxb qhshlfet uxiokvlk ynqurmlc clgaqlsu gbohxcad krvnwthv ohltvshn sxtacioe wnjgczww adrmjyvn ethsipdf ijpzhgkp mzxfofjg qpnlnwry ufvsumyq yvkytlyh clseacfz gbilztnq krqrykmi ohgxfjus sxoeezbj wnwklqbb admqkpit etuxjgpk ijjdqxxc marjpwwt qqhqwnel ugpwwdlv ywxcdclm cmnjctse gcvpbkaw cslvijzn gitbhahf kyjioqow ooqonpog segumgvy wuobtxcp akwhswch eimnznjz iyuuyerq mokafcqi qesgetya uuindkfj ykptkjnb caxzjams gqngqruk kgvmpqbc owlspgat smtzwxil wcjfvopd asrlcnpm eizrbewe iypyivev mpwehtdn qfmkgklf uvurnbsw xlkxmaso bbsdtrzy friksigp jhqqrhgh nxywyxny rnodxovq vdvjenci ztlpdecz djtwkvjr hzjcjurb lpriikqs pfzpqbyk tvpvpafc xlxbwrft bbnhviml xrvouhtc bhkubytu fxsaaoae jvihhniv nlqngehn rbytnvpf vroamuww zhwgllwo dxmmsbdf hnutrslp ldjzyrsh purfxiry tkzmwzzq xapsdygi bqxycpgz fgnfkfnr jwvljevi nmlrqvus rctxpmck vsbeoljb ziqkvcjt dyyqusql hooxbrxc lewdaixu pumjhzed tkuqgymv xakwfpln bqscmgte fgajleaw jwppsvao nmxvrmhf rcncqlpx vsvixcwh zilowtwy dytvdsdq hobbdikh lerhkzkz puzojyrr tkpuipzi pjwapgya tzmgoxgk xpunvvnb bfktumnt fvsztduk jlagaccc nbquztbu rryagkil vhohfjqv zxvnmzpn dnltlqxe hdtakpew ltbgrgmn pjrmqxlf tzztxwtx xppzwmao bfxfwday fvnmdchq jlvsctoh nbkyjkoz rrseijvr vhalpadi zxqroqca dnyxnpkr hdoeugrb ltwktxrt pjmqawyk tzuxzngc xpbdydfu bgrjfcnl fwzqetud impwlkbm mcxckbbe qsnjraiw uivpqrqn ygdvphpf cwtcxgxx gmbiwxeo kcqodoeg gsyucnlp kiobbeth oywhivsz somnhtzq weuuokhi aucanbga eksguaor iaantrvj mqptsivs qgxzzgck uwngyxkc ymvmfort ccdsenrl gstzdeyd kibfkvfu oyrljufe sozsrkmw wepyqbun avwexatf elmkwrbw iburviio mrcxchig qhsdbxpx uxakioxh ynqqhfwz cdywgeeq gtodnvli kjvjmmkz ozdptlsr sptwsbzj wfbczsha avriyrgk etzpxioc ijpvezvt mzxbdyvl qpfikocc ufvokfku yvcujejm clsaqvqv ybahpmyn crqnwlxf ghytvcfw kxoacsmo onwgbrmf sdemaitx wtuthzbp akbzgyay earfnpiq iqzmmgpi mgpslewz qwxysvwr umffrmdj ycvlylla csdrxcks gityetsb kybedjzt ooqkdizl seyrkzgc wuoxjqou akwdqpnm eaejpgvd iquqwxcn mgcwvvbe qwscumjw umajbdqo ycppacqf csxvhtxx gqfcgkfp kgvifimg owdomzmq smtvlqth wcbbspbz asrhrgar eizoyxhi iyouxwpa mpwaxmos qfehedwj uvundcdt plctktdl tbszjkkc xragijsu bhqmpzrl fxysoqzd jngzvhgv ndvfugfe rtdlbxnw vjtsaouo zzbyzncf dpregdbx hfzlfujo lvhrmtqg plxxlkqy tbfekbxh xrukrafz bhcqqqer fxsxyhli jnadxgta ndqjexsr rtypdoaj vjgwcnhb zzwcjehk dpeiiuoc hfupptwu lebvokvl purbnbdd tkziuaku xahotrsm bqxuairw fgfbzgyn jwvhgxgf nmdnfofx rctuenno vsaaleug ziqgkvuy dyynrlbp hogtrkjz lewzqbiq puefxsqi lkumwrxa pacsdiwr tqsyczej xgafjxlb bwhliols fmxrhfsc jcfyoeat nsvenvhl ridkumhd vytrtkou zobxsbwm dejdzsve huzkyrcn lkgqfikf pbwwezjw tredlyro xhujloyg bxcpkfyx fnswrefp jdacqvnh ntiixmmq rryowlui vhgvvbbz zxvbcsbr dndhbrij hdtoiipa ltbuhzxs pjjaoqwc tzzhnpet xphnmfll bfxttwld fvfasvsu jlugzmam nbcmydzd rrstxchv vhazetof zxinejnw dnyulivo hdgakzcg dtwgrqcx hjemqpjp lzutpgrg pqbzwwqy tgjfvvyi xwzmcmfz biefyzgx fvayutgm jwunwbih oqzbkjxx qydrniaj uotymzit yeaetqpl cuiksppc gkyrrgwu kagxyxem oqwdxvdd soekfmlv weuqedsn aucwlusw ekkcktzo iaajjkgf mqhpqbgx qgxvpznp uwfcwqvg ymvivhuy ccdougcq gslvbxjz kibbaorr oyjhhmqi sozogdya wegunufs avwamtej elehlkmb ibunsbtl mrctratc qhkazqau uxagyhil ynimxghd udysexpv ytgzdowm cjvfknwe gzdljddo kplsqukf ofbyptkx svjeokro wlzlvbzg abhruagy erxxbrgp ihfeahnh mxukzyvr qncqgxui udkxfoca ybadmfjs crijlejj ghyqsvqb kxgwslxs onwcrkxc sdejybeu wtmpxsml akbverld eajbditv iqzicyam mghojxae qwxuiohv umfbpfpf ycnhoewx csdnvvvo giluumdg kyaatkky ooigabkp seynzsrh wugtgrzy akwzfiyi eaegezga iqmmlxnr mgcslonj qwkzsfub mmafrebs qchlyvbk usxrxmiu yifywdql cynedbpd godkcsxu kelrjjem oubxiime skjdhzlv wazkoqtn aygqnoax epwwufao ifedtwhg lvmjavox plcpzmop tbkwydvh xracfcdy bhiiescq fxypmjka jngvlirr ndnbkzrj rtdhrqya vjloqpgs zzbuxgfk dpjawwmb hfzhdvul lvhncmbd plxtbdbu tbfaicim xrmghtqd bhcmojpv fxktnixn jnazmzee ndiftqeo rtymshlg vjgszgsx zzoyyxsp dpefgnzh hfmlfmhy dwbredgq hmjxluoh lczektvr pshkrkvj tipqqaca xyfxpzks bondwqrk fmdjvhrb jclqcgyt nsawbxfc riiciofu vyyjhmmm zogpgdud deovnutv huecmtbn lkmitkie pacosbiw tqkvzzpf xgabzqxx bwhhyhwp fmpnfgdg jcfuexly nsnalokq ridgkfsh vylnjdzz zobtquhi dejzplga huzgwkos llgmvbvj pboscsvb trezbrct xhmfahjk bxclhyju fnksgxqm jdaynoyd ntiemfxv rjqllefm vzgrsume zpnxslmw dfdezktn zvlkybbx dlbqfsap hbjwerig lzrddipy pphjkywp tfppjxwh xvfwqodz blmcpfli fbcioeka jrkpvvss nhavulzj rxibbkzb vnqiabgs zdgohsok dtougjnc hjebfiul lzlhmzcd pqbnmpbv tgjutojm xwrasfqe amhgrwqw ecpmyvxn isftxmff minzecmo qydfdbmg uolmksty yeaajjap cuigiiah gkqnpzhz kagtoqpq oqozvooa sgegufwr wwmmtwdj amcsavdb eckzzmks isrfgdsk mihlfbrc qypsnsyt uwfymjgd qmnelifu ucdksznm yslrrque cibxypcv gyjdxfbn korkwwjf ofgqdnqw svowcmqg wledjdxx abmjiufp ercppteh ihkwojly mxscnatq qniiuzsi udqptqar ytfvahhj cjnbzghb gzdiywos kplognwk oftufmvb svjamddt wlrhlukl abhnstru erptrkrm ihfaqaye mxmgxzgv qncmwqfn udktdhne ytszcguw cjifbxuo gzqminbx kpgshmjp ofoyodih svefnupy wlllutxq aktrtkwh eajysbez iqrearlj mghkzqla iwprghss mmfxfyak qcndexzb usdjloht yilqkeok cyswrdwc goicquvm keqjxlcd ougpwkkv skovvbjn waeccsre aqmibqyw eguoihyo iwkvhyff mmrboxnp qchhnomg uspomfuy yifutebq cynatuah govhaliz kelnzkpr outtybpa skjzfsws wargerej argmlhlb ehoskylt ixezrxsk lnmfqoac pdulpfzu ttkswwgd xjsyvvov bzieclnm fxqlbcve jnfrabcw ndnxhscn rtvegjjf vjlknirx zztqmyqg dpjxupyy zfrdtofq dvhjsffh hlppzwmz lbfwyvtq prmcfmbi thuiecas xxkpdbij bnsvkspb fdibjjpt jtqiqiwk njgopzec rzouwpdt vpwbvoll zflhufsv dwtnbwrm hmjuavze lcrahmgw pshggdgn tipngbnf xyftnsvw bonzmjuo fevftacy julmszjp nksszqrh raiyygqz vqqfxfxq zgglewfi dwordnez huwykmmj lkmejdtb paukiuts tqkrpsak xgrxojic bwhdvaht fmpkuzpl jcxqbqwd nsnwahwm rivdzgde vyljhwkv rotpgnkn vejwnmrf zurcmdzw dlgilugo hboostgg lrwvrjnp phmbyavh txuhxzuy xnkoeqcq bdsudhji ftiacgiz jjqhjxqr nzxninxb rpntpexs vfvaodek zvlgnumb dltmullt hbjttktl lrrzaaac phhfarau txpmhqhe xnxsghov bdmyfywn ftuemxvf jjkllodw ktnzwhlb lwpnittf jkmjyikf awyuynle cxzdzofb gqsxjjln kvwvnjyb niptgrrm pqtjjqnz tgjqihur wwrwhybi amzcoxbs ecpjnoik isxpufqb minvtdpt qyvctuxl molialec qesozcmu uuiugbll ykqbfstv cayhmjan gqonlhze kgwukyhw owmarpoo smugqoof wcknxfvx asrtwwdg eizzducy iypgclkq moxmbcrh qensibrz uuvzhsyr yklfojfi cattnifa gqjanymk kgrgupub ofymtobt svosafbk wlwzzwic abmfgvqu erulflpl ihksecxd mxsylben qnaeksee udqlrjlw ytxrqisn cjnxpzsf gzvewpzx kplkvgho oftqcfgy svjxbwoq wlrdinvh abzjhmvz erpqgccq ihxwotki exmcnsra inuiujqr mdkptayb qtsvszft ujabzqfk yzqiygmc cpyoffut gfouewtl kvwblnbd omlhkmiu sctnjdie wsbuqupw airapswn eyzgwjwf iopnvadx mextuzlo qunzbqkg usvgahsp yilmhfzh cysshwhz goazongq keqfnmoi ouylmdva skortuvr wawyslcj aqmezjjs egukyajk iwcrxrqc mmrxeqyt qczddhxl uspkkyfd yixqjwmu cynwqnmm govdpetv keljodbn outpvuaf skbwulhw waqcbkpo aryibawg whoparwx axwvhqdh dnmbghlz hduhnykq ltcomxsi pjsutnzz tzaasezr xpqhrdgj bfxnyuna fvntxlnk jlvaekuc nbdgdbct rrtmcrbl vhbtjqjc zfrzihqu dvzfpyqm hlpmopxd lbwsvofn prmyuemf thufuvlw xxclbuto bnsralaf fdaxhcax jtqegbhp njykfspy rzoqmioq vpwxlhwi zgddsydz dwtjrpdr hmbqyoki lcrwxfsa pszcwwrs tipjduyb xyxpclgt bonvjcfl fevcibnc jucihsuu nksoojum raavnhbd nqqbvyjv rgyhupqe vwonboqw zmwuafxo dceazwef hsuggvex licnfllp pyrtmctg tozzltsq xepgssah bcxmrjhz fsnsqahr jivzxyoi nydfwpwa rotldgvs vebscfcj zuqybwkt dlyeinjk hbolhmrc lrwrpcyu phexotgl txuevsfd xnckujnv bdsqtaum ftawazuw jjqdzpbn nzxjggjf rpfpffix vfvwewpo zvdclnxg dltikmwy hbbprdeh lrrvqtlz phzbxslr txpiwjsi xnwovaaa bdeuczzr ftubbqhj jjchihob fzsnixvk jpauhwvc nfqaoncu rvygnekl vlgmudjd zbwtturu dsdzakym hqtfzjye lgbmyafn owrsfrnf smzyeqmx wcpflhto asxlkybg eifrjwax iyvyqnip mocepepz qeskwdpq uuarvuwi ykqxclea caydbjlr gqgkbalj kgwqirsb owewhqas smucohzc wccjnygt asrpmxol eizvtnnd iyhcsevu moxizvcm qefoyuce uuvvfljn ykdbecrf cathdaqw gqbokryo kgqujifg oxyaqhex snghpymp wdwnopth atetvobq ejuaveai azcgcviz epsmbupr ifasilpj mdizhcwa qtxfgbes ujflnrdk yzvsmikt cpdgthsl gftmsyrc kvbtrpzu olrzyogm sbzfxfgd wrhmevnv ahwsduvf exeykluw inufjcco mdclibjg qtsrpsrx ujayojqp yziewzxg cpykvyfy gfgrupei kvwxbgmz omddaftr sctjhwtj wsbqgmaa airwnlis eyzcmchj iohjltpb mexpsswl qufvrjvc ukvcyadu yacixykm cqsowpkd ggavdgrv kwibcfzm omyhjwgw scgoingo wawuplnf sqeapcvx wguhotup awcnvsbg emjtujjy iczzbaiq mshgazqz qixmhpxr uyfsggxi yovzffea cedfmwms gutllnlj kkbssetb oaiyrcat sryeqtac whglxkhu zxwrwjol dnexdawd hduecrvv ltckjqdm pjkqigke tzaxixko xpidpwrf bfxjonzx fvfpveyo jlvwudgg nbdctuny rrtiakmp vhbpzjuh zxjvgabr dnzbfrbi hdhimqia ltwolhqr pjeukxpj tzubrwxb xpchqnes bnknxemk fdauwdlu jtiavusl njygclad jzgncjzv npwtjahm rgdziroe vwlfpiov zaqzlcol envshpxa iwohjfrv nqlvwfnt pyxlaery tofrzvrp xevyyuyh buceflfy fkkkecfi jaarlama nqixkrur rgydribj vwgkqhbb zmwqpyis dcewwpqk hsmdvnpb licjdexl
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值