【问题标题】:Calling a function with push notification使用推送通知调用函数
【发布时间】:2013-01-29 16:54:58
【问题描述】:

我为我的 iPhone 应用程序制作了自己的推送通知服务器。我正在向客户端设备发送不同的推送通知。现在有了一个特殊的通知,我想在 appDelegate 或任何地方调用一个特定的函数。

我该如何实现?

【问题讨论】:

  • 虽然我喜欢这个想法 +1。你允许这样做还是苹果会拒绝它。我以为你只能通知用户他们有某种通知,而不是在他们不知道的情况下开始运行不同的功能。
  • @Popeye 它只是一个弹出窗口,如果他们想要执行特定的功能会通知他们:) 我认为没有理由反对
  • 好的。我以为你想在不让他们知道的情况下这样做。误解仅此而已。

标签: iphone objective-c


【解决方案1】:

你不能指定一个函数来直接调用

当应用程序启动时,-(BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 被调用并传递UIApplicationLaunchOptionsRemoteNotificationKey 下选项中的注释

当应用程序运行时,你有application:didReceiveRemoteNotification:


你可以传递一个方法的名称来调用通知!所以:

...
NSString *methodName = [notificationUserInfo objectForKey:@"methodName"];
[self performSelector:NSSelectorFromString(methodName)];
...

服务器端 JSON 将包含 methodName 键: 如此处所示,我们可以包含我们喜欢的所有内容APNS JSON PAYLOAD - more arguments

{"aps":{"alert":"APP_NAME': BLA_BLA_BLA","sound":"default"}, "methodName":"xy"}

【讨论】:

  • 在服务器上添加 methodName="xyz" 到 userInfo JSON
  • {"aps":{"alert":"APP_NAME': BLA_BLA_BLA","sound":"default"}} 目前是我的有效载荷,你建议什么?
  • @MuhammadUmar 见stackoverflow.com/questions/5954882/… 所以在你的情况下 {"aps":{"alert":"APP_NAME': BLA_BLA_BLA","sound":"default"}, "methodName":"xy "}
【解决方案2】:

当用户通过通知启动应用时,可能会有不同的场景:

它没有启动,然后应用程序以默认方式启动,您可以这样处理通知:

-(BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UILocalNotification *remoteNotif =
        [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (remoteNotif) {
        //handle remote notification
    }
    ....
}

如果应用在后台或前台,调用委托方法

- application:didReceiveRemoteNotification: {
    if (application.applicationState == UIApplicationStateActive){
        //application was in foreground
    } else if (application.applicationState == UIApplicationStateInactive){
        //application was in background
    }
}

另外,如果应用程序在前台 - 系统不显示警报,不要更改徽章图标或播放声音 - 您应该完全自己处理通知

【讨论】:

  • 问题是我如何知道正在发送什么类型的通知。是否调用函数:)
  • @MuhammadUmar 看到我的回答。但他是对的。你不能直接这样做:)但是我过去也使用过一种方法
猜你喜欢
  • 2018-07-08
  • 1970-01-01
  • 2015-05-12
  • 2018-05-31
  • 1970-01-01
  • 2015-08-19
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多