以下是对“微笑天使包燕娜"事件的Code Review:
    1.    问题现象
    新用户在iPhone客户端在用新浪微博登录时,用户的名称自动变为“微笑天使包燕娜”。
    2.    现象分析
    先说明咱们的新用户登录流程,
    A.    新用户登录时首先向第三方平台,请求用户的用户id(uid)
    B.    客户端将此uid发送到咱们自己的服务器,服务器返回此用户的uid与数据库对比返回,此用户是一个新用户
    C.    客户端收到服务器发送的此用户为新用户的信息,再次利用用户的uid向第三方平台发送请求用户具体信息的消息。
    D.    第三方服务器返回用户的具体信息后,客户端再将此信息发送到咱们自己的服务器上保存。
    E.    服务器返回修改过新的用户数据,客户端保存,登录过程完毕。

    通过对登录过程的log信息进行分析发现,在A和B阶段得到的uid,与C阶段发送的uid不相同。
    改变后的uid一直为2147483647。此uid对应新浪微博的用户"微笑天使包燕娜",因此返回给咱们自己服务器的用户数据一直是这个名称。
    继续定位发现在新浪SDK中,向新浪服务器发送获得用户详细信息(C过程)请求之前,代码进行了一次将uid字符串转换为int,再转换为字符串的过程。而当用户uid非常大,大于int的最大值(2147483647)时,此时uid被转换为int的最大值2147483647。
    因此,发送到新浪的uid会一直是“2147483647”。
   
    3.    解决问题
    在新浪的SDK的WeiboClient类中,将转换int的代码去掉并修改接口直接将字符串传入发送请求的函数中,问题解决。
    修改后的代码如下:
- (void)getUser:(NSString *)userId
{
    needAuth = YES;
    NSString *path = [NSString stringWithFormat:@"users/show.%@", API_FORMAT];
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0];
    [params setObject: userId forKey:@"user_id"];
    [super get:[self getURL:path queryParameters:params]];
}
posted @ 2011-09-21 18:28 摇滚诗人 阅读(806) 评论(1) 编辑
新的App
新的通知推送功能,学习了Android的推送样式,不会丢消息,添加了新的通知中心。
在主界面就可以看见通知,在应用中也可以看见消息通知。


iPad上的Safari可以有标签了。

ToDo List

相机:
锁屏下可以直接拍照。还可以用音量键拍照。(开发者是否能用硬件按键来实现功能?)
支持自动对焦和自动锁定功能,自动去红眼,直接编辑图片,音量键可以直接拍照了

邮件:
新的发信人,联系人拖动

拖拽地址栏、旗标邮件、新加入的键盘样式

PC free!!
把PC的线剪掉了!!以后不用连线同步了!!HoYE

Over The Air:
系统升级不用电脑。

Game Center:
和朋友玩游戏,支持推送。
可以根据用户游戏行为推荐游戏
用户推荐用户(社交网络)

iMessager:
iMessage这个东东,允许有iPhone,iPad的用户可以像发短信一样自由通信,这这,这简直是绕过了电信运营商嘛,电信们又杯具了
posted @ 2011-06-07 02:31 摇滚诗人 阅读(1283) 评论(3) 编辑

很晚了,不想写太多赘述,试了一个晚上,告诉大家一个事实。


常规隐藏,或者显示状态栏的方法有两种。

第一,修改info.plist文件,这个能保证起始状态状态栏是什么样式。

第二,利用    [[UIApplication sharedApplication] setStatusBarHidden: XX withAnimation: XX];来在程序中实时设定。

 

好了说说第二种情况:

注意:下面说的所有情况可能不符合苹果公司提供的UI设计规范,因为规范中“建议”大家不要没事老折腾状态栏。(我隐约记得看见过类似内容忘了具体在哪了,待考证)

如果你想让你的程序中Status Bar时隐时现,半透明(这里说的半透明是指自己的界面被状态栏挡住),隐藏的时候不会出现烦人的白条儿 。

那你在离开上一个页面的时候(具体在第一个界面viewWillDisappear里)要隐藏状态栏,进入下一个页面正式显示出页面以后(具体在第二个界面的viewDidAppear里面,如果页面转换有动画要等动画结束后,写个performSelector:withObject:afterDelay:,在回调里)再显示状态栏。

 

posted @ 2011-05-13 02:18 摇滚诗人 阅读(567) 评论(0) 编辑

Foundation/Core Foundation/Carbon/Cocoa/Cocoa Touch/Toll Free Bridging光看看这tm些名字就jb够晕了,你是不是也看着这些东西恶心?你是不是也发现在你开发同样一个功能的时候,从a库也可以到达,从b库也可以到达?虽然都能抓住老鼠,可是到底哪只猫是串儿?哪只猫是纯种的波斯猫?

本文就是对这些库族谱的介绍。

Foundation:Objective-C的核心库。写个Objective-C程序必须包含的库。提供了Objective-C中基本的数据类型和服务。他其实是和Cocoa更加亲密的,按照层次应该和Cocoa是一层。

Core Foundation: 一个接近系统的C库, 让调用方可以方便的访问系统级的内容。Foundation和Cocoa有其部分功能的封装,这就是为什么完成同一件事有多种解决方案的起源。个人感觉这个比Foundation功能更强大,毕竟更贴近底层自然效率会高一些吧。而且后面会提到,Foundation为了更好的调用Core Foundation,还得和Toll Free Bridging交互。

Carbon:这个跟iOS关系不大,在早期的Mac OS(X之前)必须用这个,提供了一些图形库和很多框架。

Cocoa:这个是现在Mac OS X中才出现的新玩意, 和Carbon一块在Mac OS X上出现。

Cocoa Touch:是Cocoa在iOS上对应的库,做了很多在移动平台上的优化,比如把GC优化没了,因为高效的GC是不符合移动平台的风格的(因为用的是标记法,所以产生的内存碎片无法应对所有移动开发情况)。

Toll Free Bridging:从名字可以看出是啥东西Bridge嘛,给Foundation和Core Foundation中间架个桥,以便调用。

 

附上个图以便理解:

 

 

以上有道听途说,有个人理解。欢迎大家指正。

posted @ 2011-05-09 00:01 摇滚诗人 阅读(2035) 评论(4) 编辑

先说题外话,文章标题其实起的不好,在iOS的开发中,Apple建立的库基本都是用Objective-C写的,所以在这里的C++指的其实是Objective-C++。

首先,最最最要紧的事情,不是代码而是编译器选项,在做混合编译之前一定要把编译器的Compile Sources As选项改为Objective C++。

默认的选项是According to file type,用这个的话,你后面每个不在交叉行列里的类都OK,一旦两种语言在一个文件中相互调用,就会报错,而且报的错怪的很,比如:找不到new,找不到delete,等等。

 

既然是调用嘛,肯定要有来有往,先说说,在C++中如何调用Objective-C:(参考这个,我略做修改

1. 封装Objective-C的对象函数变为C的函数接口

2. 写一个对应的C++类调用

说起来简单,看看例子就知道什么情况了。

 

//MyObject-C-Interface.h

#ifndef __MYOBJECT_C_INTERFACE_H__
#define __MYOBJECT_C_INTERFACE_H__ 1

int MyObjectDoSomethingWith (void *myObjectInstance, void *parameter);

#endif

//MyObject.h

#import 
"MyObject-C-Interface.h"

@interface MyObject : NSObject
{
    
int someVar;
}

- (int) doSomethingWith:(void *) aParameter;
@end

//MyObject.m

#import 
"MyObject.h"

int MyObjectDoSomethingWith (void *self, void *aParameter)
{
    
return [(id) self doSomethingWith:aParameter];
}

@implementation MyObject

- (int) doSomethingWith:(void *) aParameter
{
    
// ... some code
    return 1;
}

@end

//MyCPPClass.h
#ifndef __MYCPPCLASS_H__
#define __MYCPPCLASS_H__

class MyCppClass
{
public:
     
int MyCPPClass::someMethod (void *objectiveCObject, void *aParameter);
}

#endif

//MyCPPClass.cpp

#include 
"MyCPPClass.h"
#include 
"MyObject-C-Interface.h"

int MyCPPClass::someMethod (void *objectiveCObject, void *aParameter)
{
    
return MyObjectDoSomethingWith (objectiveCObject, aParameter);
}

如上面所示,先搞个弱类型的C函数接口,然后在Objective C的类中实现该接口。最后,在C++的类中调用弱类型,和弱接口。

 

在工程主体框架是用Objective-C写成的前提下,上面的这种调用并不实用,完全是技术可能性的研究。说白了,就是骗骗编译器玩,同时也失去了C++优雅的强类型特性。

 

下面这个才是真金白银有用的,在Objective-C代码下调用C++类代码:

1. 建立一个C++类

2. 写一个Adaptor的Objective-C类

3. 在其他Objective-C的逻辑中调用Adaptor类。

还是代码:)

//
//  CPlusPlusClass.h
//  MixCompileTest
//
//  Created by biosli on 11-4-30.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#ifndef __CPLUSPLUS_CLASS_H__
#define __CPLUSPLUS_CLASS_H__

class CPlusPlusClass {
public:
    CPlusPlusClass();
    
virtual ~CPlusPlusClass();
    
void func();
    
void setInt (int i) {
        m_i 
= i;
    }
    
private:
    
int m_i;
};


#endif

//
//  CPlusPlusClass.mm
//  MixCompileTest
//
//  Created by biosli on 11-4-30.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#include 
<stdio.h>
#include 
"CPlusPlusClass.h"

CPlusPlusClass::CPlusPlusClass() : m_i(
0
{
    printf(
"CPlusPlusClass::CPlusPlusClass()\n");
    func();
}

CPlusPlusClass::
~CPlusPlusClass() 
{
    printf(
"CPlusPlusClass::~CPlusPlusClass()\n");
}

void CPlusPlusClass::func() {
    printf(
"CPlusPlusClass func print: %d\n", m_i);
}

//
//  ObjectiveCAdaptor.h
//  MixCompileTest
//
//  Created by biosli on 11-4-30.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import 
<Foundation/Foundation.h>

class CPlusPlusClass; //这个声明得小心,千万不要写成@class,兄弟我搞了半宿才找到这个错误。呵呵,见笑,见笑。

@interface ObjectiveCAdaptor : NSObject {
@private
    CPlusPlusClass 
*testObj;
}

- (void) objectiveFunc;
@end

//
//  ObjectiveCAdaptor.m
//  MixCompileTest
//
//  Created by biosli on 11-4-30.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import 
"ObjectiveCAdaptor.h"
#include 
"CPlusPlusClass.h"

@implementation ObjectiveCAdaptor

- (id) init {
    
if (self = [super init]) {
        testObj 
= new CPlusPlusClass();
    }
    
    
return self;
}

- (void) dealloc {
    
if (testObj != NULL) {
        delete testObj;
        testObj 
= NULL;
    }
    [super dealloc];
}

- (void) objectiveFunc
{
    testObj
->setInt(5);
    testObj
->func();

@end

//调用示例:
- (void) callObjectiveCAdaptorMethod
{
    ObjectiveCAdaptor 
*testObjectiveCObj = [[ObjectiveCAdaptor alloc] init];
    [testObjectiveCObj objectiveFunc];
    [testObjectiveCObj release];
}

 上面这个例子演示了创建C++类,创建Objective-C的Adaptor类,和最后调用的全过程。

在编写混合编译代码时一定要记住一个原则,Objective-C++这个东东包含了Objective-C和C++的所有关键字和符号,所以在编写交叉编译代码时,千万不要用混本来就很像的关键字和符号。

 

参考资料:

具体的代码限制:请参考《Objective-C和C++混编的要点》

混合编译好处多,这篇文章叙述的相当到位《Strategies for Using C++ in Objective-C Projects》

 

 

posted @ 2011-04-30 03:34 摇滚诗人 阅读(2806) 评论(1) 编辑
摘要: 今天看书中介绍了从图片库中调用图片的例子,一时性起打算做一个简单的图片浏览器。功能很简单,从图片库中载入图片,然后放到view下,并支持放大,缩小,平移。由于对控件库不了解,一开始的方案是这样的:前面的框架都一样: 用toolbar做按钮条,里面有个按键,触发从按键。按键action调用图片库,之后图片库发消息到delegate(我这里协议挂在了主UIViewController上面,后面其他的delegate也一样)。如果正确得到了图片 UIImagePickerControllerDelegate的imagePickerController:didFinishPickingMediaWi.阅读全文
posted @ 2011-04-22 19:31 摇滚诗人 阅读(1701) 评论(2) 编辑
摘要: 今天尝试将静态链接库引入工程:Objective-C的试验成功!!建立一个Cocoa Touch库工程,然后写代码操文件,编译出来。将在建立一个Client工程,这个工程是app工程,由这个可以引用刚才的那个库工程,将库工程生成的.a加到Target的link下(使静态库可被引用),然后进入"Get Info"->"Generat"关联依赖项(在工程下可以交叉编译),再将头文件地址加入Header Search里面。这样就可以用了。另外,那个SBJSON库完成了上述操作后还要修改"Other linker flags"为“-Ob阅读全文
posted @ 2011-04-17 02:59 摇滚诗人 阅读(1125) 评论(0) 编辑
摘要: 今天介绍触摸屏点击 从硬件设计上说Windows Phone 7至少可以接收4个手指的触摸事件。 一、在XNA上的Low-Level触摸事件 可以利用全局的TouchPanel class来的到输入事件。 ----------------------------- Tips: 1. 调用静态的TouchPanel.GetCapabilities()方法返回TouchPanelCapabiliti...阅读全文
posted @ 2011-03-19 22:44 摇滚诗人 阅读(143) 评论(0) 编辑
摘要: 今天介绍,本教程的第二章。 第二章 手机方向 一,Silverlight和自动布局 在xaml中可以通过,SupportedOrientations来设置程序中支持的手机方向。 在切换手机方向后,Silverlight会自动根据xaml中的设置重新布局,所以在设计时要考虑屏幕方向改变后程序的切换效果。 书中利用TextBlock中的VerticalAlignment和HorizontalAlign...阅读全文
posted @ 2011-03-15 00:24 摇滚诗人 阅读(123) 评论(0) 编辑
摘要: 学而不思则罔,思而不学则殆。 从上周开始看Charles Petzold的《Programming Windows Phone 7》。书中的内容颇为丰富,受益匪浅。 但也因为书中涵盖内容太多,需要做的笔记也很多,所以索性写博客按章节把内容总结出来。 目的有两个: 第一,对所学知识做一个总结。 第二,便于以后按章节查找具体内容,毕竟书是英文版,如果要找相应内容面对长得差不多的英文还是要翻一阵的。 ...阅读全文
posted @ 2011-03-14 00:53 摇滚诗人 阅读(200) 评论(0) 编辑