鉴于server稳定的开发难度非常大,小团队不建议自己开发。建议使用稳定的第三方推送方案,如个推,蝴蝶等。

要想使用苹果APNS推送消息,首先要把开发app的xcode所用证书上传到server上,当然你的证书要用的是hot证书或勾选push选项的公布者。普通研发者证书是收不到push消息的。

client设置

开启Remote notifications

须要在Xcode 中改动应用的 Capabilities 开启Remote notifications,请參考下图:



安装证书到服务端

你应该安装SSL证书和私匙到你的provider程序执行的server上。

过程例如以下:

0.安装该证书到mac电脑的钥匙串。

1.打开钥匙串,在左側面板上点击我的证书栏。

2.找到这个SSL证书。展开会看到证书和私匙。

3.我们选中证书和私匙,然后导出为”个人信息交换文件”–即扩展名为p12的文件。

4.providerserver程序最好用Ruby和Perl这类语言。能够方便的处理”个人信息交换文件”里的证书。mac下打开终端输入以下命令以把证书转换为这类语言乐于交流的格式:

openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes

5.把这pem文件拷到server上并安装到某个适当的位置。

说完服务端了就详细说client吧,首先在AppDelegate.m(AppDelegate.mm)文件里的- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions增加[AppDelegate registerForRemoteNotification];来又一次获取设备相关的token。不要缓存token.

当注销时,本账户在别的设备上登陆时(被踢掉)或者捕获到被拉掉事件时(- (void)applicationWillTerminate:(UIApplication *)application)须要取消推送的注冊,代码如[[UIApplication sharedApplication] unregisterForRemoteNotifications];//用户退出登录后,取消推送的注冊,登录时register。当然退出到登陆页面后登陆成功后还时须要又一次进行推送的注冊。

在didReceiveRemoteNotification能够处理收到的消息,能够仅仅记录到全局变量里临时不操作。也能够播放铃声。震动。弹出对话框。跳转页面等。像这个版本号更新的push消息处理就没有告知用户 if([type isEqualToString:@”psy_needUpgrade”])

{

NSString *url = [page objectForKey:@”downloadUrl”];

if(url != nil)

{

g_needUpgrade = 1;

g_downloadUrl = url;

}

return;

}

以下这段代码是对接收的push消息进行处理。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
FLDDLogDebug(@"push userinfo:%@", userInfo); NSDictionary *aps = [userInfo objectForKey:@"aps"]; NSInteger count = [[aps objectForKey:@"badge"] toInt];
[application setApplicationIconBadgeNumber:count]; NSString *alert = [aps objectForKey:@"alert"];
NSDictionary *page = [userInfo objectForKey:@"page"];
NSString *actionId = [page objectForKey:@"id"];
NSString *type = [page objectForKey:@"type"];
NSString *title = [page objectForKey:@"title"];
NSString *notifyType = [[page objectForKey:@"notifyType"] toString];
NSString *subType = [[page objectForKey:@"subType"] toString];
NSString *subId = [[page objectForKey:@"subId"] toString];//app消息相应的订单id
NSString *phone = [page objectForKey:@"userTel"]; NSString *userPhone = [User currentUser].phone;
if (![phone isEqualToString:userPhone]) {
return;
} if([type isEqualToString:@"psy_needUpgrade"])
{
NSString *url = [page objectForKey:@"downloadUrl"];
if(url != nil)
{
g_needUpgrade = 1;
g_downloadUrl = url;
}
return;
} if ([notifyType isEqualToString:@"1"]) {
type = kFhlappnotify;
}
else if ([notifyType isEqualToString:@"2"]){
type = kFhlordernotify;
} if ([type isEqualToString:kFhlGrab]) {
//set home refresh tag
[[NSNotificationCenter defaultCenter] postNotificationName:REFRESH_HOME_NOTIFICATION object:nil];
} if (application.applicationState == UIApplicationStateActive) { [application setApplicationIconBadgeNumber:0]; if ([AppManager boolValueForKey:@"shock"]) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); }
else {
[self playAudioWithIndex:type];
} if ([type isEqualToString:kFhllogout]) {
g_loginStat = LOGIN_STATE_EXIT_LOGIN; // [AppManager saveCurrentOrderRemind]; [[UIApplication sharedApplication] unregisterForRemoteNotifications];
[[User currentUser] removeUserInfo];
[AppManager setUserDefaultsValue:@"" key:@"telephone"];
[AppManager setUserDefaultsValue:@"" key:@"password"]; UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil
message:alert
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil, nil];
alertView.tag = 1005;
[alertView show]; }
else if ([type isEqualToString:kFhlGrab]) {
//set home refresh tag // [AppManager setUserBoolValue:YES key:@"NeedRefreshHome"];
}
else if ([type isEqualToString:kFhlSend] || [type isEqualToString:kFhlReceived]) {
// Order *order = [[Order alloc] init];
// order.id = actionId;
// [[NSNotificationCenter defaultCenter] postNotificationName:REFRESH_ORDER_NOTIFICATION object:nil userInfo:@{@"Order" : order, @"Option" : @(3)}]; }
else if ([type isEqualToString:kFhlBeAppoint]) { Order *order = [[Order alloc] init];
order.id = subId; [[NSNotificationCenter defaultCenter] postNotificationName:REFRESH_ORDER_NOTIFICATION object:nil userInfo:@{@"Order" : order, @"Option" : @(3)}]; }
else { if ([subType isEqualToString:kFhlSubClosed] || [subType isEqualToString:kFhlSubRejected]) { Order *order = [[Order alloc] init];
order.id = subId; if ([subType isEqualToString:kFhlSubRejected]) {
order.state = @"50";
} [[NSNotificationCenter defaultCenter] postNotificationName:REFRESH_ORDER_NOTIFICATION object:nil userInfo:@{@"Order" : order, @"Option" : @(3)}];
} if ([type isEqualToString:kFhlcancel]) { Order *order = [[Order alloc] init];
order.id = actionId; [[NSNotificationCenter defaultCenter] postNotificationName:REFRESH_ORDER_NOTIFICATION object:nil userInfo:@{@"Order" : order, @"Option" : @(4)}]; } UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
message:alert
delegate:self
cancelButtonTitle:@"忽略"
otherButtonTitles:@"进入", nil];
if (type.length > 0 && actionId.length > 0) {
objc_setAssociatedObject(alertView, &AlertAssociatedKey,@{@"type" : type, @"actionId" : actionId}, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } [alertView show];
}
}
else if (application.applicationState == UIApplicationStateInactive){
[self pushViewControllerWithType:type actionId:actionId];
}
}

以下这断代码就是详细的推送的注冊:

“`

+ (void)registerForRemoteNotification {

FLDDLogDebug(@"*\n*\n*\nregisterForRemoteNotification\n*\n*\n*\n");
if (IOS8_OR_LATER) {
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeNewsstandContentAvailability;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
} else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeNewsstandContentAvailability)];
}

}

苹果APNS在app中的详细实现的更多相关文章

  1. 手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客

    http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. ...

  2. 苹果开发之App签名

    如果你的Apple ID账号(可使用邮箱来注册)为Apple developer类型的话,登录之后是看不到Certificates, Indentifiers & Profiles信息的 Ap ...

  3. iOS开发之功能模块--Apns推送中的的json格式介绍

    在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...

  4. 我刚知道的WAP app中meta的属性

    之前我一直做的都是WEB前端开发,来北京以后面试了一个移动前端开发,WAP前端开发. 其实在原来公司的时候也做过这方面的开发,可面试的时候面试官问我,要想强制让文档与设备的宽度保持1:1,mate标签 ...

  5. 我刚知道的WAP app中meta的属性(转载)

    之前我一直做的都是WEB前端开发,来北京以后面试了一个移动前端开发,WAP前端开发. 其实在原来公司的时候也做过这方面的开发,可面试的时候面试官问我,要想强制让文档与设备的宽度保持1:1,mate标签 ...

  6. Apns推送中的的json格式介绍

    在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...

  7. App Transfer:苹果允许iOS App从一个开发者帐号转至另一个开发者账号

    App Transfer:苹果允许iOS App从一个开发者帐号转至另一个开发者账号 苹果在WWDC上宣布超过30万的开发者为iOS平台开发超过90万的应用,你可能会想到有人想出售或者购买app. 现 ...

  8. 苹果开发——向App Store提交应用

    原地址:http://zengwu3915.blog.163.com/blog/static/2783489720137410539278/ 完成一个app应用后,肯定是要提交的,下面聊一下关于向Ap ...

  9. 在APP中集成iAd Banner展示广告盈利

    如果你已经做了一款超牛X的APP.你也许还有一件是需要操心.APP够好了,怎么盈利呢?你可以对下载你的APP的用户收费.也可以完全的免费,然后在APP里放广告来实现盈利.现在来说,除非一款APP真的是 ...

随机推荐

  1. Dubbo springcloud

    简而言之,Dubbo确实类似于Spring Cloud的一个子集,Dubbo功能和文档完善,在国内有很多的成熟用户,然而鉴于Dubbo的社区现状(曾经长期停止维护,2017年7月31日团队又宣布重点维 ...

  2. Javascript和jquery事件--事件冒泡和事件捕获

    jQuery 是一个 JavaScript 库,jQuery 极大地简化了 JavaScript 编程,在有关jq的描述中,jq是兼容现有的主流浏览器,比如谷歌.火狐,safari等(当然是指较新的版 ...

  3. touch---创建文件或更改文件日期

  4. nslookup---域名查询

    nslookup命令是常用域名查询工具,就是查DNS信息用的命令. nslookup4有两种工作模式,即“交互模式”和“非交互模式”. 在“交互模式”下,用户可以向域名服务器查询各类主机.域名的信息, ...

  5. 图片工具GraphicsMagick的安装配置与基本使用

    本文使用GraphicsMagick的版本为1.3.18 (Released March 9, 2013). 1.简介 GraphicsMagick是一个短小精悍的的图片处理工具和库集合.对于Java ...

  6. Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳)

    Oracle 10g 10.2.0.1 在Oracle Linux 5.4 32Bit RAC安装手冊(一抹曦阳).pdf下载地址 ,step by step http://download.csdn ...

  7. highcharts 阶梯图表并填充颜色(自己觉得:直角折线图表)

    例如以下:普通阶梯图 $(function () { $('#container').highcharts({         title: {         text: '普通阶梯图'       ...

  8. 【剑指Offer学习】【面试题49:把字符串转换成整数】

    题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能.不能使用atoi或者其它相似的库函数. 题目解析 这看起来是非常easy的题目,实现基本功能 ,大部分人都能用10行之内的代码 ...

  9. C#发送邮件DEMO

    虽然网上有很多类似的DEMO,但是还是整个封装好的例子,以便以后用: 发送邮箱是直接在web.config配置的. protected void Button1_Click(object sender ...

  10. Day3上午解题报告

    预计分数:100+40+50=190 实际分数:100+40+50=190 T1 https://www.luogu.org/problem/show?pid=T15365 表示从来没做过博弈论的题, ...