Remote Notification (一)

翻译 2017年01月03日 09:23:44
Configuring Remote Notification Support

远程通知甚至当你的app没有在设备上运行时也会将通知投递到用户设备端。大部分工作的实现依赖于你公司的server,但是你夜必须做如下的支持才可以:

开启你的app对远程通知的支持选项
在app加载期间注册APNs
实现对于远程通知的处理支持

Enabling the Push Notifications Capability

控制远程通知的app必须有合适的权利。你使用xcode中的capabilities pane来实现这些配置。

在工程导航中选择你的工程

在编辑器中,选择你的ios app target

选择capabilities tab

开启push notification capability image ../Art/push_notification_capability_2x.png

xcode将需要的权利添加到你的工程中

没有合适权限的app会在app store审核期间被拒。在测试过程中,没有合适权限的情况下注册apns会报错。
Registering to Receive Remote Notifications


每次你的app加载的时候,他必须注册了apns。你注册apns的方法根据不同的平台可能不同。主要的步骤如下:

使用平台特定的apis来从apns获得device token

将device token发送给你的server

对于特定的app和设备来说,device tokens是唯一的。你负责开启连接server的网络,并且将device token和其他的数据连同发送给server。在server端,使用device token和任何其他的数据来产生特定设备的远程通知。当把远程通知发送到一个设备上时,你必须总是包含设备token和数据当你将远程通知发送给一个设备的时候。

不要缓存device token,应当总是从系统来获得它们。尽管device token对于app和设备来说是唯一的,但是它们可以过段时间就发生变化。device token可以在任何时间改变,但是会保证当用户通过设备备份恢复设备的时候和之前的是不一样的。当用户把你的app安装到一个新的设备的时候,当用户重新安装操作系统的时候。都会改变device token。

IMPORTANT

当device token改变了,用户必须在远程通知被投递之前加载一次你的app。

watchos上运行的apps不会显示地注册远程通知。

Obtaining a Device Token on iOS and tvOS

在ios和tvos,通过registerForRemoteNotifications方法来获得device token。推荐你在app正常加载的时候来调用这个方法。当你第一次调用这个方法的时候,app对象从apns请求device token。当initial被调用后,app对象仅仅当device token改变的时候才会和apns通讯。否则,他会很快就返回这个device token。

app对象异步通知代理是否成功获取device token。你使用这些代理来处理device token或者处理错误。你必须实现以下的代理方法。

使用application:didRegisterForRemoteNotificationsWithDeviceToken:来获取device token并且发送到server端

使用application:didFailToRegisterForRemoteNotificationsWithError:来处理错误


NOTE

如果device token在app运行时改变了,app对象会调用合适的delegate方法来通知这个改变

Listing 4-1 shows how to fetch the device token for your iOS or tvOS app.

app调用registerForRemoteNotifications作为启动的设置部分。didRegisterForRemoteNotificationsWithDeviceToken方法将device token连接到sever端。如果在注册过程中发生了错误,app会立即禁用掉和远程通知相关的任何的特点。这个特性会在接收到device token后重新被可用。


Listing 4-1Registering for remote notifications on iOS


OBJECTIVE-C


- (void)applicationDidFinishLaunching:(UIApplication *)app {
    // Configure the user interactions first.
    [self configureUserInteractions];
 
   // Register for remote notifications.
    [[UIApplication sharedApplication] registerForRemoteNotifications];
}
 
// Handle remote notification registration.
- (void)application:(UIApplication *)app
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    // Forward the token to your server.
    [self enableRemoteNotificationFeatures];
    [self forwardTokenToServer:devTokenBytes];
}
 
- (void)application:(UIApplication *)app
        didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    // The token is not currently available.
    NSLog(@"Remote notification support is unavailable due to error: %@", err);
    [self disableRemoteNotificationFeatures];
}


SWIFT


func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Configure the user interactions first.
    self.configureUserInteractions()
    
    // Register with APNs
    UIApplication.shared.registerForRemoteNotifications()
}
 
// Handle remote notification registration.
func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
    // Forward the token to your server.
    self.enableRemoteNotificationFeatures()
    self.forwardTokenToServer(token: deviceToken)
}
 
func application(_ application: UIApplication,
                 didFailToRegisterForRemoteNotificationsWithError error: Error) {
    // The token is not currently available.
    print("Remote notification support is unavailable due to error: \(error.localizedDescription)")
    self.disableRemoteNotificationFeatures()

}

NOTE

如果在你的app运行期间,device token改变了,app对象会再次调用合适的delegate方法来通知你的变化。


Listing 4-2 shows how to fetch the device token for your macOS app. The app delegate calls the registerForRemoteNotificationTypes: method as part of its regular launch-time setup, passing along the types of interactions that you intend to use. Upon receiving the device token, the application:didRegisterForRemoteNotificationsWithDeviceToken: method forwards it to the app’s associated server using a custom method. If an error occurs during registration, the app temporarily disables any features related to remote notifications. Those features are reenabled when a valid device token is received.

Listing 4-2Registering for remote notifications on macOS
OBJECTIVE-C

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    // Configure the user interactions first.
    [self configureUserInteractions];
 
    [NSApp registerForRemoteNotificationTypes:(NSRemoteNotificationTypeAlert | NSRemoteNotificationTypeSound)];
}
 
- (void)application:(NSApplication *)application
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    // Forward the token to your server.
    [self forwardTokenToServer:deviceToken];
}
 
- (void)application:(NSApplication *)application
        didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"Remote notification support is unavailable due to error: %@", error);
    [self disableRemoteNotificationFeatures];
}
SWIFT

func applicationDidFinishLaunching(_ aNotification: Notification) {
    // Configure the user interactions first.
    self.configureUserInteractions()
    
    NSApplication.shared().registerForRemoteNotifications(matching: [.alert, .sound])
}
 
// Handle remote notification registration.
func application(_ application: NSApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Forward the token to your server.
    self.forwardTokenToServer(token: deviceToken)
}
 
func application(_ application: NSApplication,
                 didFailToRegisterForRemoteNotificationsWithError error: Error) {
    // The token is not currently available.
    print("Remote notification support is unavailable due to error: \(error.localizedDescription)")
}
Handling Remote Notifications

The User Notifications framework offers a single code path for handling many tasks associated with local and remote notifications. Specifically, you handle the following tasks using the same techniques:
如果你的app在前台运行,那么你可以直接接收这个通知并且使它静音
如果你的app在后台或者没有运行:
当用户选择一个和通知相关联的自定义action时你可以给出respond
当用户dismisses这个通知或者加载你的app时你可以给出respond

除了通过user notifications framework来处理通知,你的app也通过app delegate来接收远程notifications。当一个远程notification到达时,系统会在app处于后台的时候处理用户的处理交互。


iOS7 Background Remote Notification(后台远程通知——静默push)

iOS 7在推送方面最大的变化就是允许:应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新。功能使用场景:(多媒体)聊天,Email更新,基于通知的订阅内容同步...
  • hherima
  • hherima
  • 2016年01月06日 16:27
  • 9051

远程推送didReceiveRemoteNotification代理方法调用详细说明

前言 最近工作中实现远程推送点击状态栏的提醒,直接进入相应地详细界面的功能。遇到了问题,解决之后整理出来! UIApplication有两个关于接收到远程推送的代理: - application:d...
  • gang544043963
  • gang544043963
  • 2016年01月05日 13:20
  • 12317

add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.

[ application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remo...
  • quanqinayng
  • quanqinayng
  • 2014年12月17日 20:24
  • 7400

iOS推送警告but you still need to add "remote-notification" to the list of your supported UIBackgroundMod

在使用个推推送时,控制台报下: You've implemented -[ application:didReceiveRemoteNotification:fetchCompletionHandl...
  • MinggeQingchun
  • MinggeQingchun
  • 2016年09月12日 11:32
  • 1734

Remote Notification (一)

Configuring Remote Notification Support Remote notifications are a way for you to deliver up-to-date...
  • binglan520
  • binglan520
  • 2017年01月03日 09:23
  • 509

Android之利用RemoteViews自定义Notification

转载请注明出处:这是对别人劳动成果的尊重。 一、概述 RemoteViews从字面上看是一种远程视图。RemoteViews具有View的结构,既然是远程View,那么它就可以在其他进程中显示。由...
  • LoveYaozu
  • LoveYaozu
  • 2016年04月18日 12:47
  • 3180

APNS - ios Remote Notification

APNS 推送实现、相关基础内容、以及一些疑惑。
  • zzzhangdong
  • zzzhangdong
  • 2015年02月05日 15:54
  • 531

iOS 7 Background Remote Notification

简介 本次iOS 7在推送方面最大的变化就是允许,应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新。功能使用场景:(多媒体)聊天,Email更新,基于通...
  • zzzili
  • zzzili
  • 2014年06月04日 17:57
  • 1044

通过remoteViews自定义Notification通知栏的布局

remoteViews,是一种远程view,通过跨进程更新自己的界面,主要用于通知栏和桌面小部件的开发过程中。1、自定义Notification布局public class MainActivity ...
  • AsiaLYF
  • AsiaLYF
  • 2016年11月10日 19:24
  • 714

使用RemoteView发送通知栏消息,模拟下载进度

  • 2016年11月25日 21:33
  • 6.21MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Remote Notification (一)
举报原因:
原因补充:

(最多只允许输入30个字)