phonegap + Framework7 之 ios 推送跳转测试

先说说项目情况:使phonegap建的ios项目,然后在使用html + css开发网页中又使用了一个框Framework7(Framework7是一个构建仿原生ios和android应用的框架)。造成把网站打包成app之后,只有一个入口主页面(假设该主页面为index.html), 然后在index.html页面引用所有要用的css和js。其他html页面只有部分html标签,不引用css和js, 其他html页面的展示都是通过主页面index.html的链接进行跳转到那里!

  现在在做这个项目的推送消息,碰到了一些问题:接收到推送通知的情况应该是三种:1、程序正在前台运行; 2、程序正在后台运行; 3、程序完全退出后台。

然后我们在这三种情况下收到推送通知后,解析通知参数,然后想根据参数跳转到目标页面去。然后问题来了:因为首先要去目标页面必须先去index.html,然后再从index.html页面跳转到其他页面去(因为目标页面没有js和css引用,单独跳转过去只有一些简单html标签)。所以开始的思路是先把参数传到index.html页面,然后再根据参数从index.html跳转到其他页面上。

如果UIWebView加载的网页是远程页面(比如:http://xindongai.com/mobile/index.html)而不是本app里面的网页(www/index.html),那么一切好说,直接把参数拼到远程页面后面,然后加载远程index.html后,执行js脚本,跳到对应目标页面上。验证程序在运行和退出状态下解析通知后调到目标页面都没问题。

  ----------------------- -------- --------- ------ ------- --------- ----

另外一种情况是加载本地html页面,然后问题来了:

1、刚开始是想通过UIWebView执行脚本跳转(pushSkip是一个在公共js定义的方法,index.html页面引用了js):

//解析推送通知
- (void)analysisPushMsg:(NSDictionary *)userInfo byType:(NSInteger)type{
    // 取得 APNs 标准信息内容
    NSDictionary *aps = [userInfo valueForKey:@"aps"];
    NSString *content = [aps valueForKey:@"alert"]; //推送显示的内容
    NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge数量
    NSString *sound = [aps valueForKey:@"sound"]; //播放的声音
    
    // 取得自定义字段内容
    NSString *url = [userInfo valueForKey:@"url"]; //自定义参数,key是自己定义的: 比如:url=activate.html
    [self.viewController.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"pushSkip('%@');", url]];
    //....
}

 这种情况下,当程序正在前台运行情况下,没有问题,可以顺利执行;但是一旦程序在后台或者完全退出后台情况下,一执行程序马上就挂掉了!

2、用另外一种情况,当解析到推送通知后,从新加载UIWebView的网页,再在代理方法- (void)webViewDidFinishLoad:(UIWebView*)theWebView里面执行js脚本:

- (void)analysisPushMsg:(NSDictionary *)userInfo byType:(NSInteger)type{
    // 取得 APNs 标准信息内容
    NSDictionary *aps = [userInfo valueForKey:@"aps"];
    NSString *content = [aps valueForKey:@"alert"]; //推送显示的内容
    NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge数量
    NSString *sound = [aps valueForKey:@"sound"]; //播放的声音
    
    // 取得自定义字段内容
    NSString *url = [userInfo valueForKey:@"url"]; //自定义参数,key是自己定义的: 比如:url=activate.html
    
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"www/index.html" withExtension:nil];

在控制器的代理方法里面:

- (void)webViewDidFinishLoad:(UIWebView*)theWebView
{
    // Black base color for background matches the native apps
//    theWebView.backgroundColor = [UIColor whiteColor];
//    theWebView.scrollView.bounces = NO;
//    [(UIScrollView *)[[theWebView subviews] objectAtIndex:0] setBounces:NO];
//    
    [super webViewDidFinishLoad:theWebView];

这样的话,程序在任何状态下收到推送通知也不会挂掉,但是页面一直执行pushSkip(url)方法,陷入了死循环。我想应该是UIWebView加载idnex.html页面后,还把”try{pushSkip('%@');}catch(e){}“代码添加到index.html页面上了,导致一直死循环一直执行。

尼玛,真是痛苦,百度谷歌搜不到自己想要的结果,难道大家没碰到过这个问题吗?大家碰到这种问题的时候是怎么解决的呢?自己的思路似乎陷入了一个误区,不知道怎么走出来?

又改了改,暂时想出来一个临时办法来:

3、新建一个页面aaa.html,这个页面脱离Framework7框架,是个跳板页面,里面只有一个js方法,作为跳转到index.html页面之用。

  1)解析通知后,给UIWebView空间加载aaa.html页面;

  2)在控制器代理方法- (void)webViewDidFinishLoad:(UIWebView*)theWebView里调用aaa.html页面的js方法;

  3)在aaa.html的js方法里面跳转到index.html页面上,并且把最后要跳转的目标参数也带过去;

  4)在index.html页面引用的公共js里面根据参数跳转到目标页面上去

这样不管程序处于哪种状态下,都可以解析推送通知并且调到对应目标页面上,代码:

aaa.html页面:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <script type="text/javascript">
        function pushMsg(url){
            window.location.href="home.html?url=" + url;
        }
    </script>
  </body>
</html>
- (void)analysisPushMsg:(NSDictionary *)userInfo byType:(NSInteger)type{
    // 取得 APNs 标准信息内容
    NSDictionary *aps = [userInfo valueForKey:@"aps"];
    NSString *content = [aps valueForKey:@"alert"]; //推送显示的内容
    NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge数量
    NSString *sound = [aps valueForKey:@"sound"]; //播放的声音
    
    // 取得自定义字段内容
    NSString *url = [userInfo valueForKey:@"url"]; //自定义参数,key是自己定义的

NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"www/aaa.html" withExtension:nil];
    self.skipUrl = url;
    NSURLRequest *request = [NSURLRequest requestWithURL:fileURL];
    [self.viewController.webView loadRequest:request];

//....
}

控制器代理方法:

- (void)webViewDidFinishLoad:(UIWebView*)theWebView
{
    // Black base color for background matches the native apps
//    theWebView.backgroundColor = [UIColor whiteColor];
//    theWebView.scrollView.bounces = NO;
//    [(UIScrollView *)[[theWebView subviews] objectAtIndex:0] setBounces:NO];
//    
    [super webViewDidFinishLoad:theWebView];
    
    AppDelegate *del = (AppDelegate *)[UIApplication sharedApplication].delegate;

--------------------------- ----- end --------------------------------

暂时用这个方法解决,总觉得自己陷入了个误区,肯定有更好的解决办法。希望过路的哪位兄台大神指点一下,非常感谢!

原文链接: http://www.cnblogs.com/tandaxia/p/4920617.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计

        在iOS开发中,图文混排一直都是UI编程的一个核心点,也有许多优秀的第三方引擎,其中很有名的一套图文混排的框架叫做DTCoreText。但是在前...

12930
来自专栏xx_Cc的学习总结专栏

六天完成一个简单iOS App - 第三天

325110
来自专栏Web 开发

给iOS的WebView添加远程调试

定位到 didFinishLaunchingWithOptions 代码块中。

9700
来自专栏iOS技术杂谈

NSNotificationCenter 通知的使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里

你要知道的KVC、KVO、Delegate、Notification都在这里 转载请注明出处 https://cloud.tencent.com/develop...

52460
来自专栏落影的专栏

iOS开发笔记(二)

前言 开发做笔记是好习惯,总结分享是巩固记忆。 遇到问题,思考其背后的原因、原理。 AFNetworking 1、progress回调block,不在主线程;...

35470
来自专栏文大师的新世界

4. Navigation实战

本来想写一个应用redux的Navigation实战,但是发现react-native有又新的更新,新手怕误导大家,就直接用了别人的组件,看看怎么应用吧。本次在...

9720
来自专栏谈补锅

通知 - NSNotificationCenter

1、每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信;

13140
来自专栏mukekeheart的iOS之旅

iOS学习——键盘弹出遮挡输入框问题解决方案

  在iOS或Android等移动端开发过程中,经常遇到很多需要我们输入信息的情况,例如登录时要输入账号密码、查询时要输入查询信息、注册或申请时需要填写一些信息...

57560
来自专栏iOS122-移动混合开发研究院

FXForms,自动生成iOS表单

1.简介 FXForms是一个简单的表单提交框架,他的作者是鼎鼎大名的 Nick Lockwood,你也许听说过他的其他的一些框架,比如 iCarousel. ...

30600
来自专栏飞扬的花生

微信公众号开发授权和分享模块脚本封装

20020

扫码关注云+社区

领取腾讯云代金券