鉴于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)];
}

}

最新文章

  1. C#上位机制作之串口接受数据(利用接受事件)
  2. android 关闭/开启软件键盘(hideSoftKeyboard)
  3. 事务块TransactionScope使用
  4. 回忆一次面试Android研发的问题
  5. openfire及xmpp简单介绍
  6. DJANGO问题--Error: ‘ManyRelatedManager’ object is not iterable
  7. IUSR和IIS_IUSRS
  8. js中运算符的优先级
  9. 【android】adb连接几个常见问题(遇到再新增)
  10. ajax--2017年1月15日
  11. locate/slocate命令
  12. Android开发之adb无法连接
  13. Eclipse 中 Spring 项目的 XML 配置文件报错 Referenced file contains errors
  14. 【Java每日一题】20170223
  15. 003.Ansible基础使用
  16. Spring Boot重要内容
  17. obv15 实例6:如果K线柱过多,ZIG将发生变动,导致明显的OBV15指标被隐藏!
  18. git 推送出现 "fatal: The remote end hung up unexpectedly" 解决方案
  19. win10 ubuntu 同一硬盘双系统安装和启动设置
  20. git Alias 设置

热门文章

  1. ajax起步 (二)
  2. cksum---检验文件CRC是否正确
  3. 【Codeforces Round #427 (Div. 2) D】Palindromic characteristics
  4. 一个小的考试系统 android 思路
  5. VS Code 好用的扩展程序
  6. BZOJ5137: [Usaco2017 Dec]Standing Out from the Herd(广义后缀自动机,Parent树)
  7. 词向量 word2vec
  8. pycharm快捷键、经常使用设置、配置管理
  9. fromCharCode vs chr
  10. TextView-shadow 阴影实现