苹果APNS在app中的具体实现

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

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

安装证书到服务端

你应该安装SSL证书和私匙到你的provider程序运行的服务器上。

步骤如下:

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

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

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

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

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

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

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

说完服务端了就具体说客户端吧,首先在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)];
}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 04:28:21

苹果APNS在app中的具体实现的相关文章

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

http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. 推送流程 3.1 获取设备device_token阶段 3.2 消息推送过程 3.3 完整流程介绍 4. Push机制类型 5. 正式开工 5.1 准备工作 5.2 证书生成 6. 客户端制作 7. php服务器端配置 8. 测试 8. 附录: 8.1 JSON示例 8.2 检验证书是否正确的方法:

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

在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 aps 字典.它使用字符串而不是字典作为 alert 的值,该负载同样包含了一个自定义的属性数组. { "aps" : { "alert" : "message" },//alert表示推送的消息文本 "parm" : [ &quo

苹果开发之App签名

如果你的Apple ID账号(可使用邮箱来注册)为Apple developer类型的话,登录之后是看不到Certificates, Indentifiers & Profiles信息的 Apple developer是最基础的账号类型,主要用来在App Store下载各种应用(包括xCode等开发工具和SDK库)及在iCloud上备份文件和照片 可通过点击下方的“Joining the Developer Program”链接,按照指引点击enroll按钮,付费99$/year之后,成为reg

2016年最新苹果IOS上架App Store商店步骤

1.1.前期工作 首先你需要有一个苹果的开发者帐号,一个Mac系统. 如果没有帐号可以在打开http://developer.apple.com/申请加入苹果的开发者计划.支付99美元每年,怎么申请网上有详细的介绍,在此不多做介绍. 如果你已经有了一个IDP,打开 http://developer.apple.com/  并登录到苹果MemberCenter,见下: 登录后点击Certificates,Ldentifiers & Prlfiles,进入,所有证书相关的都在这里进行.如下图所示:

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

如果你已经做了一款超牛X的APP.你也许还有一件是需要操心.APP够好了,怎么盈利呢?你可以对下载你的APP的用户收费.也可以完全的免费,然后在APP里放广告来实现盈利.现在来说,除非一款APP真的是非用不可的,或者很有名,在要不就是很好玩的游戏.否则,用户一般是不会付费的.明智的选择是免费,集成广告.广告的收益是由苹果和开发这共同分成.一般来说开发者占七成,apple占三成.毕竟苹果建立了广告分发的网络. 当然也有很多的开发者选择了在免费版的APP里插播广告的同时,还开发了一个收费但是没有广告

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

原地址:http://zengwu3915.blog.163.com/blog/static/2783489720137410539278/ 完成一个app应用后,肯定是要提交的,下面聊一下关于向App Store提交的一些问题.我们都知道苹果审核的过程就像是在"黑箱"操作,但这并不妨碍你为这个审核过程做一些事先的准备.苹果的App Store审核指南已经告诉你哪些是允许的,哪些是不允许的.当你第一次提交你的应用到苹果的时候,这是一个令人兴奋而但又伤脑筋的过程.即使再有经验的开发者也会

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

之前我一直做的都是WEB前端开发,来北京以后面试了一个移动前端开发,WAP前端开发. 其实在原来公司的时候也做过这方面的开发,可面试的时候面试官问我,要想强制让文档与设备的宽度保持1:1,mate标签中应该加什么属性时,我愣了一下,因为原来我写这方面代码时根本没有注意过这个问题,我以为在*.html文件里加上了<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforu

移动web app 中的meta 标签

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" />meta viewport 相关属性有下面几个 width: viewport 的宽度 (范围从 200 到 10,000 ,默认为 980 像素 ) height: viewport 的高度 (范围从 223 到 10,000 ) ini

JSPatch来更新已上线的App中出现的BUG(超级详细)

JSPatch来更新已上线的App中出现的BUG(超级详细) 字数2858 阅读422 评论15 喜欢29 JSPatch的作用是什么呢? 简单来说:(后面有具体的操作步骤以及在操作过程中会出现的错误) 1.iOS应用程序上架到AppStore需要等待苹果公司的审核,一般审核时间需要1到2周.虽然程序在上架前会经过测试人员的测试,但有时候还是不免会发生新版本上线后出现严重的bug,导致用户刚升级到新版本就出现crash,严重影响用户体验. 2.这时能做的只是赶紧修复bug然后提交等待漫长的App