推荐内容IMESSGAE相关
高人的总结: APPLE推送关照办事教程 PART-1 APPLE推送通知服务教程 PART-2 APPLE推送通知服务教程 PART-3 IOS7以前,苹果对付一个装备上的多个APP,天生雷同的DeviceToken。 IOS7以及今后,苹果对于一个设备上的多个APP,生成分歧的DeviceToken。 这类新扭转致使APNS上建立了一张新老token的映照表,若是你不停用老的token,那没题目,可是,一旦服务器利用新的DeviceToken,映射表中的记实就会被删除,这意味着,老的DeviceToken就不克不及用了,必定发送失利。 待考证:IOS5和IOS6,APP永久能够获得DeviceToken,除此以外的体系,如果用户回绝了,大要封闭了推送
那末没法获取DeviceToken,走失败回调。 生成证书必要细致事项: 苹果开发者账号分好几种脚色 Agent:代理人,具备最高权限,可以拜候iTunes Connect。 Admin:办理员,拥有管理成员、保护设备列表,维护APPID以及证书列表权限。 Member:平凡成员,只读权限。 备注:2013.9.11颠末测试,我发明前段时辰苹果网站下线时代更新了证书生成机制。曩昔,操纵钥匙串生成一个CSR文件,可以一直用。但是,如今每当你要生成证书,做generate的时候都需要提早从新生成一个CSR文件,不然你生成的证书都是无效的,假证书,特别是PUSH的,服务端使用这种证书根本无法和APNS创建毗连,这种诡异的问题超难跟踪的!但愿看到这段话的人都能防止走弯路,不用谢了! 在使用PushMeBaby中也碰到各类问题。起首,固然工程中曾经使用了.cer的公钥证书,但是当地钥匙串中必需有带私钥的证书,否则连接无法乐成建立。并且需要注意的是
证书最佳放在“登录”分组中,否则步伐也是找不到私钥的。其次,原始的工程中在scanString的时候会死循环,需要点窜为以下代码: NSUInteger count = 0; while(![scanner isAtEnd]) {undefined [scanner scanHexInt:&value]; value = htonl(value); [deviceTokenData appendBytes:&value length:sizeof(value)]; if (++count >= [self.deviceToken length]-1) {undefined break; } } 苹果基于bug缘由,停用了服务器端的SSL3.0连接方法。今朝只支撑TLS连接。
1. 如果推送的时候deviceToken对应的呆板在APNS服务器上是离线状况,苹果会保留推送信息“一段时间”。当机器规复在线状态时,推送信息到该机器。如果机器长期不在线,苹果会丢弃掉这条动静。这个“一段时间”没有明文说多久,而且不知道苹果在不同环境下对这个时间有无静态调解,以是无法猜测这个时间对于信息丧失情况的影响。 2. 对于延续推送的情况,针对离线设备,苹果永远只存储最新的一条,上一条信息会被抛弃。
3. 有多条推送使命时,苹果保举使用单个连接持续发送,而不是反复的开关连接,否则会被苹果以为D-O-S打击给拒绝掉。如果有多台服务器,可以并发连接到APNS,摊派推送任务,可以更高效的实行任务。 4. 发送多条推送任务时,如果此中有一条推送使用了毛病的deviceToken,那么连接就会被断掉,导致背面的推送任务遏制执行。苹果经由过程一个“The Feedback Service”的服务来按期告诉provider无效的deviceToken列表,若何使用这个服务拜见苹果民间文档中的细致阐明,上面有附连接。 @Test public void hashTest(){ Jedis jedis = jedisPool.getResource(); // 往hash布局中增加如下商品库存 // iphone11 => 10000 // macbookpro => 9000 jedis.hset(“goods”,“iphone11”,“10000”); jedis.hset(“goods”,“macbookpro”,“9000”); // 获取hash中的全部的商品 System.out.println(“所有商品:”); Set goodSet = jedis.hkeys(“goods”); for (String good : goodSet) { System.out.println(good); } // 新增3000个macbookpro库存 System.out.println(“新增3000个macbookpro库存:”); System.out.println(jedis.hincrBy(“goods”, “macbookpro”, 3000)); // 删除全部hash的数据 jedis.del(“goods”); jedis.close(); } Development和Production两个版本对应的apns device token是不同的,前者是develop的mobileprovision下获取的。后者是production的mobileprovision获取的。 Development和Production两个版本可以共用一个App ID(不推荐。共用时每次调试前都要删除设备上的app,重新打包生成。而且共用appid会常常抓狂,早上行,下战书就不可了。所以不推荐),但是不能共用一个mobileprovision,所以要零丁生成Distribution的证书供production版本使用。
注:Distribution的版本是无法在设备上debug调试的! Development和Production两个版本的code sign是不同的,前者是iPhone Developer,后者是iPhone Distribution。注意不能搞错。 DisplayProductName PHL 272B8 DisplayProductID 16652 DisplayVendorID 2351 scale-resolutions AAAKAAAABaAAAAABACAAAA== AAAFAAAAAtAAAAABACAAAA== AAAPAAAACHAAAAABACAAAA== AAAHgAAABDgAAAABACAAAA== AAAMgAAABwgAAAABACAAAA== AAAGQAAAA4QAAAABACAAAA== AAAKAgAABaAAAAABACAAAA== AAAKrAAABgAAAAABACAAAA== AAAFVgAAAwAAAAABACAAAA==
无论是Development Push SSLCertificate仍是Production Push SSL Certificate 都有过时时间的。Development Push SSL Certificate有效期大概四个月摆布(厥后仿佛改到一年了),而ProductionPush SSL Certificate的有效期是一年。需要注意在过期之前生成新的证书,以避免影响使用。官网可以同时配置两个,第一个快过期的时候,生成第二个,而后更换服务器证书,等第二个使用一周没问题后删除第一个证书设置。 openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12 openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-cert.p12 openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem 在Mac上生成 Apple推送通知SSL允许证:
- 登录到 iPhone Developer Connection Portal 并点击 App IDs 2. 创建一个不使用通配符的 App ID 。通配符 ID 不能用于推送通知服务。比方,咱们的iPhone程序ID像如许: AB123346CD.com.serverdensity.iphone 3. 点击App ID旁的“Configure”,然后按下按钮出产 推送通知许可证。按照“领导”引导的步调生成一个署名并上传,末了下载生成的许可证。此步骤在 Apple文档中 也有谈到。 4. 通过双击.cer文件将你的 aps_developer_identity.cer 引入Keychain中。 5. 在Mac上启动 Keychain助手,然后在login keychain当选择 Certificates分类。你将看到一个可扩大选项“Apple Development Push Services” 6. 扩展此选项然后右击“Apple Development Push Services” > Export “Apple Development Push Services ID123”。保存为 apns-dev-cert.p12 文件。 7. 扩展“Apple Development Push Services” 对“Private Key”做一样操纵,保存为 apns-dev-key.p12 文件。 8. 需要通过终端号令将这些文件转换为PEM格局: openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12 9. 转换获得key的pem: openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-cert.p12 10. 如果你想要移除暗码,要末在导出/转换时不要设定或者执行: openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem 11. 最后,你需要将键和许可文件分解为apns-dev.pem文件
此文件在连接到APNS时需要使用: cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem 将此文件保存为一个易记的名字,你有大概以后会用到它。上述步骤同样得当于生成产物许可证。 export CUDA_HOME=/usr/local/cuda export DYLD_LIBRARY_PATH=“
C
U
D
A
H
O
M
E
/
l
i
b
:
CUDA_HOME/lib:
CUDAH?OME/lib:CUDA_HOME/extras/CUPTI/lib” export LD_LIBRARY_PATH=
D
Y
L
D
L
I
B
R
A
R
Y
P
A
T
H
e
x
p
o
r
t
P
A
T
H
=
DYLD_LIBRARY_PATH export PATH=
DYLDL?IBRARYP?ATHexportPATH=DYLD_LIBRARY_PATH:$PATH export flags="–config=cuda --config=opt" 检验证书是不是精确的法子: $ telnet gateway.sandbox.push.apple.com 2195 Trying 17.172.232.226… Connected to gateway.sandbox.push-apple.com.akadns.net. Escape character is ‘^]’. 它将测验考试发送一个规矩的,不加密的连接到APNS服务。如果你看到下面的反应,那说明你的MAC可以或许达到APNS。按下Ctrl+C 关闭连接。如果得到一个错误信息,那么你需要确保你的防火墙容许2195端口
然后再次连接,此次用我们的SSL证书和私钥来设置一个平安的连接: $ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem Enter pass phrase for PushChatKey.pem: 你会看到一个完备的输出,让你大白OpenSSL在背景做甚么。如果连接是成功的,你可以键入一些字符。当你按下回车后,服务就会断开连接。如果在建立连接时有问题,OpenSSL将会给你一个错误消息,但是你不能不向上翻输出LOG,来找到它。 固然上面要测试prodution版本是否正确的话,把gateway.sandbox.push.apple.com换成gateway.push.apple.com就好。 客户端很好做,申请证书,复制代码,就好了。 服务器端,如果是php的,那必须使用.pem的证书,如果是java的,那必须使用.p12的证书。(很可能还需要双击证书举行安置!) 服务器端收回的json包是有巨细限定的,最大256字节,包含自定义字典集。 aps中的alert字符串里是可以添加"\n"做换行的。 json包中除了alert,badge,sound之外,还是是可以自定值的。
分外的自定义值:p a y l o a d [ ′ a p s ′ ] = a r r a y ( ′ a l e r t ′ = > ′ T h i s i s t h e a l e r t t e x t ′ , ′ b a d g e ′ = > 1 , ′ s o u n d ′ = > ′ d e f a u l t ′ ) ; payload[‘aps’] = array(‘alert’ => ‘This is the alert text’, ‘badge’ => 1, ‘sound’ => ‘default’); payload[ ′ aps ′ ]=array( ′ alert ′ => ′ Thisisthealerttext ′ , ′ badge ′ =>1, ′ sound ′ => ′ default ′ ); payload[‘server’] = array(‘serverId’ =>
s
e
r
v
e
r
I
d
,
‘
n
a
m
e
’
=
>
n
a
m
e
)
;
n
a
m
e
)
;
n
a
m
e
)
;
o
u
t
p
u
t
=
j
s
o
n
e
n
c
o
d
e
(
serverId, ‘name’ => n a m e ) ; name); name); output = json_encode(
serverId,‘name’=>name); name); name); output=jsone?ncode(payload); 当用户按下“View”后,自定义server值将被通报到设备中的程序。JSON 值如下: {undefined “aps” : { “alert” : {undefined “action-loc-key” : “表现” , “body” : “This is the alert text” }, “badge” : 1, “sound” : “default” }, “server” : { “serverId” : 1, “name” : “Server name”) } 256字节的限制合用于整个payload,包括自定义字典集。 原生接口 在Server Density中,一旦发生了一条提醒,将建立一个payload并插入行列步队中。是以有需要时我们可以同时发送多个payload。 Apple推荐使用这种方法,由于如果你在发送各payload时频仍连接和断开,APNS有可能会封闭你的IP。 如Apple 描写: 原生接口使用原生socket,具有二进制内容,采纳数据流技能,不产生回馈。
|