文档章节

UIRemoteNotificationType 参考

hejunbinlan
 hejunbinlan
发布于 2015/08/19 17:38
字数 2081
阅读 38
收藏 0

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 

在这个方法里添加上(iOS8以前)

 

UIRemoteNotificationType  types = UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert;

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];

这里表明 一共注册三种类型 badge,alert,和sound

 

会在第一次使用时候提醒用户是否接受推送,(只会提醒一次),当用户选择允许之后会在

 

-(void) application:(UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken

这个方法里取得设备的token号,然后发送给你们的服务器(因为token不是永远不变的,建议在程序轮询取一次,存好)

 

当用户选择不允许的时候或者此时使用模拟器的时候会实现该方法

 

-(void) application:(UIApplication *) application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error

 

当用户正在使用该程序的时候,可以用一个alertview提醒用户,(主要是为了与自己服务器通信,取得一次最新数据)

 

-(void) application:(UIApplication *) application  didReceiveRemoteNotification:(NSDictionary *)userInfo

{

    //当用户打开程序时候收到远程通知后执行  

   if (application.applicationState == UIApplicationStateActive) {  

 

       UIAlertView *alertView = [[UIAlertView allocinitWithTitle:@"新消息提示"  

                                                           message:[NSString stringWithFormat:@"\n%@",  

                                                                     [[userInfo objectForKey:@"aps"objectForKey:@"alert"]]  

                                                          delegate:self  

                                                 cancelButtonTitle:@"确定"  

                                                 otherButtonTitles:nil];  

        [alertView show];  

      [alertView release];  

    }  

        

}

 

在这里与服务器通信

-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

 

}

 

 

另外:

可以在这个方法里面把icon图标数字变为零,(这个主要根据软件需要)

- (void)applicationDidBecomeActive:(UIApplication *)application {

    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

}


 

请求和保存设备令牌

您的 iOS 应用程序需要请求用户许可,在它所安装的设备上接收推送通知。通常情况下,您可以通过一个简单的 API 调用在应用程序代理中实现这一点,如清单 1 所示:


清单 1. 请求用户许可

[[UIApplication sharedApplication]
    registerForRemoteNotificationTypes:
        (UIRemoteNotificationTypeBadge |
         UIRemoteNotificationTypeSound | 
         UIRemoteNotificationTypeAlert)];


如果用户授予许可,应用程序会自动联系 APNs 服务器获取设备令牌。令牌使 APNs 可以将该特定设备上所安装的这个特定应用程序识别为一个消息目的地。这个过程是自动的,并且在后台执行。您不需要为它编写任何代码。

在 APNs 服务器响应后,应用程序代理中的 didRegisterForRemoteNotificationsWithDeviceToken 方法被调用,并将设备令牌作为一个调用参数传递进来。您必须保存设备令牌并将它上传到自己的推送通知服务器,如清单 2 所示:


清单 2. 接收一个 ID 并将它上传到服务器

- (void)application:(UIApplication*)application
         didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {

    NSString *tokenStr = [deviceToken description];
    NSString *pushToken = [[[[tokenStr 
      stringByReplacingOccurrencesOfString:@"<" withString:@""] 
      stringByReplacingOccurrencesOfString:@">" withString:@""] 
      stringByReplacingOccurrencesOfString:@" " withString:@""] retain];

   // Save the token to server

   NSString *urlStr = [NSString stringWithFormat:@"https://%@/push_token", RINGFULDOMAIN];
    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
        
   [req setHTTPMethod:@"POST"];
   [req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
   NSMutableData *postBody = [NSMutableData data];
   [postBody appendData:[[NSString stringWithFormat:@"username=%@", username] 
      dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"&token=%@", 
      pushToken] dataUsingEncoding:NSUTF8StringEncoding]];

   [req setHTTPBody:postBody];
   [[NSURLConnection alloc] initWithRequest:req delegate:nil];
}


在理想情况下,您将令牌与一些标记用户的信息(如在您的系统中的个人用户名)相关联,使您的服务器知道稍后要将消息发送给谁。(您可以将它想 像为类似于将电话号码与个人姓名相关联。)如果您没有将令牌与自己的用户标识信息关联,您仍然可以将消息发送到这些设备,但您不能为每个用户自定义消息, 因为您所拥有的是一个目标设备的字母令牌字符串。

服务器应该将令牌及其相关的标识信息保存在数据库中。在大多数应用程序中,它被保存在用户配置文件数据库中。

回页首

发送一个推送消息

要发送一个推送消息,您的服务器:

  1. 查找即将发送消息的目标应用程序 ID 列表

  2. 根据收件人的用户配置文件为每个收件人个性化消息

  3. 联系 APNs 消息服务器

APNs 服务器的 Web 服务 API 很复杂。对 Java 开发人员来说幸运的是,开源 JavaPNS 库可以使其使用变得更简单。JavaPNS 和下载和文档链接参见 参考资料

清单 3 中的代码显示了如何使用 JavaPNS 库向设备发送类似于短信的消息:


清单 3. 发送一个推送消息

String[] devices = {"token1", "token2};
Listnotifications
 = Push.alert("Hello World!", "keypair.p12", "password", false, devices);


JavaPNS 库的主界面方法是在 Push 类中的静态方法。APNs 允许您在消息中嵌入各种内容。请参阅 iOS 推送消息指南,获取所支持的负载类型的完整清单(参见 参考资料)。Push 类为每种类型的消息提供方便的方法,并且它将消息的转换为 APNs 服务器接受的 JavaScript Object Notation (JSON) 格式。在 清单 3 中,keypair.p12是从 KeyChain Access 导出的 p12 文件,password 是 p12 文件的密码。devices 阵列是从 iOS 应用程序接收的设备令牌列表。所有这些设备都将收到这个推送消息。在参数中的 false 值指定该消息应发送到 APNs 开发服务器(沙箱),而不是其生产服务器。(回忆一下,您通常为沙箱创建一个 p12 密钥对,为生产服务器创建一个不同的密钥对。)

方法调用返回的值是一个 PushedNotification 对象的列表,您可以用它来确定推送交付的状态,如清单 4 所示:


清单 4. 检查推送交付的状态

for (PushedNotification notification : notifications) {
    if (notification.isSuccessful()) {
        /* Apple accepted the notification and should deliver it */
    } else {
        String invalidToken = notification.getDevice().getToken();
        /* Add code here to remove invalidToken from your database */
    }
}


如果通知对象告诉您,有某个设备令牌不再处于激活状态,例如,如果用户从设备中删除了该应用程序,或在应用程序设置中禁用了通知,您应该从数据库中删除该令牌,以便您不会再向它发送消息。

保持最新的活动设备令牌列表的另一种方式,是让您的服务器应用程序定期检查 APNs 服务器。清单 5 显示了如何查询 APNs 反馈服务,使用 JavaPNS 从 APNs 沙箱接收一个无效设备令牌的列表:


清单 5. 检查以更新活动的设备令牌

ListinactiveDevices = Push.feedback("keypair.p12", "password", false);
/* remove inactive devices from your own list of devices */


不要将资源浪费在将消息发送到已删除您的应用程序的设备,或选择不接收通知的设备,这一点很重要。

回页首

其他考虑事项

推送通知不能在 iOS 模拟器上进行测试;您必须将应用程序部署到实际设备上对其进行测试。因为用于对消息进行身份验证的数字证书被捆绑到应用程序的配置概要文件,您需要使用在 开发或临时分发应用程序中的开发证书进行测试。在应用程序通过审批并在 App Store 中提供后,您必须切换到生产证书。

此外,重要的是要理解,为大数据库中的用户定制和发送推送消息是一项资源密集型工作。例如,每 5 秒遍历一次一个百万用户级的数据库,以确定 10 个当时需要收到消息的用户,这成本非常高。服务器端的基础架构需要精心的设计和规划,以支持对大量用户的频繁推送通知。相反,一次向一百万个用户发送推送 消息会产生大量的流量,因此通过使用一个线程池可以更好地处理这一场景,而不是阻止一个单独线程。JavaPNS 库提供一个简单的 API,它使用线程池,可以同时将消息推送给大量设备。

回页首

结束语

推送技术让您的服务器应用程序绕过电信运营商,并直接通过 Internet 向 iOS 设备的应用程序发送消息。虽然实现推送通知并非小事(客户端 SSL 证书对 Apple 服务器的身份验证需求很复杂),但是来自 Urban Airship 和 JavaPNS 等第三方的帮助可以使发送通知更加容易。SMS 和 MMS 有自己的位置,并且仍然比推送技术更可靠,但您可以通过实现推送消息使您的 iOS 应用程序更加丰富,提供更多的功能。


本文转载自:http://blog.itpub.net/12231606/viewspace-1076355/

hejunbinlan
粉丝 42
博文 596
码字总数 21569
作品 0
浦东
高级程序员
私信 提问
推送通知是否被系统禁用的状态

可不可以获取到推送通知是否被系统禁用的状态 if (IS_IOS8) { if ([[UIApplication sharedApplication] currentUserNotificationSettings].types!=0) { cell.detailTextLabel.text=NSLocaliz......

Snaiper
2016/02/17
66
2
ios8/sdk8/xcode6/iphone6(+)适配

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html#//appleref/doc/uid/TP40006556-CH27-SW1 Table 39-1Size (in pixels) of cu......

xiahuawuyu
2015/12/06
37
0
iOS----------获取通知状态并跳转设置界面设置

跳转app对应的系统通知设置 if (UIApplicationOpenSettingsURLString != NULL) { UIApplication *application = [UIApplication sharedApplication]; NSURL *URL = [NSURL URLWithString:UI......

iOS张文权
05/07
0
0
iOS 推送 获取手机设备的 deviceToken

第一步:申请证书: 第二步:申请app ids,应用名字必须一致。然后再进入进行编辑,使其enable,绿灯。 第三步:申请provisioning profile,生成.mobileprovision,双击该证书才能正确导入手机...

1054949000
2014/10/14
30.3K
2
iOS开发之判断用户是否打开APP通知开关

标签: enabledRemoteNotificiOS通知iOS是否开启推送开关currentUserNotificat 1.最近在做app内部的推送开关功能。 这样顾客可以自己定义推送给他的内容,屏蔽不想要的一些烦人推送。 在开发...

Youth_关旋
2016/11/14
53
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
10
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
23
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部