记:ios PLCrashReporter学习一

Posted by Jimney Lee at 2012-12-18 with tags crashreporter, xcode

经过昨天今天的探索,好不容易把PLCrashReporter给跑起来。

下面分享下步骤,

1、项目主页:http://code.google.com/p/plcrashreporter

  • a. git clone源码,http://code.google.com/p/plcrashreporter/source/checkout
  • b. 向服务器后台发送崩溃测试demo位于工程下的contribphp-crashreporter-demo
  • c. 目前我还没能直接从源码哪里生成ios的framework,所以直接在Downloads里面下载了官方编译好的framework,PLCrashReporter-1.1-rc2.dmg(目前最新版本),可以用的。如果您能编译,请留言分享。

2、遇到一个诡异的问题,生成了crash,但是没有生成崩溃日志文件的问题 官方issue见此处:http://code.google.com/p/plcrashreporter/issues/detail?id=32 内容如下:

gdb will catch the mach exception before it hits PLCrashReporter’s signal handler; you have to execute the program outside of the debugger to test the crash handling behavior.

我在测试demo时,xcode中编译运行,此时gdb调试进程会在PLCrashReporter之前捕捉,导致PL没有获取异常信息。所以请直接在模拟器或者设备中,运行崩溃捕捉测试。

客户端的崩溃报告生成了。后面我将学习配置server端,存储崩溃报告信息和使用plcrashutil命令行工具查看客户端提交的崩溃日志信息。

记:Three20工程与非Three20工程的集成问题

Posted by Jimney Lee at 2012-12-13 with tags Three20, xcode

这两天需要把我的基于Three20的工程打一个静态库供客户方使用。因为设计到第三方库的共用,出现了很多问题。

问题1、SBJSON第三方库使用的冲突

由于three20的json解析框架与客户使用版本有些差异,并且严重的问题是支付宝的静态库竟然把SBJSON一并打入静态库,同时需要用到SBJSON.h头文件。我这心抓挠的闷。没办法,我只能把320的json静态库,重新打包,不包含.m文件,同时加入SBJSON.h,重新生成静态库,供对方使用才解决了这个问题。 (PS:奇怪的是,支付宝官方说没打入静态库,需要使用者自己添加,但是添加了就出现duplicate symbol错误)

问题2、客户如何调用我主控制器

开始我以为很简单,一句话的事:

[[TTNavigator navigator] openURLAction:[TTURLAction actionWithURLPath:@"mine://maintab"]];

但是我发现返回不了。看了底层才知道,由于three20基于导航url思想,默认会生成一个 TTNavigationController,并设为rootViewController,见TTBaseNavigator.m line242:

if (nil != _rootContainer) {
  [_rootContainer navigator:self setRootViewController:_rootViewController];
} else {
  [self.window addSubview:_rootViewController.view];
}

如果直接通过window来添加,效果不好。此处rootContainer的代理使用很特别,哈哈,通过它能使three20工程和其他项目工程无缝链接。代码如下:

 - (void)startLibraryWithParentController:(UIViewController*)parentController
{
    self.parentViewController = parentController;
    // 设置容器的代理,显示320的rootViewController
    [[TTNavigator navigator] setRootContainer:self];
   // 此处一般在AppDelegate 调用,此处省略了Three20工程初始化初始化[AppDelegate init]
    [[TTNavigator navigator] openURLAction:[TTURLAction actionWithURLPath:@"mine://maintab"]];
}
- (void)stopLibrary
{
    [self.parentViewController dismissModalViewControllerAnimated:YES];
    [[TTNavigator navigator] removeAllViewControllers];
    [delegate applicationWillTerminate:nil];    
    // release all singleton class if need
}
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark TTNavigatorRootContainer
- (void)navigator:(TTBaseNavigator*)navigator setRootViewController:(UIViewController*)controller {
    // 对方的父控制器上显示Three20的rootViewController
    [self.parentViewController presentModalViewController:controller animated:YES];
}

解决可恶的Code Sign Error

Posted by Jimney Lee at 2012-11-20 with tags sign, iphone, xcode

这两天的时间都浪费搞证书上了。不知咋的,突然证书无法使用,开始是valid signing certificate not found,同时XCode里面证书设置那边报key/certificate不匹配。

昨天摸索一天,终于找到必杀技。revoke掉certificate,重新生成所有的证书,才没有上面的问题。

今天又遇到下面这个DT的问题:

Code Sign error: Certificate identity ‘iPhone Developer: My Name (xxx)’ appears more than once in the keychain. The codesign tool requires there only be one.

我试了如下方面,对我没有用,但是可以给遇到问题的同学一些参考。

  • 1、因为反复安装证书,到access key(钥匙串访问)删除相同的证书。

  • 2、删除掉过期的证书。

  • 3、记得关闭xcode和access key(钥匙串访问)

  • 4、这个很重要。跟1有关系。就是你删除相同的证书,但是实际没有删除,这个是acces key的bug。

下面是苹果官方的解决方法,请参考: https://developer.apple.com/library/ios/#technotes/tn2250/_index.html#//apple_ref/doc/uid/DTS40009933-CH1-TNTAG3

MacOS快速安装OpenCV

Posted by Jimney Lee at 2012-10-10 with tags MacOS, OpenCV

最近想学习OpenCV,在我的MacMini上安装这个很不错的开源图像处理库。由于安装编译OpenCV,需要cmake来编译。cmake又需要make工具和gcc编译器。一连串需要安装下载的东西很多。

摸索了半天发现一条便捷的快速搭建OpenCV学习环境的方法。记录在此,日后待用。有需要的同学参考下。

当前安装环境:MacMini、Mac OS X Lion10.7.3、XCode4.3

下载安装如下几个工具:

1、XCode安装Command Line Tools文件,包含所需的gcc和make工具,或用开发者账号登录官方下载

2、下载安装适合当前系统的MacPorts文件,类似linux下的apt-get命令。port命令使用手册

3、上面安装完成后,打开Terminal终端,运行如下:

$ sudo port selfupdate // 更新自身到最新版本
$ sudo port list opencv // 查看要下载的opencv的版本号,此步骤可忽略
$ sudo port install opencv // 等待安装,此步骤时间较长

安装路径默认位于/opt/local/include/opt/local/lib 建立一个command line工程,进行简单测试。

1、设置工程库文件和头文件引入目录,如下图

2、引入两个动态链接库,位于/opt/local/lib

3、编写最简单的测试代码,资源放在工程目录下

4、运行结果如下图,分别为isColor=1(原图显示)和isColor=0(黑白显示)

为ShareKit添加Sina Weibo OAuth2.0授权和分享功能

Posted by Jimney Lee at 2012-08-18 with tags oauth2, weibo, iphone

新浪微博开发平台推出OAuth2.0认证,新注册的app只能通过新的认证授权接口来实现登录交互。我在国内大牛icyleafhttps://github.com/icyleaf/ShareKit的fork原始sharekit基础上,并参考了国外另一个大牛forkhttps://github.com/ShareKit/ShareKitfork实现国外OAuth2.0思路和代码,添加了仅针对于国内新浪微博的OAuth2.0功能(由于中国国内开放平台引入国外新技术的“创意”改造,我暂未考虑实现通用2.0接口实现方法。OAuth1.0这方面引进风范,腾讯微博做的尤为特色),同时保留原来的OAuth1.0功能。归功于原作者大师级别的架构,添加OAuth2.0功能还是很方便。

如果你之前已经用了sharekit并做了自己的修改,集成新浪微博OAuth2.0分享需要仅注意以下几点:(so simple)

1、原有代码整体改动不大,添加如下V2文件按夹

2、OAAsynchronousDataFetcher增加一个接口- (void)startNoPrepare,去除prepare方法,OAuth2.0不需要通过HMAC-SHA1生成signature 3、在SHKSharers.plist添加SHKSinaWeiboV2,同时在SHKConfig.h

// Sina Weibo 2.0
#define SHKSinaWeiboV2ConsumerKey         @"1383003023"    // The consumer key
#define SHKSinaWeiboV2ConsumerSecret      @"3e6c2fa689fbcf0aad7418f2dc8093ef"    // The secret key
#define SHKSinaWeiboV2CallbackUrl         @"https://api.weibo.com/oauth2/default.html"    // You need to set this if 

具体参考代码,分享如下链接,支持开源,enjoy it。 Note:目前腾讯微博仅支持文字分享,图片分享还未实现,欢迎补充!


update(12-09-05): 修改授权页面的url,需要添加&display=mobile,不然显示的是网页版的授权页面。 修改地方为SHKSinaWeiboV2.m 的 promptAuthorization方法

NSString* urlStr = [NSString stringWithFormat:@"%@?client_id=%@&response_type=code&redirect_uri=%@&display=mobile", authorizeURL, self.consumerKey, [self.authorizeCallbackURL.absoluteString URLEncodedString]];

制作一个APNS的推送证书

Posted by Jimney Lee at 2012-04-18 with tags iphone, apns, php

1、为应用创建独立的app ID和开发、发布的profile文件。同时开启push功能,完成后双击安装。

2、从钥匙串访问(Keychain Access)中,我的证书对应APP的开发或发布证书,分别导出cert和key,命名为apns-dev-cert.p12apns-dev-key.p12

3、终端命令行运行下面的opnessl命令,即可生存所需的pem文件

$ openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
$ openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
$ openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
$ cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

写的很粗略,这位老外同学写的很详细,步骤备份此处,有不理解的同学可以留言!

PS:今天发现诡异的现象,之前制作development证书时,Enter PEM pass phrase:,密码我输入4个1可以的,今天制作release的pem证书,输入4个1报错: >unable to load Private Key 140735097526716:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:696:Expecting: ANY PRIVATE KEY

然后,我花费了很长时间,重新做cert和key原始的p12证书,反复核对,信息也无误。因为之前我用同样的步骤已经做成一个app的push证书。

所以我继续尝试,最后我再上面键入密码时候,输入6个1,就没问题了。我勒个去,看来是因为我对openssl命令还不甚了解吧。

希望对看到的同学有帮助,也可能是我遇到的特例,不过成功了,心里还是有点安慰。 :)