`
janedoneway
  • 浏览: 582141 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

iOS本地通知和远程通知

 
阅读更多

From: http://www.cocoachina.com/newbie/tutorial/2012/0104/3827.html

 

 

本篇文章主要是整理一下有关通知的相关知识。主要介绍:

  • 本地通知
  • 远程通知

本文参考:

本地通知 

本地通知,local notification,用于基于时间行为的通知,比如有关日历或者todo列表的小应用。另外,应用如果在后台执行,iOS允许它在受限的时间内运行,它也会发现本地通知有用。比如,一个应用,在后台运行,向应用的服务器端获取消息,当消息到达时,比如下载更新版本的提示消息,通过本地通知机制通知 用户。

本地通知是UILocalNotification的实例,主要有三类属性:

  • scheduled time,时间周期,用来指定iOS系统发送通知的日期和时间;
  • notification type,通知类型,包括警告信息、动作按钮的标题、应用图标上的badge(数字标记)和播放的声音;
  • 自定义数据,本地通知可以包含一个dictionary类型的本地数据。

对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略。

 

如果就写个简单的定时提醒,是很简单的,比如这样:

 

示例写的很简单,启动应用后,就发出一个定时通知,10秒后启动。这时按Home键退出,一会儿就会提示上图的提示信息。如果应用不退出则无效。

代码如下:

UILocalNotification *notification=[[UILocalNotification alloc] init];
if (notification!=nil) {
    NSLog(@">> support local notification");
    NSDate *now=[NSDate new];
    notification.fireDate=[now addTimeInterval:10];
    notification.timeZone=[NSTimeZone defaultTimeZone];
    notification.alertBody=@"该去吃晚饭了!";
    [[UIApplication sharedApplication]   scheduleLocalNotification:notification];

 

更详细的代码见官方文档:《Scheduling, Registering, and Handling Notifications》,可以设置比如声音,比如用户定义数据等。

设置更多本地通知的信息:

  • 设置icon上数字:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
    // Override point for customization after application launch.
    /////////////
    application.applicationIconBadgeNumber = 0;
    // Add the view controller’s view to the window and display.
    [self.window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

 

 

  • 添加通知时间,通知类型,取消通知

 

#pragma mark –
#pragma mark onChageValue
-(IBAction)onChangeValue:(id)sender
{
    UISwitch *switch1=(UISwitch *)sender;
    if (switch1.on) {
        UILocalNotification *notification=[[UILocalNotification alloc] init];
        NSDate *now1=[NSDate date]; 
        notification.timeZone=[NSTimeZone defaultTimeZone];
        notification.repeatInterval=NSDayCalendarUnit;
        notification.applicationIconBadgeNumber = 1;
        notification.alertAction = NSLocalizedString(@"显示", nil);
        switch (switch1.tag) {
            case 0:
            {
                notification.fireDate=[now1 dateByAddingTimeInterval:10];
                notification.alertBody=self.myLable1.text;
            }
                break;
            case 1:
            {
                notification.fireDate=[now1 dateByAddingTimeInterval:20];
                notification.alertBody=self.myLable2.text;
            }
                break;
            case 2:
            {
                notification.fireDate=[now1 dateByAddingTimeInterval:30];
                notification.alertBody=self.myLable3.text;
            }
                break;
            default:
                break;
        }
        [notification setSoundName:UILocalNotificationDefaultSoundName];
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSString stringWithFormat:@"%d",switch1.tag], @"key1", nil];
        [notification setUserInfo:dict];
        [[UIApplication sharedApplication]   scheduleLocalNotification:
 notification];

    }else {
        NSArray *myArray=[[UIApplication sharedApplication] scheduledLocalNotifications];
        for (int i=0; i<[myArray count]; i++) {
            UILocalNotification    *myUILocalNotification=[myArray objectAtIndex:i];
            if ([[[myUILocalNotification userInfo] objectForKey:@"key1"] intValue]==switch1.tag) {
                [[UIApplication sharedApplication] cancelLocalNotification:myUILocalNotification];
            }
        }
    }
}

 


远程通知

  1. 设备的准备

首先要知道,push notification只能在真机上运行的,无法在模拟器上使用,如果在模拟器上运行,在注册设备的时候会有类似如下报错:

Error in registration. Error: Error Domain=NSCocoaErrorDomain Code=3010 "remote notifications are not supported in the simulator" UserInfo=0x5d249d0 {NSLocalizedDescription=remote notifications are not supported in the simulator}

真机也要注意,如果没有越狱,没有问题。越狱的话,比如通过blacksnOw,因为没有经过iTunes,无法生成有效的设备证书(device certificate),因此注册的时候不会成功。

检查越狱版本是否可用,可以ssh到设备上,执行命令:

ls /var/mobile/Library/Preferences/com.apple.apsd.plist  -l

-rw——- 1 mobile mobile 119 Aug 24 19:21 /var/mobile/Library/Preferences/com.apple.apsd.plist

返回的文件大小是119,就没有问题。

2.获取device token的原理

在说操作步骤之前,先说一下获取device token的一些原理方面的事情。

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

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

3.获取device token的操作步骤

这里主要参照了这篇文章:Programming Apple Push Notification Services

该文档很详细,照做就应该没有问题。

需要注意的是identifier一定要和provision portal profile中的app id一致,即:

要和:

一致。

另外,要确保设备绑定的是唯一的profile:

编写代码,是在AppDelegate中增加两个方法:

  • didRegisterForRemoteNotificationsWithDeviceToken:当应用 第一次运行的时候,ios获取到device token后调用,用于注册设备到apns上之后的操作(比如将device token通知应用的服务器端provider)
  • didFailToRegisterForRemoteNotificationsWithError:如果注册的时候失败,ios会调用这个方法,可以打印一些报错日志或者提醒用户通知不可用

另外,有一个方法需要增加内容,主要是打印日志,说明是否已经注册:

- (void)applicationDidFinishLaunching:(UIApplication *)application {   
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
    NSLog(@"Initiating remoteNoticationssAreActive");
    if(!application.enabledRemoteNotificationTypes){
        NSLog(@"Initiating remoteNoticationssAreActive1");
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];
    }
    UIApplication* myapp = [UIApplication sharedApplication];
    myapp.idleTimerDisabled = YES;
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}

第一次运行带注册方法的应用,会看到类似这样的提示窗口:

然后,在日志中看到类似下面的日志,主要是看到打印出device token的64位字符串,就说明成功了。

5.获得证书

苹果提供两种接入方式的证书:

  • developer,用于测试
  • production,用于产品

如果是内部测试,使用developer方式即可。

下载证书,通过ios provisioning portal:

这要求:

  • 登录的apple developer program帐号必须是级别最高的agent(这是针对企业帐号来说的,如果是个人帐号就无所谓了),agent帐号即创始帐号,否则看不到configure链接;
  • 必须经过configure操作,已经enable了developer和product。

然后进入configure链接,点击download按钮即可:

6.处理证书

如果是编写在mac下跑的objc程序,无需对证书做处理,可跳过这一步。

如果是在java下使用,需要把打证书用的私有专用密钥和上述的支持通知的证书(注意,不是iphone developer证书)合并导出。

生成证书:

点击存储的时候,会提示生成一个文件密码:

当然可以密码为空。

之后会提示:

这里需要输入mac登录用户的密码。

文件生成。

7.编写发送通知的实例

如果是编写mac代码,有一个现成的项目可用:http://stefan.hafeneger.name/download/PushMeBabySource.zip

导入到xcode中,只需将:

deviceToken填写成设备的token字符串,另外,pathForResource改为上面图中的:

aps_developer_identity

另外,要把刚才获得证书步骤中下载的证书复制到xcode项目Resources目录下:

可以看到文件名和上面的pathForResource的参数一致。

之后运行程序就可以在设备上收到推送通知。

如果是用java编写,可以用第三方库,见:

http://code.google.com/p/javapns/

编写简单的发送通知代码:

import org.json.JSONException;

import javapns.back.PushNotificationManager;
import javapns.back.SSLConnectionHelper;
import javapns.data.Device;
import javapns.data.PayLoad;

public class Main {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
         PayLoad simplePayLoad = new PayLoad();
        // Get PushNotification Instance
         PushNotificationManager pushManager = PushNotificationManager.getInstance();
         // Link iPhone’s UDID (64-char device token) to a stringName
         pushManager.addDevice("iPhone", "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ");
         simplePayLoad.addAlert("My alert message测试");
         simplePayLoad.addBadge(1);
         simplePayLoad.addSound("default");
         Device client = PushNotificationManager.getInstance().getDevice("iPhone");
         PushNotificationManager.getInstance().initializeConnection("gateway.sandbox.push.apple.com", 2195, "/home/ubuntu/mypush.p12", "password", SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
         PushNotificationManager.getInstance().sendNotification(client, simplePayLoad);

测试中文没有乱码问题。

编写比较复杂的使用示例(可以控制通知是否有提示窗口、是否有提醒声音):

  • aPayload.addBadge( 2),显示在手机应用图标上的数字
  • aPayload.addAlert("软件版本有更新"),显示提示窗口文字
  • aPayload.addSound("default.wav"),指定提示声音

另外,也可以使用php的第三方实现,比如:

http://code.google.com/p/php-apns

基本原理是启动一个php服务,监控memcacheq队列,如果有消息就发送给苹果服务器。

 

分享到:
评论

相关推荐

    ios本地和远程推送通知编程指南

    开发者可以使用`UNUserNotificationCenter`类来安排本地通知,包括一次性通知和重复性通知。 ##### 2.3 处理远程推送通知 为了接收远程推送通知,应用需要在用户设备上注册一个设备令牌,并将其发送给服务器。...

    iOS开发本地和推送通知编程指南

    ### iOS开发本地和推送通知编程指南 #### 概览 本指南主要介绍如何在iOS应用中实现本地通知和推送通知的功能。本地通知是指由应用程序自身触发的通知,而推送通知则是指通过苹果推送通知服务(Apple Push ...

    swift-iOS10本地通知封装

    在iOS开发中,本地通知(Local Notification)是应用在用户不活跃时与用户进行交互的重要方式,尤其在iOS10及以后的版本中,苹果引入了全新的UserNotifications框架,为本地通知提供了更强大的功能和更灵活的配置。...

    ios自定义弹出本地通知

    在iOS平台上,本地通知是一种非常...在iOS开发中,理解和掌握如何创建、触发和响应本地通知是至关重要的。通过正确使用UserNotifications框架,开发者可以创造出既实用又具有吸引力的通知,提高用户对应用的满意度。

    iOS10.0本地推送通知.

    1. **本地通知**:与远程推送通知(通过Apple Push Notification Service, APNS)不同,本地通知是由应用本身在设备上创建和触发的,无需通过网络连接。它们在特定的时间、地点或事件发生时触发,如设定的闹钟或日程...

    ios 闹钟的总结-------也就是本地通知。

    - Xcode是iOS开发的主要工具,包含了创建和调试本地通知所需的所有功能。此外,`UserNotifications`框架提供了必要的API来处理本地通知。 总之,本地通知是iOS应用与用户进行交互的重要手段,无论是在设定的特定...

    IOS开发本地和推送通知编程指南

    在iOS开发中,本地通知和推送通知是两种用于在应用程序不在前台运行时提醒用户的重要机制。它们通常用于告知用户有新消息、即将到来的日程安排或者需要更新的数据等事件。本指南将介绍如何在iOS平台上实现本地通知和...

    IOS滚动文本通知

    当应用接收到新的数据或事件时,它可以通过苹果的本地通知框架或者远程推送通知服务向用户发送通知。以下是关于iOS滚动文本通知的一些关键知识点: 1. **通知中心**: iOS的通知中心是用户查看和管理所有未读和已读...

    ios-本地通知.zip

    1. 通知中心:用户可以在设备的通知中心查看所有收到的通知,包括本地通知和远程推送通知。 2. 通知类型:包括横幅、声音、标记以及锁屏显示等,可以根据需求自定义设置。 3. 通知请求:应用需要先向用户请求权限...

    本地通知与远程推送

    IOS关于本地通知与远程推送的文档:(developer 官方文档地址:...

    iOS10通知及通知拓展Extension使用

    但在iOS10中,苹果引入了UNUserNotificationCenter,这个新框架提供了对本地和远程通知的统一管理,包括请求权限、创建通知、调度通知等操作。例如,你可以通过`UNUserNotificationCenter.current()....

    ios 通知实现原理

    - **模拟通知**:在Xcode中,开发人员可以使用`Simulator`的`Hardware &gt; Send Notification`菜单项模拟本地或远程通知,这有助于在开发阶段测试通知功能。 - **模拟推送**:对于远程推送,开发者可以使用第三方...

    iOS本地推送与远程推送详解

    在iOS开发中,推送通知是一种非常重要的功能,它能够在应用程序不在前台运行时向用户发送消息提醒。根据推送方式的不同,可以将其分为本地推送和远程推送两种类型。这两种推送方式虽然最终效果相似,但其实现机制和...

    iOS学习——通知机制-代码

    在iOS开发中,通知机制(Notification)是一种非常重要的组件,用于在应用程序的不同组件之间传递信息。这个机制允许对象发送消息给其他对象,而无需知道接收者的具体身份,从而实现了松耦合的设计。本文将深入探讨...

    ios 通知中心

    本文将深入探讨“iOS通知中心”的相关知识点,包括本地通知和远程通知(Push Notification)、通知设置、自定义通知样式以及在实际开发中的应用。 一、本地通知 本地通知是应用程序在设备上预先安排的提醒,无需...

    ios——通知

    这里我们将深入探讨iOS的通知系统,包括本地通知(Local Notification)和远程通知(Remote Notification,通常与Apple Push Notification Service, APNs 相关联)。 一、本地通知 本地通知是应用在设备上预先设定...

    iOS 通知中心

    首先,我们要明白iOS中的通知分为本地通知和远程通知。本地通知是由应用本身在特定时间或条件触发的,而远程通知通常与Apple Push Notification Service (APNs) 相关联,由服务器端发送到用户的设备。 1. **设置...

    iOS10最新实现远程通知的开发教程详解

    在iOS开发中,远程通知是将消息从服务器推送到用户设备上的重要机制,尤其是在iOS10及以后的版本中,这一功能得到了显著增强。本文将详细介绍如何在iOS10上实现远程通知的开发。 首先,我们需要理解iOS推送通知的...

    ios-简单的本地通知.zip

    在iOS开发中,本地通知(Local Notification)是一种重要的系统功能,它允许应用在特定时间或者在用户不直接与应用交互时向用户发送消息。这个"ios-简单的本地通知.zip"文件很可能包含了一个简单的示例,教开发者...

    Java_React Native本地和远程通知.zip

    在这个“Java_React Native本地和远程通知.zip”压缩包中,我们关注的核心主题是移动应用中的通知机制,包括本地通知和远程通知。 本地通知(Local Notifications)是应用在本地设备上触发的通知,通常与用户当前的...

Global site tag (gtag.js) - Google Analytics