本系列教程写于2016年9月,所用开发环境是
XCODE(7.3.1),
SWIFT(3.0),
PHP(5.5.36),
APACHE(2.4.18)
禁止转载!
如果在看这篇教程之前,如果没有看过前面的章节,你可以回去看看一看前面的章节
用XCODE打开我们之前创建的APNsDemo,先进行一项配置然后进入Coding阶段
左边点击项目名称->选择Build Settings->找到Code Signing这一栏->点击Provisioning Profile属性点击右边的上下箭头弹出选择框->选择我们在上一章创建的配置文件(如果你没有改名字的话,应该叫做APNsDemoProfile)
如果你在弹出框里没有找到这个配置文件,那么就去APNsDemoFiles文件夹找到你下载的配置文件,然后双击将它安装到本地,再回到XCODE里面它就会出现了
现在XCODE的项目配置没有问题了,我们可以写一些代码了,首先,打开AppDelegate.swift
,找到application(:didFinishLaunchingWithOptions)
这个函数,将这个函数改写成如下形式
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//初始化一个通知类型集合,这个集合中包括:提醒Alert、图标右上角的徽章Badge、声音Sound
let types: UIUserNotificationType = [UIUserNotificationType.Alert,UIUserNotificationType.Badge,UIUserNotificationType.Sound]
//初始化通知设置
let setting = UIUserNotificationSettings(forTypes: types, categories: nil)
//注册一个通知设置
UIApplication.sharedApplication().registerUserNotificationSettings(setting)
//注册一个远程通知
UIApplication.sharedApplication().registerForRemoteNotifications()
return true
}
如上面注释一样,这四句话对APP的远程推送功能进行了注册,前提是当程序提示我们是否允许远程推送的时候我们要点击允许
现在将测试用的IPhone(就是在证书那一章你用来读取UDID的那台设备)连接到你正在开发的MAC上,然后在XCODE左上角设备选择那里选择这台真实的设备
然后运行程序,在IPhone上会看到这样的提示,这说明我们申请远程推送设置成功了,由于我的手机是英文环境,如果是中文环境这个提示应该是中文的
回到 AppDelegate.swift
,现在注册成功了远程推送,还要获取这个APP的DeviceToken
,我会在程序里加入下面几个代理函数,来获取远程通知的回调函数,这些代理函数的定义都是继承自’UIApplicationDelegate’这个类的
//注册成功并返回deviceToken值
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
print(deviceToken)
}
//接收到推送通知 并返回userInfo
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
print(userInfo)
}
//注册远程推送失败并返回错误消息
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
print(error)
}
有这三个函数就够了,在这三个函数里面,我分别在控制台打印出了deviceToken、userInfo、error,当然如果注册成功的话是不会调用第三个函数了,而第二个函数也仅是在有远程推送到达并且APP程序在后台或前台运行的时候才会调用,那么如果APP程序退出后接收到推送通知会怎么样呢?如果你不点击通知,那么APP不会启动,如果你点击了通知,APP会启动,并且运行application(:didFinsihLaunchingWithOptions)
这个函数,而不会运行application(:didReceiveRemoteNotification)
这个函数,这点大家要注意。
但是不管如何,application(:didRegisterForRemoteNotificationsWithDeviceToken)
这个函数是每次注册成功都会运行的,都会返回一个DeviceToken,为什么要说每次呢?是因为这个DeviceToken不是一直不变的,当你卸载APP重新安装、更新系统等一些情况下,都会有可能重新获取一个DeviceToken,之前的那个肯定就没有用了,这时候上面这个代理函数就会运行。
现在重新运行程序,注意XCODE的控制台输出,应该是这样的
这个64位的16进制编码就是我们打印出来的deviceToken,保存下来,一会我们会用到的。
APP客户端的程序写到这里就够了,具体接收到推送消息如果处理不在这篇教程的范围内了,下面我将用一个第三方软件测试一下我的APP是否真的可以接收到远程通知,下一章再详细的讲解如何自己写一个服务器端(provider)
打开APP Store(我指的是mac上的,不是IPhone),搜索easy apps
,这个东西,下载下来
打开这个软件,点击Add tokens… ,把刚才记下来的device token加进去,起一个名字叫test吧,注意如果你复制粘贴的时候中间有空格是不行的,提前把空格括号什么的都删掉,只留下64位16进制数就好了,加进去后注意外面还有一个”Choose Certificate File” 点击这个按钮,选择APNsDemoFiles文件里面的apns_development.cer文件,如果你没有这个文件了,那么就去苹果开发者中心的证书栏里重新下载下来吧,这个文件是你进行远程推送的认证证书,接着点击Connect to…,注意右边那个服务器要选择gateway.sandbox.push.apple.com(沙盒测试服务器),如果连接成功会像是下面这样
右上角PlayLoad那一栏是设置PlayLoad的,PlayLoad你可以理解为就是消息推送的内容,JSON格式的,规定了消息的内容,声音,右上角显示的数字这些内容,具体看这里
然后点击Send APN,发送消息,如果你IPhone上的APP是在前台,是看不到推送消息的,你需要关闭它或者把它放在后台才能看到推送消息。如果esay apns告诉你消息发送失败,请检查你的证书配置和Device Token配置。
客户端编写到这里就结束了,下一章我们将讲解利用Apache+mysql+php构建一个简单的Provider