可爱熊个人博客

Category : 技术杂文

APNS推送通知的流程

下面是我的所有部署配置过程。

1. 将app注册notification里面, 并从APNS上获取测试机的deviceToken.

复制代码

  1. – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  2.     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
  3.         // other codes here.
  4.     return YES;
  5. }
  6. – (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  7.     NSLog(@”deviceToken: %@”, deviceToken);
  8. }
  9. – (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
  10.     NSLog(@”Error in registration. Error: %@”, error);
  11. }
  12. – (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
  13. {
  14.     NSLog(@”收到推送消息 : %@”,[[userInfo objectForKey:@”aps”] objectForKey:@”alert”]);
  15.     if ([[userInfo objectForKey:@”aps”] objectForKey:@”alert”]!=NULL) {
  16.         UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@”推送通知”
  17.                                                         message:[[userInfo objectForKey:@”aps”] objectForKey:@”alert”]
  18.                                                        delegate:self
  19.                                               cancelButtonTitle:@”关闭”
  20.                                               otherButtonTitles:@”更新状态”,nil];
  21.         [alert show];
  22.         [alert release];
  23.     }
  24. }

启动程序,将app注册到通知项后,在console里面找到打印的deviceToken: Read More…

程序内购买(IAP)详解【转载】

一、In App Purchase概览

Store Kit代表App和App Store之间进行通信。
程序将从App Store接收那些你想要提供的产品的信息,并将它们显示出来供用户购买。
当用户需要购买某件产品时,程序调用StoreKit来收集购买信息。
Store Kit的API只是为程序添加In App Purchase功能的一小部分。你需要决定如何去记录那些你想要提交的产品,如何在程序中将商店功能展现给用户,还要考虑如何将用户购买的产品提交。本章的剩余部分会展示整个流程。

Products
产品可以是任意一项你想要出售的特性。产品在iTunes Connect中被组织,这和你添加一个新的App是一样的。支持的产品种类共有四种:
1. 内容型。包括电子书,电子杂志,照片,插图,游戏关卡,游戏角色,和其他的数字内容。
2. 扩展功能。这些功能已经包含在App内部。在未购买之前被锁定。例如,你可以在一个游戏程序中包含若干个小游戏,用户可以分别来购买这些游戏。
3. 服务。允许程序对单次服务收费。比如录音服务。
4. 订阅。支持对内容或服务的扩展访问。例如,你的程序可以每周提供财务信息或游戏门户网站的信息。应该设定一个合理的更新周期,以避免过于频繁的
提示困扰用户。要记住:你将负责跟踪订阅的过期信息,并且管理续费。App Store不会替你监视订阅的周期,也不提供自动收费的机制。

In App Purchase为创建产品提供了一种通用的机制,如何操作将由你负责。当你设计程序的时候,有以下几点需要注意:

1. 你必须提供电子类产品和服务。不要使用In App Purchase 去出售实物和实际服务。
2. 不能提供代表中介货币的物品,因为让用户知晓他们购买的商品和服务是很重要的。 Read More…

苹果购买信息的键

键名 描述
quantity 购买商品的数量。对应SKPayment对象中的quantity属性
product_id 商品的标识,对应SKPayment对象的productIdentifier属性。
transaction_id 交易的标识,对应SKPaymentTransaction的transactionIdentifier属性
purchase_date 交易的日期,对应SKPaymentTransaction的transactionDate属性
original_-transaction_id 对于恢复的transaction对象,该键对应了原始的transaction标识
original_purchase_-date 对于恢复的transaction对象,该键对应了原始的交易日期
app_item_id App Store用来标识程序的字符串。一个服务器可能需要支持多个server的支付功能,可以用这个标识来区分程序。链接sandbox用来测试的程序的不到这个值,因此该键不存在。
version_external_-identifier 用来标识程序修订数。该键在sandbox环境下不存在
bid iPhone程序的bundle标识
bvrs iPhone程序的版本号

php修改文件名函数

修改文件名的函数,rename($o,$n),$o是旧文件名,$n要被修改成的新文件名哦。下面我们来看一款关于重名命文件名的实例

<?php session_start();
if($submit==”提交”){
if (file_exists( $old_name)){
if (rename($old_name,$new_name )) //把原文件重新命名
{echo “修改成功!”;}
}else{ print $old_name.”文件不存在!<br>” ; }
}
?>

为UIWebView实现离线浏览

智能手机的流行让移动运营商们大赚了一笔,然而消费者们却不得不面对可怕的数据流量账单。因为在线看部电影可能要上千块通讯费,比起电影院什么的简直太坑爹了。
所以为了减少流量开销,离线浏览也就成了很关键的功能,而UIWebView这个让人又爱又恨的玩意弱爆了,居然只在Mac OS X上提供webView:resource:willSendRequest:redirectResponse:fromDataSource:这个方法,于是只好自己动手实现了。

原理就是SDK里绝大部分的网络请求都会访问[NSURLCache sharedURLCache]这个对象,它的cachedResponseForRequest:方法会返回一个NSCachedURLResponse对象。如果这个NSCachedURLResponse对象不为nil,且没有过期,那么就使用这个缓存的响应,否则就发起一个不访问缓存的请求。
要注意的是NSCachedURLResponse对象不能被提前释放,除非UIWebView去调用NSURLCache的removeCachedResponseForRequest:方法,原因貌似是UIWebView并不retain这个响应。而这个问题又很头疼,因为UIWebView有内存泄露的嫌疑,即使它被释放了,也很可能不去调用上述方法,于是内存就一直占用着了。

顺便说下NSURLRequest对象,它有个cachePolicy属性,只要其值为NSURLRequestReloadIgnoringLocalCacheData的话,就不会访问缓存。可喜的是这种情况貌似只有在缓存里没取到,或是强制刷新时才可能出现。
实际上NSURLCache本身就有磁盘缓存功能,然而在iOS上,NSCachedURLResponse却被限制为不能缓存到磁盘(NSURLCacheStorageAllowed被视为NSURLCacheStorageAllowedInMemoryOnly)。
不过既然知道了原理,那么只要自己实现一个NSURLCache的子类,然后改写cachedResponseForRequest:方法,让它从硬盘读取缓存即可。

于是就开工吧。这次的demo逻辑比较复杂,因此我就按步骤来说明了。

先定义视图和控制器。
它的逻辑是打开应用时就尝试访问缓存文件,如果发现存在,则显示缓存完毕;否则就尝试下载整个网页的资源;在下载完成后,也显示缓存完毕。
不过下载所有资源需要解析HTML,甚至是JavaScript和CSS。为了简化我就直接用一个不显示的UIWebView载入这个页面,让它自动去发起所有请求。
当然,缓存完了还需要触发事件来显示网页。于是再提供一个按钮,点击时显示缓存的网页,再次点击就关闭。
顺带一提,我本来想用Google为例的,可惜它自己实现了HTML 5离线浏览,也就体现不出这种方法的意义了,于是只好拿百度来垫背。

Read More…

Mysql的空值判断

MySql里面空值是NULL

于是,理所当然地写了一条SQL语句

Select count(*) from table1 where name1=NULL;

而实际上得到的的结果是不符合实际的,在MSSQL应该也是这种情况。

经过查找资料,发现,正确的语法应该是这样写:

Select count(*) from table1 where name1 is NULL;

问题解决。

 

同时可以使用 <> 来代表不等于

Win2008(IIS7)Asp上传文件不能超过200K的解决方案

在 Win2008(iis 7.0)和Win2003(iis 6.0) 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击。
指定 ASP 请求的实体主体中允许大小为 200,000 (IIS6为204,800) 个字节,在 iis 6.0 之前的版本中,没有限制。

这就造成了文件上传不能超过200k,而事实上是提交数据不能超过200k,你可以发一个很长的帖子试试,也会出现这个错误。

IIS7.0的修改方法如下:
打开IIS管理器–双击“IIS”中的“ASP”– 打开“配置 ASP 应该程序的属性”–展开“限制属性”;
修改“最大请求实体主体限制”的值,默认值为200000(即不到200KB);
把它修改为你想修改的大小,如:52000000(50MB)。
修改完成点击“应用”OK!

IIS6.0的修改方法如下:
在服务里关闭iis admin service服务
找到windows\system32\inetsrv\下的MetaBase.xml,
打开,找到AspMaxRequestEntityAllowed 把他修改为需要的值,默认为204800,即200k
把它修改为51200000(50MB)
然后重启iis admin service服务

在 IIS 6.0 中,无法下载超过4M的附件时,可以按以下步骤解决
1、先在服务里关闭 iis admin service 服务。
2、找到 windows\system32\inetsrv\ 下的 metabase.xml 文件。
3、用纯文本方式打开,找到 AspBufferingLimit 把它修改为需要的值,默认为4194304(可修改为20M即:20480000)。
4、存盘,然后重启 iis admin service 服务。

mysql source命令

今天碰到个问题要用phpmyadmin导入1G的数据,但是在怎么都导入不了,用命令行就可以轻松搞定了。用mysql source命令可以导入比较大的文件。

mysql>use dbtest;
mysql>set names utf8;
mysql>source D:/www/sql/back.sql;

通过source命令导入多个文件,可以新建一个sou.sql文件,里面存放下面的命令
例如:
source d:/a1.sql;
source d:/a2.sql;
当你运行

这样就可以在一个source命令里面导入多个sql文件了。

Kloxo下FTP无法连接解决方法

今天重启后,ftp不能连接,查了端口没有被占用,FTP就一直无法连接,刚开始以为是抽风引起的,过会儿就好了,也没怎么关心,可这几天FTP一直都是无法连接,FlashFXP、Net2ftp都不行,这才开始重视。

后台想想可能是ftp没有启用。

解决方法:登陆SSH执行命令:
/etc/init.d/xinetd restart

介绍Linux中cp直接覆盖不提示的方法

新做了服务器,cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,这在大量cp覆盖操作的时候是不能忍受的。

把a目录下的文件复制到b目录

以下是代码片段:

cp –r a/* b

执行上面的命令时,b存在的每个文件都会提示是否覆盖;

以下是代码片段:

cp –r –f a/* b

执行上面的命令时,b存在的每个文件都不再会提示;

这是我们希望的理想状态,但是有时加了-f了,怎么还会有提示呢?原来一些服务器会默认增加别名 alias cp=’cp -i’,当你执行cp时,其实执行的是cp –i。

在终端执行alias就可以看出来了。

以下是代码片段:

[root@devdb ~]# alias

alias cp=’cp -i’

可以这样解决

以下是代码片段:

[root@devdb ~]# vi ~/.bashrc

在alias cp=’cp -i’前加上”#”注释掉这行,:wq!保存推出,然后重新登陆就可以了。