ios 接收到推送消息时实现持续响铃震动效果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios 接收到推送消息时实现持续响铃震动效果相关的知识,希望对你有一定的参考价值。
参考技术A 项目中需要实现一个功能:收到特定类型的推送消息时,需要一端持续的响铃加震动来提醒用户,普通的推送消息可以播放30s以内的提示音,但是只会震动一下,用ios提供的Notification Service Extension 可以实现连续震动的效果,它不依赖于APP的存活状态,会最多存活30s的时间。具体实现方式如下:1,创建Notification Service Extension扩展
创建完成后,会自动生成以下两个方法:
这里有三点需要注意:
1,只有调用self.contentHandler(self.bestAttemptContent);回调方法时,推送的通知条消息才会出现在应用中,如果一直不回调该方法,等30s后,系统会自动调用- (void)serviceExtensionTimeWillExpire方法;
2:ios的服务扩展可以和app进行通信,有多种通信方式比如利用通知中心 CFNotificationCenterRef,或者socket,这里我选择使用的是共享内存的方式:
"group.com.XXXXXX" 需要自己创建一个共享内存的组名,当用户点击推送通知时,根据名称找到当前内存,并设置一个值,在扩展中就能够获取该值了。
2,在扩展中,使用NSTimer作为计时器时,自测无效(个人认为因为NSTimer运行依赖于NSRunLoop导致的),无法触发计时器运行,使用dispatch_source_t能够很好地运行。
3,要想在扩展中接收到推送的消息,推送消息中还应该增加一个字段:“mutable-content”: 1
接收时执行 iOS 推送通知代码
【中文标题】接收时执行 iOS 推送通知代码【英文标题】:iOS Push Notification code execution on receive 【发布时间】:2015-03-10 10:33:34 【问题描述】:我正在为 iOS 开发消息应用程序。
我将用户的电话号码保存在服务器上,但我不在后端保存联系人姓名。
当用户收到来自服务器的推送通知时,服务器将电话号码和消息内容在通知负载中发送给用户。我实现了 application:didReceiveRemoteNotification:fetchCompletionHandler 方法来显示本地通知。我在本地数据库中查找 phoneContactName:phoneNumber 对并以以下格式显示本地通知:%phoneContactName%:%messageContent%
但是,障碍是我现在不知道如何在应用未运行时执行此代码。我尝试实现 application:didFinishLaunchingWithOptions 并在那里检查
NSDictionary *userInfo = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
但是这段代码没有被调用。
所以为了解决这个问题我想问你我应该使用什么架构模型。我应该在服务器端保留联系人姓名以从服务器端发送带有联系人姓名的 notification.alert(到目前为止我的服务器不知道联系人电话号码的名称)还是有什么方法可以在应用程序时执行代码没有运行?
附:此外,我在收到通知时计算客户端的徽章编号。所以,如果可能的话,代码执行方案会更好。
谢谢
【问题讨论】:
【参考方案1】:我认为您的架构是正确的。您的问题归结为您的应用当前所处的应用状态之一。
如果您的应用程序被终止或从未打开过,那么application:didFinishLaunchingWithOptions
中的上述代码将被执行,但是,如果您的应用程序处于后台或挂起状态,则将调用以下方法。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo`
因此您还需要在应用委托中实现这一点。
希望对你有帮助
【讨论】:
我的问题是 application:didFinishLaunchingWithOptions 在我的情况下没有被调用。我做错了吗?application:didFinishLaunchingWithOptions
仅在应用程序终止时调用。这通常是当设备打开或 iOS 操作系统终止进程时应用程序第一次运行。我假设应用程序正在从挂起状态打开,这意味着不会调用application:didFinishLaunchingWithOptions
。如果用户在应用程序处于此状态时通过通知打开您的应用程序,application:didReceiveRemoteNotification
是被调用的方法。
谢谢。正如我从相关答案中了解到的那样,应用程序:didFinishLaunchingWithOptions 在用户按下徽章时被调用。我的服务器不知道 phoneContactName 并且仅在有效负载中发送 phoneNumber 和 messageContent。 application:didReceiveRemoteNotification 方法在应用程序处于前台或后台时调用,但该方法和 application:didFinishLaunchingWithOptions 都不会在应用程序挂起时调用。如果应用被暂停,我应该如何将 phoneNumber 替换为 phoneContactName?【参考方案2】:
您必须管理应用的活动或非活动状态,例如
UIApplicationState state = [application applicationState];
if (state == UIApplicationStateActive)
// Below Code Shows Message While Your Application is in Active State
else
//for app recieving notification in background and tap on notification
【讨论】:
以上是关于ios 接收到推送消息时实现持续响铃震动效果的主要内容,如果未能解决你的问题,请参考以下文章