先说说项目情况:使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];

    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;

NSString *url = del.skipUrl;

if (url){

        [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"try{pushSkip('%@');}catch(e){}", url]];
}
}

这样的话,程序在任何状态下收到推送通知也不会挂掉,但是页面一直执行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;

NSString *url = del.skipUrl;

if (url){

        [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"try{pushMsg('%@');}catch(e){}", url]];
}
}

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

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

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

phonegap + Framework7 之 ios 推送跳转测试的更多相关文章

  1. iOS推送跳转AppDelegate跳转VC

    在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦 ...

  2. iOS 推送跳转到相关页面

    哈哈哈 我又来窃取别人的劳动成果了 写的很好呦 http://www.jianshu.com/p/c0eb32443915

  3. 友盟iOS推送配置(从真机调试到推送)

    下面我来讲解一下友盟iOS的推送配置,其实友盟只是一个示例,换做其余的第三方推送服务也会适用,只是第三方的后面服务变了而已. iOS推送(包括真机调试)所需要的步骤和文件如下: 备注:这里我将省略掉一 ...

  4. 一步一步教你做ios推送

    最近在研究ios的推送问题,遇到了一些问题,最终整理了一下.放在这里和大家分享 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服 ...

  5. iOS 推送问题全解答《十万个为啥吖?》

    Q 1:为啥收不到推送(1)? 如果收到推送时,App 在前台运行,那么: iOS 10 before 顶部横幅不会弹出.没有任何展示,你以为「没有收到推送」. iOS 10 after 如果没有实现 ...

  6. iOS推送证书转pem文件

    iOS推送证书转 .pem文件. 推送证书转pem文件openssl x509 -in apns_miaobozhibo.cer -inform der -out apns_miaobozhibo.p ...

  7. IOS 推送-客户端处理推送消息

    IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...

  8. IOS 推送-配置与代码编写

    IOS 推送配置与代码编写 这里介绍IOS的推送,本文章已经在IOS6/7/8上都能运行OK,按照道理IOS9应该没问题. 大纲: 1.文章前提 2.推送介绍 3.推送文件账号设置 4.推送证书介绍 ...

  9. IOS 推送消息 php做推送服务端

    IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPh ...

随机推荐

  1. [C/C++]函数指针和函数分发表

    // console.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using nam ...

  2. Google C++ 风格指南 命名约定 转

    命名约定 最重要的一致性规则是命名管理. 命名风格快速获知名字代表是什么东东: 类型? 变量? 函数? 常量? 宏 ... ? 甚至不需要去查找类型声明. 我们大脑中的模式匹配引擎可以非常可靠的处理这 ...

  3. Python语言特性之3:@staticmethod和@classmethod

    问题:Python中@staticmethod和@classmethod两种装饰器装饰的函数有什么不同? 原地址:http://stackoverflow.com/questions/136097/w ...

  4. 【转载】IE浏览器常见的9个css Bug以及解决办法

    IE浏览器常见的9个css Bug以及解决办法 我们在浏览网页的时候经常看见这样的现象:某个网页在IE6浏览器中打开很正常,但是在IE8里面打开可能完全变形了.或者也有可能出现完全相反的现象.这让We ...

  5. 添加html元素

    html: <div id='divContainer'> </div> 1.使用DOM对象添加元素 var el = document.createElement('div' ...

  6. C#的变迁史 - C# 1.0篇

    C#与.NET平台诞生已有10数年了,在每次重大的版本升级中,微软都为这门年轻的语言添加了许多实用的特性,下面我们就来看看每个版本都有些什么.老实说,分清这些并没什么太大的实际意义,但是很多老资格的. ...

  7. js定时器的使用(实例讲解)

    在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime);2.循环定 ...

  8. 基于TCP和多线程实现无线鼠标键盘-Socket(1)

    把手机作为移动鼠标.键盘使用非常方便,本文将实现这一功能.该应用分为两部分:Windows服务端和Android客户端. 本文源代码的下载地址:http://download.csdn.net/det ...

  9. Java集合源码分析(七)HashMap<K, V>

    一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap  ...

  10. linux 如何改变文件属性与权限

    我们知道档案权限对于一个系统的安全重要性,也知道档案的权限对于使用者与群组的相关性, 那如何修改一个档案的属性与权限呢? 我们这里介绍几个常用于群组.拥有者.各种身份的权限的指令.如下所示: chgr ...