您的位置:首页 > 移动开发 > IOS开发

2.iOS苹果推送-一些示例代码和注意的问题

2015-09-01 16:52 1016 查看
1. 程序启动时每次收到推送 或 程序未启动通过推送消息启动程序时,都将会触发appdelegate里面的方法(注意要跟服务器的证书一直,比如开发环境,服务器也要用开发证书的pem才行):

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

{

//////////这里是收到推送后的逻辑代码

// 需要 #import

AudioServicesPlaySystemSound(1007); //系统的通知声音

AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);//震动

//自定义声音

NSString *path = [[NSBundle
mainBundle] pathForResource:@"message" ofType:@"wav"];

//组装并播放音效

SystemSoundID soundID;

NSURL *filePath = [NSURL
fileURLWithPath:path isDirectory:NO];

AudioServicesCreateSystemSoundID((__bridge CFURLRef)filePath,
&soundID);

AudioServicesPlaySystemSound(soundID);

//声音停止

AudioServicesDisposeSystemSoundID(soundID);

}

userInfo默认包含以下内容:

aps = {

alert = "";//推送显示的问题信息在这里

badge = 0;//app的icon右上角的推送数字 在这里设置

sound = "";

};

如果需要添加自定义的字段,就让服务器的小伙伴们 跟aps同一层级添加一个数组(以Json为例):

{

  "aps" : { "alert" : "This is the alert text", "badge" : 1, "sound" : "default" },

  "server" : { "serverId" : 1, "name" : "Server name")

}

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


launchOptions中会有推送消息的userInfo信息,此时我们可以通过
NSDictionary*
remoteNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];


获得推送消息内容。如果remoteNotification不为空,则说明用户通过推送消息进入,那么可以声明一个属性
@property
(nonatomic)

BOOL isLaunchedByNotification;


用于标识用户是否通过点击通知消息进入本应用。

此时,
- (void)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo


一定会被调用,iOS7可以使用
- (void)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void
(^)(UIBackgroundFetchResult))completionHandler


因为此方法的调用时,MainViewController已经被初始化,所以我们已经可以在MainViewController注册推送消息的监听,用于展示对应的视图,如下:
//订阅展示视图消息,将直接打开某个分支视图[[NSNotificationCenter
defaultCenter] addObserver:self selector:@selector(presentView:)
name:@"PresentView" object:nil];//弹出消息框提示用户有订阅通知消息。主要用于用户在使用应用时,弹出提示框[[NSNotificationCenter
defaultCenter] addObserver:self selector:@selector(showNotification:)
name:@"Notification" object:nil];


所以在AppDelegate的didReceiveRemoteNotification中可以通过判断isLaunchedByNotification来通知不同的展示方法。

退出登录后使用[[UIApplication sharedApplication] unregisterForRemoteNotifications];//注销推送消息

友盟详细解释:

如果 App 状态为未运行,此函数将被调用,如果launchOptions包含UIApplicationLaunchOptionsLocalNotificationKey表示用户点击apn 通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击apn而被启动,可能为直接点击icon被启动或其他。

-
(BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions;


//
apn 内容获取:NSDictionary *remoteNotification = [launchOptionsobjectForKey:

UIApplicationLaunchOptionsRemoteNotificationKey]


如果 App状态为正在前台或者后台运行,那么此函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:

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


//
apn内容为userInfo


如果是使用 iOS 7 的 Remote Notification 特性那么处理函数需要使用--该特性见博文4

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

(NSDictionary *)userInfofetchCompletionHandler:(
void
(^)(UIBackgroundFetchResult))completionHandler;


//
apn内容为userInfo


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: