AppleWatch开发入门七——watchOS中通知的应用

AppleWatch开发入门七——watchOS中通知的应用

1、引言

        在iOS系统中,支持的通知有两种类型:本地通知和远程通知。本地通知多用于计时类通知,远程的又称推送,多用于一些提示动态的提示信息。这里有相关通知的一些知识总结:json

本地推送:http://my.oschina.net/u/2340880/blog/405491数组

远程推送:http://my.oschina.net/u/2340880/blog/413584iphone

        在watch中,通知是和iphone同步的,在iphone上的App收到通知的同时,会默认也推送到watch上,基于watch的穿戴性,对用户来讲,它上面的通知信息将比iphone更加及时。ide

2、WatchOS通知概览

        首先,watch上的通知分为两部分:short-look和long-lock。简而言之,short-look,能够理解为一个简单的通知预览,它会将通知发起的APP和主要标题等信息展现给你,让你一目了然,当用户抬起手腕,查看这个通知必定时间,这个短通知就会转换为long-look通知。short-look的通知界面咱们不可以自定义,系统为咱们设计好了模样,以下:测试

长通知的界面咱们是能够进行必定程度上的自定义的,而且能够添加按钮等逻辑操做。this

        long-look也分为两种界面,静态界面和动态界面。这个也好理解,静态界面是咱们在写程序时就定义好的界面,在通知发送到watch上时,界面会自动匹配通知内容进行显示。动态的界面则是当收到通知时,会先执行咱们相应的配置代码,以后在进行通知界面的展现。一个long-look界面大体以下:spa

在long-lock中,界面定义为三个部分,头部标题栏,自定义视图栏和按钮交互区。头部的标题栏咱们不能自定义,它是一个半透明的上面有App图标和名字的横栏。其下面是咱们能够自定义的区域,咱们能够在storyBoard中拉入文本和图片。最下面是一些交互按钮,其名称等配置信息在推送的文件中定义。.net

3、如何在模拟器上模拟远程推送

        在watchOS模拟器上,Xcode为咱们准备好了一种能够模拟测试推送的方式。若是咱们建立项目时,选择了NotifacationScene,则Xcode会默认为咱们建立一个apns文件:debug

这个文件就是模拟推送的相关配置文件,若是没有,咱们也能够手动来建立:设计

文件中的内容格式以下:

{
    "aps": {
        "alert": {
            "body": "通知",
            "title": "通知来了"
        },
        "category": "myCategory"
    },
    
    "WatchKit Simulator Actions": [
        {
            "title": "First Button",
            "identifier": "firstButtonAction"
                                   
        }
    ],
    
    "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App."
}

这是一些json格式的数据,其中alert是对推送内容的设置,body会显示在long-look的标题栏,title会显示在short-look的标题栏,Actions数组中是对按钮就行配置,每个按钮能够设置一个标题和id,标题用于在推送界面显示,id用于处理点击按钮后触发的逻辑。

建立好这个,咱们能够来试着测试一下推送的界面,选择推送工程,运行便可:

4、long-look的静态界面和动态界面

        上面提到过,long-look分为静态界面和动态界面两种,当咱们在storyBoard中拉入一个Notification Interface Controller的时候,能够选择同时建立动态界面,勾选 Has Dynamic Interface:

这时,在storyBoard中是以下模样:

咱们在建立一个文件,继承于WKUserNotificationInterfaceController,并将storyBoard中动态的的推送controller的class设置为咱们建立的类:

注意,这里设置的是动态的Interface,也就是上面右边的controller。以后运行,你会发现效果并无什么改变,那是由于系统默认会从静态界面加载推送界面,咱们须要在NotifacationController代码中作一些操做:

//在NotificationController中重写下面两个方法
//这个用于本地推送
override func didReceiveLocalNotification(localNotification: UILocalNotification, withCompletion completionHandler: ((WKUserNotificationInterfaceType) -> Void)) {
        //在这里作一些动态界面的加载操做,好比能够根据推送的数据 设置图片 文字等
        
        //下面这个方法决定是加载静态的界面仍是动态的界面
        //Custom是加载动态界面
        //default是加载静态界面
        completionHandler(.Custom)
    }
    
    
//设个用于远程推送    和上面方法相似
override func didReceiveRemoteNotification(remoteNotification: [NSObject : AnyObject], withCompletion completionHandler: ((WKUserNotificationInterfaceType) -> Void)) {
       
        completionHandler(.Custom)
    }

5、触发推送点击事件

        首先,咱们多配置几个点击按钮,在apns文件中以下配置:

"WatchKit Simulator Actions": [
                                   {
                                   "title": "第一",
                                   "identifier": "one"
                                   
                                   },
                                   {
                                   "title": "第二",
                                   "identifier": "two"
                                   
                                   },
                                   {
                                   "title": "第三",
                                   "identifier": "three"
                                   
                                   }
                                   ],

在咱们watch App的InterfaceController中实现以下的方法:

//重写下面两个方法来响应点击事件
//远程推送的方法
override func handleActionWithIdentifier(identifier: String?, forRemoteNotification remoteNotification: [NSObject : AnyObject]) {
        //经过咱们配置的按钮id来区分点击的按钮 处理响应的逻辑
        print(identifier)
    }
//本地推送的方法
override func handleActionWithIdentifier(identifier: String?, forLocalNotification localNotification: UILocalNotification) {
        
    }

 

专一技术,热爱生活,交流技术,也作朋友。

——珲少 QQ群:203317592

相关文章
相关标签/搜索