【问题标题】:Why doesn't callback get called when the app is in background?当应用程序在后台时,为什么不调用回调?
【发布时间】:2015-02-02 11:06:06
【问题描述】:

我正在开发一个钛应用程序,当推送通知进来时需要在 iOS 下显示Banner Message。因此我使用以下代码注册传入的推送通知:

var callbacks = {
    types: [
        Titanium.Network.NOTIFICATION_TYPE_BADGE,
        Titanium.Network.NOTIFICATION_TYPE_SOUND,
        Titanium.Network.NOTIFICATION_TYPE_ALERT
    ],
    success:function(e){
        console.log("success");
    },
    error:function(e){
        console.log("error");
    },
    callback: function(e){
        console.log("new push notification")
        //code for displaying banner message would go here!
    }
};

if(Ti.App.iOS.registerUserNotificationSettings){ //iOS 8 +
    function onUserNotificationSettings(){
        delete callbacks.types;
        Ti.Network.registerForPushNotifications(callbacks);
        Ti.App.iOS.removeEventListener("usernotificationsettings",onUserNotificationSettings);
    }
    Ti.App.iOS.addEventListener("usernotificationsettings",onUserNotificationSettings)
    Ti.App.iOS.registerUserNotificationSettings(callbacks)
}else{ //up to iOS 7
    Ti.Network.registerForPushNotifications(callbacks)
}

但是当应用程序在后台时,回调函数不会被调用。所以,我也不能在那里显示横幅消息,因为代码不会被执行。

应用程序在后台时未调用回调的原因可能是什么?当它在前台时,它工作得很好。正常吗?如果是,我还能将代码放在哪里来显示横幅消息?

我在装有 iOS 8.1.1 的 iPhone 5 上使用 SDK 3.4.0 版

请注意,通过 apn-payload 发送横幅文本不是解决方案。还有其他用例。例如,当服务器需要告诉客户端有新内容要同步时,用户甚至不需要收到通知。客户端应该在通知到达时在后台下载新内容。

【问题讨论】:

  • 应用在后台时不会触发回调。如果你想在应用在后台时执行一些代码,你需要在iOS中运行后台服务
  • @Anand 根据this,后台服务可以在应用程序终止后运行不超过 10 分钟。那之后呢?另外,我会在后台服务中做什么?轮询所有 X 秒? ://
  • iOS 横幅将显示您通过推送通知发送的任何文本。它不是基于回调。当您发送推送通知时,它应该包含有效负载。有效载荷将显示在那里。如果您打开了应用程序,则不会显示此横幅,因此我认为在回调中您正在尝试显示由您创建的横幅。对吗?
  • @Anand 由于多种原因(语言、服务器不知道等),我不想从服务器发送应该显示给用户的消息,我也不'不想设置来自服务器的通知(徽章)数量,因为只有客户端知道他有多少未读通知。服务器服务器只是告诉客户端有新消息。此外,服务器告诉客户端他应该下载一些新内容,例如在另一个登录的客户端上更改的配置文件信息。为此,我需要调用回调。
  • 为什么要投反对票?这是一个很好的问题,Titanium Docs 还没有回答。

标签: javascript ios push-notification titanium apple-push-notifications


【解决方案1】:

我已经找到方法了! 当应用程序处于后台时,回调被调用。我所要做的就是在ti:app/ios/plist/dict 中的tiapp.xml 中添加以下内容:

<key>UIBackgroundModes</key>
<array>
    <string>remote-notification</string>
</array>

之后,一切正常!

【讨论】:

  • 这是我在回答中告诉你的。为什么你又回答并接受了你的?
  • @Mike Gottlieb 你已经改变了你的答案。它之前没有说出正确的答案。如果你愿意,你可以得到赏金,否则它会被浪费掉;)
【解决方案2】:

您需要注册远程通知后台模式。这将唤醒您的应用并在您发送通知时为您提供执行时间。

记录在 Appcelerator 文档here

【讨论】:

  • 我已尝试收听此事件。但它也只是在我将我的答案中的代码添加到 tiapp.xml 之后才被调用。
  • 现在这个答案也是正确的。我会接受我的回答,因为它完全提供了解决方案,而在您的回答中,我必须访问一个链接并自己阅读。
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多