iPhone Push消息全攻略.1

原创 2013年07月12日 11:13:50

要做一个iPhone Push消息的需求,从简单test的开始。

1、先添加一个app ID


2、点击Edit来配置push服务。

3、生成两个证书,一个用于开发,一个用于发布。

4、按下图操作创建一个csr文件然后continue。

4.1 打开应用程序->实用工具->钥匙串访问。按如下菜单请求一个证书。

4.2 如下图


5、选择刚才创建好的csr文件生成证书

6、下载后双击cer文件导入系统。接着创建Provisioning Profile。

选择我们刚创建的app id。
一步步continue,最后generate。

7、Download之后导入profile到Xcode。
8、将SSL证书和key安装到推送服务器上。先找到我的证书,如下:

8.1 选中两项,右键“导出两项”


8.2 会提示生成一个文件密码,密码可以为空,不输入直接点好。

tips:
也可以通过如下方式生成profile,在Organizer里new一个Profile。


然后到member center里下载profile,导入到真实iphone设备。据这篇文章说只能保留一个。


9、开始开发前,先了解下DeviceToken

device token,即设备令牌,不是系统唯一标识(见获取iOS设备的基本信息),需要在应用启动时发起到apple服务器请求,注册自己的设备和应用,并获得这个device token。

device token有什么用?如果应用需要push notification给手机,那么它要有个服务器端(provider),但是它发出的信息不是直接给手机的,而是必须统一交给apple的服务器,这个服务器就是apple push notification server(apns)。apple服务器通过这个token,知道应用要发的消息是给哪个手机设备的,并转发该消息给手机,手机再通知应用程序。

10、创建一个Single View Application应用来获取DeviceToken
修改Delegate文件,要在头文件里定义变量:@property (strong, nonatomic) UIViewController *viewController;
//
//  com_sencloud_testAppDelegate.m
//  test
//
//  Created by chen minglei on 13-7-11.
//  Copyright (c) 2013 chen minglei. All rights reserved.
//

#import "com_sencloud_testAppDelegate.h"

@implementation com_sencloud_testAppDelegate

@synthesize window;
@synthesize viewController;

- (
void)applicationDidFinishLaunching:(UIApplication *)application {
    [
windowaddSubview:viewController.view];
    [windowmakeKeyAndVisible];
   
    NSLog(@"Registering for push notifications...");
    [[UIApplicationsharedApplication]
     registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeAlert |
      UIRemoteNotificationTypeBadge |
      UIRemoteNotificationTypeSound)];
   
}

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
   
    NSString *str = [NSString
                     stringWithFormat:@"Device Token=%@",deviceToken];
    NSLog(str);
   
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
   
    NSString *str = [NSStringstringWithFormat@"Error: %@", err];
    NSLog(str);
   
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
   
    for (id key in userInfo) {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }
   
}

@end

tips:
遇到这个问题:
Error in registration. Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x123290 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}
原因是Code Signing Identity不对,而这个不对的原因是profile doesn't match bundle identifier,

必须在创建工程的时候设置正确,才能正常运行。如下图:

11、运行后debug view窗口得到:
2013-07-11 21:18:36.139 test[6386:907] Registering for push notifications...
2013-07-11 21:19:05.988 test[6386:907] Device Token=<c8cd88d5 9c0d7407 fc697357 3d3778e5 5e83b92e d40c7588 a595be18 119c6f92>

12、写provider端代码。
import javapns.back.PushNotificationManager;
import javapns.back.SSLConnectionHelper;
import javapns.data.Device;
import javapns.data.PayLoad;

public class ApnsAct {
	public static void main(String[] args) throws Exception {
		try {
			String deviceToken = "c8cd88d59c0d7407fc6973573d3778e55e83b92ed40c7588a595be18119c6f92";

			PayLoad payLoad = new PayLoad();
			payLoad.addAlert("Test");
			payLoad.addBadge(4);
			payLoad.addSound("default");

			PushNotificationManager pushManager = PushNotificationManager
					.getInstance();
			pushManager.addDevice("iPhone", deviceToken);

			// Connect to APNs
			String host = "gateway.sandbox.push.apple.com";
			int port = 2195;
			String certificatePath = "/Users/plan9x/Desktop/test.p12";
			String certificatePassword = "test";
			pushManager.initializeConnection(host, port, certificatePath,
					certificatePassword,
					SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);

			// Send Push
			Device client = pushManager.getDevice("iPhone");
			pushManager.sendNotification(client, payLoad);
			pushManager.stopConnection();

			pushManager.removeDevice("iPhone");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


tips:
调试过程报了错如下,网上查是空密码导致,加上密码test重新生成p12文件:
java.io.IOException: failed to decrypt safe contents entry: java.lang.ArithmeticException: / by zero
at com.sun.net.ssl.internal.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1277)
at java.security.KeyStore.load(KeyStore.java:1183)
at javapns.back.SSLConnectionHelper.<init>(Unknown Source)
at javapns.back.PushNotificationManager.initializeConnection(Unknown Source)
at com.moco.cms.action.front.ApnsAct.main(ApnsAct.java:27)
pfonseka opened this issue 2 years ago

Problem with empty or null password in 'APNS.newService().withCert(certificate.p12, password)'

No milestone
No one is assigned

When a password was not defined on keyStore generation I have the following situations:

1 - Using a null password in APNS.newService().withCert(certificate.p12, password) returns a "NullPointerException";

2 - Using an empty password in APNS.newService().withCert(certificate.p12, password) returns "java.io.IOException: failed to decrypt safe contents entry: java.lang.ArithmeticException: / by zero"


This is a known Java library bug with p12 certificates with no passwords, reported as bug 6415637, and affects any Java library basically.
This will not be fixed in the library, but will have withCert throw an IllegalArgumentException instead.



参考:

1、
http://marshal.easymorse.com/archives/3312
http://marshal.easymorse.com/archives/3329
2、
http://mobiforge.com/developing/story/programming-apple-push-notification-services
3、
http://blog.csdn.net/f520131480315/article/details/6559577
4、
官方英文版

Android 推送消息开放接口 OpenPush

Android 推送消息开放接口 OpenPush 我们知道, 在中国不能使用 google 的服务. 在中国销售的手机甚至没有安装 google 的服务.所以, 原本由 google gcm 提...
  • yanghmcn
  • yanghmcn
  • 2016年11月05日 17:09
  • 2076

即时通讯 - 保证push消息到达对方的流程

在即时通讯应用中,必须保证消息到达对方,不会丢失消息,或者对方收到重复消息。首先每个消息必须包含一个消息ID。在Telegram中,每个客户端发出的消息ID是以当前服务器时间戳为基础的,而且能被4整除...
  • sinat_30323249
  • sinat_30323249
  • 2015年08月04日 08:36
  • 999

58同城高性能移动PUSH推送平台架构演进之路

58同城作为中国最大的生活服务平台,涵盖了房产、招聘、二手、二手车、黄页等核心业务。随着移动化时代的到来,每个业务线都有移动PUSH推送的需求,满足多个业务线海量的消息PUSH推送需求,成为我们急需优...
  • sang1203
  • sang1203
  • 2016年04月20日 15:36
  • 1440

消息系统该Push/Pull模式分析

消息系统该Push/Pull模式分析    出处信息     信息推拉技术简介     “智能信息推拉(IIPP)技术”是在网上信息获取技术中加入了智能成份,从而有助于用户在海量...
  • pi9nc
  • pi9nc
  • 2014年05月30日 22:27
  • 16116

web消息推送技术

消息推送技术 消息推送 消息推送是针对 Web 应用开发领域的技术,指服务端以主动方式将信息送达客户端。主要用于提升用户体验,避免用户刷新页面从服务端拉取数据。例如 Web 邮件中自动出现...
  • a78460750
  • a78460750
  • 2014年04月14日 18:06
  • 2921

"iOS push全方位解析(一)【译文】"——iOS PUSH概述

在iOS中,App在后台不能做太多的事情,仅被允许做一些有限的活动,这样电量寿命就得到了保护。但,如果某些感兴趣的时间发生,并且又希望让用户知道,即便用户并没有正在使用该App。 比如,用户收...
  • hherima
  • hherima
  • 2015年05月11日 10:02
  • 2710

面试题:支持O(1)时间内完成pop,push和max的栈

一般的栈,本身的pop和push的操作就是O(1)的,可以考虑使用一个变量来存储最大值。问题在于,如果这个最大值被pop出去,这个变量就需要重新计算。如果通过遍历一遍来求出,则需要O(n)的时间,达不...
  • AlburtHoffman
  • AlburtHoffman
  • 2014年01月26日 22:51
  • 8986

Push 的工作机制

Push的原理:   Push 的工作机制可以简单的概括为下图   图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。  ...
  • yuleidnf
  • yuleidnf
  • 2016年04月09日 15:22
  • 2098

HTML5+规范:Push(管理推送消息功能)

Push模块管理推送消息功能,可以实现在线、离线的消息推送,通过plus.push可获取推送消息管理对象。 1、方法 1.1、addEventListener: 添加推送消息事件监听器     ...
  • qq_27626333
  • qq_27626333
  • 2016年07月04日 19:59
  • 10857

手把手教你iOS消息推送证书生成以及Push消息

iOS推送消息是许多iOS应用都具备的功能,今天在给应用加推送功能,在生成证书的过程中,发生了各种令人蛋痛的事。下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: ...
  • tuyaloveios
  • tuyaloveios
  • 2013年12月10日 22:03
  • 4685
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iPhone Push消息全攻略.1
举报原因:
原因补充:

(最多只允许输入30个字)