苹果手机有ios修改地理位置app的app吗

小站会根据您的关注,为您发现更多,
看到喜欢的小站就马上关注吧!
下一站,你会遇见谁的梦想?
iOS 6版本与之前版本差异总结
1、适配4英寸屏幕适配。旧应用要与4英寸屏幕进行适配,需要创建一张Default-568h@2x.png图片,系统根据是否有此资源来识别是否支持4英寸屏幕。至于其他资源不允许使用xxx-568h.jpg此格式来适配屏幕,需要使用代码对屏幕进行检测来分别进行适配。2、UINavigationViewController的变化今天开发过程中发现的,该类的initWithRootViewController在之前的版本是最终会调用到init方法的。因此在继承UINavigationViewController时,直接在重写init方法来初始化对象所需属性即可。但是在iOS6上是不会调用init方法,因此需要开发者们注意。3、CFRelease的变化在之前版本中如果CFRelease传入nil是被允许的,这也符合我们传入nil对象不会对我们的程序造成影响,但是在iOS6中,这样的写法程序就直接把你的程序Crash掉了,所以代码中还是需要判断一下是否为nil才是安全的做法。4、UIPickerView的变化在之前版本中调用[_pickerView selectRow:-1 inComponent:0 animated:YES];是允许的。但在iOS6中会导致崩溃。5、UIActivityIndicatorView的变化在之前的版本中假如调用了startAnimating方法之后,只要把UIActivityIndicatorView添加到子视图中就会显示加载动画,但在iOS6中只要移出显示队列则会停止动画,特别在UITableViewCell中加入此控件,只要滚动几下Cell的UIActivityIndicatorView就消失了,为解决此问题可以在加入显示队列时根据isAnimating属性来判断是否执行动画,如果没有则重新调用一下startAnimating方法。6、通讯录列表获取差异自iOS6.0后获取通讯录列表需要询问用户,经过用户同意后才可以获取通讯录用户列表。而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函数转变为ABAddressBookCreateWithOptions函数。下面代码是兼容之前版本的获取通讯录用户列表方法。ABAddressBookRef addressBook =
if ([[UIDevice currentDevice].systemVersion floatValue] &= 6.0){
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意后向下执行
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
dispatch_semaphore_signal(sema);
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);}else{
addressBook = ABAddressBookCreate();}
NSArray *personArray = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
iOS 6新特性UIActivityViewController使用教程(一)
iOS6增加了新特性UIActivityViewController,通个使用这个controller,你的应用程序就可以提供各种服务,例如发送短消息和邮件,复制内容到剪贴板之后发布消息到Twitter,Facebook以及微博。&本篇文章将会告诉你如何使用UIActivityViewController把信息发送到iOS系统通用的标准服务,我还会告诉你怎么定制在viewcontroller中显示的服务列表。&
创建UIActivityViewController&//&创建内容NSString *message = @"The Farm";UIImage *image = [UIImage imageNamed:@"Farm.jpg"];NSArray *arrayOfActivityItems = [NSArray arrayWithObjects:message, image, nil];&//&显示view controllerUIActivityViewController *activityVC = [[[UIActivityViewController alloc]& initWithActivityItems: arrayOfActivityItems applicationActivities:nil] autorelease];&在模拟器上viewcontroller看上去是下面这个样子(我不明白为什么Messages应用的图标为什么没显示出来):
如果你想要定制自己的服务列表,你可以指定一系列的串字符串,每串字符串是activityType,代表你不想在viewcontroller中显示的服务。&//&定制需要展示的服务activityVC.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypeMessage,& & UIActivityTypeSaveToCameraRoll, UIActivityTypePrint, UIActivityTypePostToWeibo,&& & UIActivityTypeCopyToPasteboard];&这样设置之后,view controller会是下面这样。
&下次我会教你如果创建Activit来支持客服系统。
iOS 6中NSString新用法
iOS 6中NSString对象有些新的使用方法,可以让字符串转变成全部大写,全部小写,或者每个单词首字母大写。&代码如下所示:&
NSString *str = @"mobile developer tips";
// Convert string to uppercase
NSString *upperStr = [str uppercaseStringWithLocale:[NSLocale currentLocale]];
NSLog(@"upperStr: %@", upperStr);
// Convert string to caps
NSString *capStr = [upperStr capitalizedStringWithLocale:[NSLocale currentLocale]];
NSLog(@"capStr: %@", capStr);
// Convert string to lowercase
NSString *lowerStr = [capStr lowercaseStringWithLocale:[NSLocale currentLocale]];
NSLog(@"lowerStr: %@", lowerStr);&输出内容如下:&
1、HTTP请求协议名://主机名:端口号/资源URI
/*******************************GET /index.html HTTP/1.1Host: localhost:8088connection: Keep-Alive
******************************/
2、request headerHost, 请求头,标名请求主机器名,可为IP也可为域名,http1.1后强制使用,用此请求信息,可在服务端做WEB虚拟机,实现一机多WEB服务Content-Length,请求、响应体的数据字节大小Accept-Encoding,请求头,可接受的文本压缩算法,如: gzip, deflateAccept-Language,请求头,支持语言,客户端浏览器的设置,如:zh-cn,q=0.8,en-q=0.5,q=0.3User-Agent,请求头,浏览器信息,如:Mozilla/5.0 (M Intel Mac OS X 10.7; rv:12.0) Gecko/ Firefox/12.0,细心会注册到IE也会用Mozilla,这是一个历史问题,早期WEB服务器貌似有问题,只支持Mozilla,微软IE做为后起之秀只能伪装成MozillaCookie,请求头,服务器或客户端在上次设置的COOKIE,包括作用域名(.),过期时间,键与值。大部分WEB服务器都会在第一次访问时在响应头上加Set-Cookie,如:BAIDUID=CDBBB4CE65EC50EE4BB65E9A:FG=1; expires=Wed, 07-Nov-42 07:03:34 GMT; path=/; domain=.Referer,从一个连接打开一个新页面,新页面的请求一般会加此信息,标名是从哪里跳过来的,所有的页面的打开历史链就可被挖掘出来,有利于分析用户行为与CPS分成
3、reponse headerContent-Type, 响应的数据类型:text/charset=gbkContent-Length,响应的数据体大小Content-Encoding, 如果为文本、HTML信息,则使用的编码方式Date, 当前服务器日期Server, 服务器名Set-Cookie,第一次访问或服务设置COOKIE时,响应头里会有此信息,如,BAIDUID=CDBBB4CE65EC50EE4BB65E9A:FG=1; expires=Wed, 07-Nov-42 07:03:34 GMT; path=/; domain=.
4、 Cache-Control , Expires控制缓存的两个响应头,如果都出现在响应头里,按Cache-Controler计算Cache-Control,为响应头信息,取值为:Public,当前系统任何登录的用户都可使用Private,当前系统登录的此用户进行缓存no-cache,不做缓存max-age,缓存指定秒数,如Cache-control: max-age=5,表示当访问此网页后的5秒内再次访问不会去服务器
Expires,为响应头,Http1.1以上版本,与Max-Age一样,用来控制缓存的失效日期参考资料:/tag/cache-control/
5、 Last-Modified,& If-Modified-SinceLast-Modified, 为响应头,标名本资料上一次的修改时间If-Modified-Since,为请求头,把上一次请求的Last-Modified日期信息为值进行请求,如果服务器判断Last-Modified时间与服务器一致则直接返回304,浏览器使用本地缓存进行显示。一般用来节省带宽,加速请求与显示。
6、ETag + If-Match同样是缓存策略,做为以上的补充ETag,为响应头,在 http1.1中规定为一个字串,具体格式未定义,用来校验客户端缓存If-Match,为请求头信息,把上一次请求响应的Etag带上进行请求,服务端的处理方法比较灵活,做为Cache-Control,Expires,Last-Modified的补充,可不以时间为参考的缓存策略。Apache默认对html的Etag取值为INode+Mtime+Size如:Etag"2e681a-6-5d用途:a,仅仅改变的修改时间,但内容未做修改b,修改非常频繁,一秒内修改千次,但Cache-Control与Last-Modified,只能控制在秒级,这是对控制力度的进一步提升c,某些服务器不能精确的得到文件的最后修改时间,个例,我们使用的服务器都已支持,所以所用不多
7、Connection Keep-AliveHTTP协议采用TCP协议,每次页面资源请求都被规定为一次连接,而每次连接的TCP三次握手关闭时的四次通信与端口滞留等待防止数据包未传送,而每个TCP都是一个打开文件IO句柄数,Unix/Linux又对这个做了严格的限制。一个网页,大量资源文件(html\css\javascript\image)需要加载量时需要大数据量的TCP连接,为了减少socket连接数提供了KeepAlive,使一个tcp连接可重复使用。事实也证明用Keep-Alive速度也更快(但移动客户端接口开发会关掉此属性)。
8、Range:& 10-100取信息的一部分,断点下载时常用
9、返回状态码200,返回成功501,服务器内容错误304,使用本地缓firebug404,资源没有找到参考:/03/curl-http_code-%E7%8A%B6%E6%80%81%E7%A0%81-%E6%84%8F%E4%B9%89%E5%8F%8A%E4%BF%A1%E6%81%AF/
10、http 协议监察工具:Firebox:httpfox、live http header,firebugIE:httpwatch、iehttpheader
开源的电子书阅读器项目
iphone平台上开源的电子书阅读器项目:
Objective-C与JavaScript的交互
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS中与UIWebView中的网页元素交互。
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS中与UIWebView中的网页元素交互。
stringByEvaluatingJavaScriptFromString
使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用。我们在界面上拖放一个UIWebView控件。在Load中将google mobile加载到这个控件中,代码如下:
- ( void )viewDidLoad{[super viewDidLoad];webview.backgroundColor = [UIColor clearColor]; webview.scalesPageToFit = YES;webview. delegate = NSURL * url = [[NSURL alloc] initWithString: @" .hk/m?gl=CN&hl=zh_CN&source=ihp " ];
NSURLRequest * request = [[NSURLRequest alloc] initWithURL:url];[webview loadRequest:request]; }
我们在webViewDidFinishLoad方法中就可以通过javascript操作界面元素了。
1、获取当前页面的url。
- ( void )webViewDidFinishLoad:(UIWebView * )webView { NSString * currentURL = [webView stringByEvaluatingJavaScriptFromString: @" document.location.href " ];}
2、获取页面title:
- ( void )webViewDidFinishLoad:(UIWebView * )webView { NSString * currentURL = [webView stringByEvaluatingJavaScriptFromString: @" document.location.href " ];
NSString * title = [webview stringByEvaluatingJavaScriptFromString: @" document.title " ]; }
3、修改界面元素的值。
NSString * js_result = [webView stringByEvaluatingJavaScriptFromString: @"document.getElementsByName('q')[0].value='朱祁林'; " ];
4、表单提交:
NSString * js_result2 = [webView stringByEvaluatingJavaScriptFromString: @" document.forms[0].submit(); "];
这样就实现了在google搜索关键字:&朱祁林&的功能。
5、插入js代码
上面的功能我们可以封装到一个js函数中,将这个函数插入到页面上执行,代码如下:
[webView stringByEvaluatingJavaScriptFromString: @" var script = document.createElement('script'); "
" script.type = 'text/javascript'; "
" script.text = \"function myFunction() { "
" var field = document.getElementsByName('q')[0]; "
" field.value='朱祁林'; "
" document.forms[0].submit(); "
" document.getElementsByTagName('head')[0].appendChild(script); " ];
[webView stringByEvaluatingJavaScriptFromString: @" myFunction(); " ];
看上面的代码:
a、首先通过js创建一个script的标签,type为'text/javascript'。
b、然后在这个标签中插入一段字符串,这段字符串就是一个函数:myFunction,这个函数实现google自动搜索关键字的功能。
c、然后使用stringByEvaluatingJavaScriptFromString执行myFunction函数。
RegexKitLite(正则表达式支持)
地址:&正则表达式大家都知道。但是iPhone SDK居然当他不存在?这怎么能忍啊!果断用RegexKitLite。虽然叫的是Lite,但是功能很full。示例代码。&
// finds phone number in format nnn-nnn-nnnn
NSString *regEx = @"[0-9]{3}-[0-9]{3}-[0-9]{4}";
for(NSString *match in [textView.text componentsMatchedByRegex:regEx]) {
NSLog(@"Phone number is %@", match);
iPhone实战:定位与地图
个人觉得地理位置这部分的知识其实是相当有趣的。这些功能看起来是挺复杂,但在实际的开发过程中,iOS为我们封装了大部分的功能,让我们不需要学习太底层的知识。个人觉得地理位置这部分的知识其实是相当有趣的。说到定位其实在大多数的社交软件中都有这样的一个功能,用户可以共享自己的位置并且查看其他用户的位置,从而更容易地结交一些附近或者在同一地区的朋友,又或者在地图上显示自己的当前位置,并且显示附近的餐厅或者咖啡厅。这些功能看起来是挺复杂,但在实际的开发过程中,iOS为我们封装了大部分的功能,让我们不需要学习太底层的知识,通过他提供的两个库就能轻松实现。接下来我会一步一步地讲述相关知识。
1、获取当前定位iOS提供了一个叫作CoreLocation.framework的框架。使用他可以取到自己的定位信息(经纬度)。请参考下面代码片段:if([CLLocationManager locationServicesEnabled]){
//定位功能开启的情况下进行定位
CLLocationManager *manager = [[CLLocationManager alloc] init];
manager.distanceFilter = kCLDistanceFilterN
manager.desiredAccuracy = kCLLocationAccuracyB
manager.delegate =
[manager startUpdatingLocation];}- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation{
[manager stopUpdatingLocation];}- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error{
[manager stopUpdatingLocation];}如上面代码所示CLLocationManager就是用于获取定位信息对象类,在实际应用中可以根据自己的需要来设置定位的更新频率以及定位准确度。其中代码中的distanceFilter表示更新位置的距离,假如超过设定值则进行定位更新,否则不更新。代码中的kCLDistanceFilterNone表示不设置距离过滤,即随时更新地理位置。desiredAccuracy属性表示取得定位的精度,kCLLocationAccuracyBest表示最精确,但也预示着需要消耗更多的时间和电量,所以应该根据需要设定。那么CLLocationManager是通过什么方法来开启定位的呢?他是通过调用startUpdatingLocation开启定位功能,然后使用stopUpdatingLocation停止定位,其中定位信息是通过loctionManager:didUpdateToLocation:fromL委托方法来通知委托对象的,因此委托对象必须实现CLLocationManagerDelegate委托。在返回定位信息委托方法中主要的两个参数是newLocation和oldLocation,newLocation表示最新定位,oldLocation表示上一次的定位信息。这两个都是CLLocation对象。以下是CLLocation的属性说明:
altitude海拔高度
coordinate经纬度
course行驶方向
horizontalAccuracy水平方向的精确度
Speed行驶速度
timestamp时间戳
verticalAccuracy垂直方向的精确度
2、获取地理位置信息当你取到了一个经纬度信息时,也许还有这样的一个需求,那就是当前的经纬度所对应的地理位置信息是什么。那么这时候我们需要用到框架来为我们实现这一功能,那就是MapKit.framework。在这个框架中有一个叫MKReverseGeocoder的类可以帮助我们实现反向解析地理位置。请看一下代码:-
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation{
MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
geocoder.delegate =
[geocoder start];}- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder
didFindPlacemark:(MKPlacemark *)placemark{
NSLog(@"\n country:%@\n postalCode:%@\n ISOcountryCode:%@\n locality:%@\n subLocality:%@\n administrativeArea:%@\n subAdministrativeArea:%@\n thoroughfare:%@\n subThoroughfare:%@\n",
placemark.country,
placemark.postalCode,
placemark.ISOcountryCode,
placemark.administrativeArea,
placemark.subAdministrativeArea,
placemark.locality,
placemark.subLocality,
placemark.thoroughfare,
placemark.subThoroughfare); }
(void)reverseGeocoder:(MKReverseGeocoder *)geocoder
didFailWithError:(NSError *)error{
NSLog(@"reverse geocoder fail!!"); }上面的代码是在获取到经纬度后,立刻进行反向地理位置解析的。其实MKReverseGeocoder用法也比较简单,通过经纬度初始化后直接调用start方法就可以实现反向解析了,然后等待返回,其返回是通过委托形式通知的。所以委托对象必须实现MKReverseGeocoderDelegate委托。解析成功后会返回一个MKPlacemark的对象里面包含了相关的地理位置信息(包括国家、地区、街道等)。但从iOS5之后MKReverseGeocoder成为了不推荐使用的类。因此有一个新的类取代了他的作用,那就是CLGeocoder类,使用该类进行反向解析也非常容易,请看下面代码:CLGeocoder *geocoder=[[CLGeocoder alloc] init];[geocoder reverseGeocodeLocation:newLocation
completionHandler:^(NSArray *placemarks,
NSError *error)
CLPlacemark *placemark=[placemarks objectAtIndex:0];
NSLog(@"name:%@\n country:%@\n postalCode:%@\n ISOcountryCode:%@\n ocean:%@\n inlandWater:%@\n locality:%@\n subLocality:%@\n administrativeArea:%@\n subAdministrativeArea:%@\n thoroughfare:%@\n subThoroughfare:%@\n",
placemark.name,
placemark.country,
placemark.postalCode,
placemark.ISOcountryCode,
placemark.ocean,
placemark.inlandWater,
placemark.administrativeArea,
placemark.subAdministrativeArea,
placemark.locality,
placemark.subLocality,
placemark.thoroughfare,
placemark.subThoroughfare);
}]; 从代码来看,CLGeocoder类没有使用委托的形式通知返回状态,而是通过block的方式进行回调,而且MKReverseGeocoder委托只返回了一个地标位置,但是CLGeocoder则返回了一个包含多个地标位置的数组,但这个数组在通常状态下是只有一个元素,如果存在多个元素那证明了给定解析的经纬度被解析到多个不同的地标信息。如果解析错误或者调用cancel方法则此参数为nil。
3、地图显示想更加形象地表现出位置信息靠文字的描述是远远不够的,因为使用地图来显示地理位置将会给用户带来全新的体验。在iOS里面已经将Google地图封装到SDK里面了,我们可以用很少的代码来实现很多在地图上的操作(如标记位置、绘画线路等)。下面的代码是生成一张地图并显示到界面上:-
(void)viewDidLoad{ [super viewDidLoad];
MKMapView *mapView=[[MKMapView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 460.0)];
mapView.delegate =
[self.view addSubview:mapView];
[mapView release];}这够简单吧,上面的设置地图委托对象是因为在下面要标记地理位置时需要用到的。那么如何把取到的经纬度信息显示到地图上呢?其实每个坐标信息在地图中显示后都对应一个MKAnnotationView,而MKAnnotationView又负责解析了一个实现MKAnnotation协议的数据对象。因此我们首先要做的事情就是把取到的经纬度转换为MKAnnotation协议对象。先定义一个实现MKAnnotation协议的类:@interface
DemoAnnotation : NSObject&MKAnnotation& { CLLocationCoordinate2D _}-(id)initWithCoordinate:(CLLocationCoordinate2D)@end @implementation DemoAnnotation@synthesize coordinate=_-(id)initWithCoordinate:(CLLocationCoordinate2D)coordinate{ if (self = [super init]) {
_coordinate= } }-(void)setCoordinate:(CLLocationCoordinate2D)newCoordinate{ _coordinate=newC}-(NSString *)title{ return @&我的位置&;}-(NSString *)subtitle{ }@end 上面的类只是简单地保存了经纬度信息。记得注意的是MKAnnotation协议中的title和subtitle的作用,如果你在显示AnnotationView设置其canShowCallout属性为YES时,则当用户点击AnnotationView时会弹出一个Callout视图,用于显示title和subtitle,假如设置title为nil那么即使canShowCallout为YES也不会弹出Callout视图。接下来要改写一下获取定位成功后的方法,等待获取定位成功后把经纬度设置到地图上显示。实现代码如下:-
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation{ DemoAnnotation *annotation = [[DemoAnnotation alloc] initWithCoordinate:newLocation.coordinate]; [_mapView addAnnotation:annotation]; [annotation release]; MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
geocoder.delegate =
[geocoder start];}上述代码中加粗部分的代码就是把经纬度信息封装到刚才定义好的对象中。然后通过addAnnotation方法传递给MapView;这里的_mapView是把之前viewDidLoad方法中的临时变量改变为类属性以达到跨方法引用的目的。经过上面步骤已经把我的位置引入到地图里面了,但现在还不会显示在地图上,因为还需要实现MapView中的协议,告诉MapView如何显示你Annotation。以下代码采用iOS中默认的大头针样式来显示位置。如下:-
(MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id &MKAnnotation&)annotation{
NSString *annotationViewId=@"CurrentUserAnnotationView";
MKPinAnnotationView *annotationView = (MKPinAnnotationView *)
[mapView dequeueReusableAnnotationViewWithIdentifier:annotationViewId];
if (annotationView==nil)
annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationViewId] autorelease]; annotationView.canShowCallout = YES;
return annotationV}上面的协议方法就是MapView告诉你他需要显示哪个annotation,然后显示的样式由用户你自己决定,但必须要继承MKAnnotationView类。到这里对于定位和地图的应用就告一段落了,当然关于 MKMapView 还有一些更加高级的特性,例如:动态编辑 Annotation 、绘画路线图等应用我在这里暂时不说了,等偶再研究透彻一点再给大家分享。
iOS 6推出的Smart App Banner,令人思考
即将发布的iOS 6将向所有iOS设备进行推送,其中包含了大量新的特性。对于应用开发者而言,有很多值得注意的地方。作为一个手机游戏交叉推广平台,MIX智游汇认为iOS 6 中Smart App Banner会对应用推广带来很大的影响,或许移动版网页将会带来新的发展机遇。9月12日,苹果终于在千呼万唤之中推出了它的新设备。作为消费者,人们自然最关心诸如iPhone 5 这些新的设备;但作为开发者,尤其是手机游戏的开发者,新一代的苹果系统iOS 6以及随之共同推出的新特性,才应当是最受关注的。在《为 iOS 6 准备的 5 个 ASO 建议》一文中,我们就已经提醒开发者要在iOS 6推出伊始,为自己的App做好ASO(应用商店优化)的准备。那时我们注意到在iOS 6中Safari 的一个重要变化&&智能应用提示条(Smart app banner),这种提示条广告会出现在你的移动版网页上。当用户在移动设备上打开你的网页,如果你的站点在App Store中有提交原生的App,这个条幅将会提示用户前往下载。
不过对于网站开发者来说,你需要在网站上增加一段代码,才能实现Safari中的这项功能。你可以将如下代码增加到您网站中的&head&部分,将其中的&YOUR_APP_ID& 替换为你自己的App ID:
&meta name=&apple-itunes-app& content=&app-id=YOUR_APP_ID&&苹果在iOS中推出这样的提示条对游戏开发者的影响是什么呢?Web和App Store最大的区别就是前者可以通过超链接自由跳转,而后者没有办法这么做。在App中,获取一个用户的成本可能高达1-2美元。对于很多轻型游戏而言,他们没有办法从每个用户身上赚取这么多收益,这样App经济就无法健康的运转下去。苹果看到了这个问题,所以需要改变App Store整体的规则,包括引入更加智能的搜索、排名机制,更多个性化推荐应用的方式,也包括更多的把Web的流量转化成App下载。把Web的流量转化成App下载,涉及到的第一个问题就是将SEO的投入有效地转化为ASO的产出。与SEO不同,iOS中苹果死死把控着App经济的入口App Store,通过摸索应用商店的算法和排名规则来实现ASO异常艰难,苹果自然也不接受类似搜索引擎的关键词购买或是广告推荐。目前来看,ASO无论是在方法的多样性和有效程度上都还没有公认和权威的答案。而Web端通过各种SEO策略提升访客数字的方法已经十分成熟。很多网站都使用一些常见的SEO策略或是搜索引擎关键字投放来提升网民发现自己网站的可能。但实现ASO的转化不应该止于Smart App Banner,它不仅仅是在Web版网页上增设一个下载链接这么简单。它涉及到的或许还有更多。对于游戏用户来说,让他仅仅依赖一个截图或是一百字的文字描述就去花钱购买你的游戏,难度稍微大了些。所以,一个适合在移动版网页上实现的初步游戏试玩体验也是必不可少的。此外,Smart App Banner或许也给我们的ASO思路打开了一扇门,上述的代码如果可以添加到你的网站上,那么添加到其他网站上也就不是不可能的。不过在游戏圈子里面,可能大家还没有意识到这么做的好处。随着Smart App Banner的推出,移动版网页的好处开始呈现出来。具体的好处可能有什么呢?1. Web 的流量可能更低成本:通过搜索、网址导航、门户或者社交网络可以带来足够多的低成本甚至免费的流量给游戏的网页,并通过 Smart App Banner 的形式巧妙的带用户去下载游戏的完整版本;2.用户不喜欢跳出正在进行的活动而直接去App Store:提供一个包含Smart App Banner的着陆页,可以在很多带有内置浏览器功能的应用中打开,用户无需离开当下进行的活动就能了解你的游戏内容,给用户更好的第一印象;3.和游戏评测、玩家社区网站合作:在相关的页面放置Smart App Banner代码,当用户使用Mobile Safari浏览器访问这些他们喜爱的网站的时候,就会看到醒目的下载提示条。如果能够配合你的媒体沟通策略,在你的游戏评测文章上配合这样的banner,很可能会完成出人意料的下载转化率;4.整合HTML 5版游戏体验和原生游戏体验:对于多平台的游戏而言,可以提供给一个轻量级版本的HTML5版本,让玩家初步体验游戏的精彩段落,并加入Smart App Banner导入原生应用完整体验的下载,这样获得的用户,因为更多的预览了游戏的情节、画面和故事,留存率和活跃度都会更好;5.利用Web统计分析工具提高转化率:是否使用Smart App Banner应该基于更多的数据分析,好在网页的数据统计工具已经非常强大,利用Google Analytics等工具可以快速了解访客在页面上的行为,并利用A/B测试的方式决定是提供游戏网站链接还是 App Store直接下载的链接。当App的经济的入口都已经开始改变,你已经没有时间继续等待。Smart App Banner出现后,如果你还没有给自己的网站设计移动版本,那么你要开始行动了。是的,就是现在。
苹果的5个秘密:iPhone曾采用直角边设计
 正如业界知名记者伊恩&谢尔(Ian Sherr)所说,苹果是&世界上最神秘的公司之一&,但它同竞争对手三星在联邦法院打官司注定是要付出代价的:被迫披露公司的内部机密。为了证明三星抄袭了iPhone和iPad设计,苹果多位高管不得不出庭作证,披露公司的产品创新过程和营销活动,而此前外界对这两项活动的细节一无所知。  从流产的苹果汽车研发计划到iPhone营销成本,以下即是苹果在同三星的法律诉讼中披露了五个秘密:  1、iPhone研发禁从外部挖人  据美国科技博客Gizmodo披露,当苹果已故创始人史蒂夫&乔布斯(Steve Jobs)在2004年指示iOS操作平台设计主管斯科特&弗斯塔尔(Scott Forstall)开发iPhone时,他给出了一系列&严格的限制&。弗斯塔尔在出庭作证时称,在这个代号为&紫色项目&(Project Purple)的iPhone研发计划中,乔布斯只允许他使用苹果内部的员工,绝不能从外部挖人。  弗斯塔尔只好从内部挖掘&超级巨星&,甚至于这些人在接到他的邀请以前,根本不清楚&紫色项目&是做什么的。弗斯塔尔说,他告诉参与&紫色项目&的潜在人选说:&我们将启动另一个项目,由于这个项目的保密性,我不能告诉大家它究竟是做什么的。但在接下来的几年时间里,你们将不得不牺牲晚上和周末的休息时间。&  2、搏击俱乐部式研发管理  最初,弗斯塔尔和他的团队只占用了苹果总部办公楼的其中一层,但随着这个团队规模扩大至1000人左右,且全部向弗斯塔尔直接汇报工作,他们占据了整栋办公楼,而且还安装了摄像头和门禁系统,以增加这一项目的安全性。  据报道,&有时,连这个团队的成员每次都不得不出示五六次证件才能进入里面&。弗斯塔尔在大门口贴了写有&搏击俱乐部&字样的标牌。所谓的&搏击俱乐部&其实是一部根据同名畅销书改编的电影,由布拉德&皮特(Brad Pitt)主演,俱乐部成员被告知:&搏击俱乐部的第一条规则就是,&大家不能谈论搏击俱乐部。&&  3、iPhone曾采用直角边设计  苹果还向法庭提交了一些展示各种iPhone原型机的文件,其中几款原型机具有&球状后侧和直角边设计&。当三星的律师团问到苹果如何确定iPhone最终设计的时候,苹果资深设计师克里斯托弗&斯特林格(Christopher Stringer)回答说:&它是我们设计中最了不起的部分。当我们看到这个东西之后,我们知道就是它了。&  三星律师团还试图证明,苹果在iPhone设计过程中还从三星及其他厂商生产的手机中获得了灵感,从而否定苹果有关三星抄袭iPhone的说法。对此,弗斯塔尔作证时说:&我从未指示任何人去抄袭三星的设计,我们希望开发极为出色的功能,所以我们没有任何理由去借鉴他们已经做出来的东西。&  4、考虑开发7英寸平板  苹果高管之间交流的内部文件显示,2011年初,在看到三星Galaxy Tab 7取得成功以后,苹果也考虑开发一款7英寸平板电脑,尺寸小于当前的9.7英寸iPad。苹果高管艾迪&库伊(Eddy Cue)在写给乔布斯的电子邮件中称:&我认为7英寸平板电脑有市场,我们应该开发这种产品。&据美国IT网站PCWorld披露,在iPhone之前,苹果还考虑过开发汽车,原因是&iPod的成功让苹果相信它不仅仅是一家电脑公司。&  5、苹果也做市场调查  苹果负责全球营销的高级副总裁菲尔&席勒(Phil Schiller)表示,在第一代iPhone于2007年上市后,苹果寻求激发消费者对这款产品的渴望。苹果以&产品即主角&理论为依据,展开了大规模营销活动,在这种活动中,产品的外形和功能是流行主题。  据席勒介绍,迄今苹果共为iPhone投入了6.47亿美元推广费,而2010年上市的iPad的推广费用也达到4.57亿美元。他还透露,尽管乔布斯生前一再强调,苹果从不进行任何市场调查或&焦点小组&研究,以此做为新产品开发的依据,但苹果在新品开发中确实十分看重&焦点小组&的研究结果。
互联网企业做手机潮退 客户端软件成热点
汹涌的互联网手机潮看来正在退却。由于投入巨大,不符合自身优势,缺乏盈利模式等原因,让近日包括搜狐、网易等企业均宣布不会做手机。伴随着搜狐、网易的退出,曾喧嚣一时的互联网企业做手机热潮出现短暂沉寂。分析认为,成熟的互联网厂商不应该推出硬件,相反可以改变策略,通过优质客户端软件切入移动互联网领域。  互联网企业做手机潮退  有人连夜赶科场,有人辞官归故里。前一段时间,互联网厂商还在红红火火地投身智能手机,但近日搜狐、网易两大门户均开始远离手机业务。  近日,互联网门户搜狐的CEO张朝阳在谈及移动互联网战略时表示,搜狐不会效仿其他互联网公司做手机,把手机硬件、软件和内容三者放着一起的&苹果模式&很难做到,找厂商贴牌生产亦很难保证完美用户体验。  无独有偶,在张朝阳公开表示不会做手机的同时,业界传出此前积极&慎重考虑&做大&屏幕双核千元智能手机&的网易,被传出已终止做手机项目。据网易内部人士证实,网易手机项目已经宣告终止,原因是手机负责人对网易推出手机一事相当动摇,极力劝说丁磊取消这一规划。最终,让丁磊下决心放弃做手机。  在四大门户中,新浪曾与HTC出品过微博手机,此后就再未传出过做智能手机的计划,腾讯也坚持做互联网和移动互联网产品。这意味着,伴随着搜狐和网易退出,四大互联网门户均退出做智能手机。互联网企业做手机暂告热潮。  手机客户端软件成热点  &只找一个厂商贴牌生产,要想创造完美的用户体验不太可能,所以我们还是从最擅长的基因出发去做事情。&在明确宣布放弃做互联网手机后,张朝阳表示,搜狐的目标是做好手机上的内容和相关软件。据悉,目前搜狐在移动平台上的布局包括搜狐新闻客户端、搜狐视频、搜狗输入法以及其他垂直领域产品,如违章查询、搜狐孕典等。  张朝阳的做法似乎是其他三家互联网厂商一致的做法。比如,新浪开始将精力放于如何让早已成为手机标配软件的微博盈利,腾讯则进一步推动目前已经大获成功的微信产品。而网易CEO丁磊也化身互联网产品体验式,将网易新闻客户端、云阅读、有道词典、云笔记以及游戏类产品,作为网易在移动互联网领域决定深耕的方向。  广州的56网副总裁李浩告诉记者,成熟的互联网厂商普遍不应该推出硬件,相反可以改变策略,通过优质客户端软件切入移动互联网领域。  析因:做手机不赚钱  &很多厂商宣布做手机是为了赚眼球,实际上大互联网商均不做硬件手机,这也是合情合理的事情。&近日在一个技术论坛上,多位中小品牌手机负责人向记者表示,雷军做小米手机,是因为在互联网厂商中他赚钱比较少,因此乐意投身其他互联网大厂难以复制的硬件领域。  而周鸿祎做手机,则不过是他留意到PC流量大量转向手机,他需要通过与海尔、阿尔卡特等厂商合作,捍卫流量入口,360本身并不直接切入手机生产的任何环节。盛大做手机,最重要的原因是其&美国偶像&亚马逊在出硬件终端,但盈利模式是什么,盛大都未必想好。  业界普遍认为,与中型互联网商不同,拥有完善业务模式的四大互联网厂商则缺乏做手机的动力,退出做手机是迟早的事情。
关于iAd和Admob使用心得
根据坛子里面的前辈的经验,得到的结论是iAD的收益要高于Admob,看到过有人使用广告联盟或者是其他的平台来做整合.最后发现环境太复杂,因此就自己整理了一个方法
在应用上架之前一直在关心收益的问题(因为只是想简简单单试水).
根据坛子里面的前辈的经验,得到的结论是iAD的收益要高于Admob(就单单指广告类的收益),看到过有人使用广告联盟或者是其他的平台来做整合
.最后发现环境太复杂(个人不太喜欢使用别人现成的东东,主要是内容不可控),
因此就自己整理了一个方法(应用已经上架,已经证实可行).
国内和亚洲部分地区只能使用Admob.为了收益最大化,针对不同区域来使用不同的广告平台.
根据不同的访问ip(终端) 来区域终端的地域.
/ 这是一个api,使用最简单的http,get就可以返回区域码,网站有介绍对应区域码的地域.
直接上代码片断:
@protocol AdsDelegate &NSObject&
- (void) adLocationDone:(BOOL)_bIAD; // _bIAD标明是否使用iad&
// ........... 省略
- (void) getLocation
& &NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
& &[request setURL:[[NSURL alloc] initWithString:LOCATION_API]];
& &[request setHTTPMethod:@"GET"];
& &[request addValue:@"text/html" forHTTPHeaderField:@"Content-Type"];
& &[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
& &connection_ = [[NSURLConnection alloc] initWithRequest:request delegate:self];
& &[connection_ start];
& &[request release];
// ........... 省略
- (void) connection:(NSURLConnection *)_Connection didReceiveData:(NSData *)_Data
& &[data_ appendData:_Data];
- (void) connectionDidFinishLoading:(NSURLConnection *)_Connection
& & NSString *string = [[NSString alloc] initWithBytes:[self.receivedData bytes]
length:[self.receivedData length] encoding:NSUTF8StringEncoding];
& & [string release];
& &LogDebug(("connectionDidFinishLoading"));
& CFRunLoopStop(CFRunLoopGetCurrent());
& &NSString *result &= [[NSString alloc] initWithData:data_ encoding:NSUTF8StringEncoding];
& &LogDebug(("%s", [result UTF8String]));
& & & NSRange &range = [result rangeOfString:@"CN"];
& & & if (range.length == 0)
& & & range = [result rangeOfString:@"KP"];
& &} /* end if */
& &if (delegate_)
& & & [delegate_ adLocationDone:(range.length == 0)];
// & & &[delegate_ adLocationDone:YES];
& &} /* end if */
当成功并且返回是_bIAD的时候才使用iad来. 其他情况(包括失败)均视为使用admob.
后期看情况,对两个广告平台的收益做个简单的分析.
附件: & (3 K)&
Cocos2d-HTML5系列教程[1] 配置开发环境
本教程涉及到Cocos2D-html开发环境的配置以及运行。如果你的环境已经可以使用就可以跳过这一步。这也将涉及到一个可选的web 服务配置。不管怎样,让我们先开始吧。
本教程涉及到Cocos2D-html开发环境的配置以及运行。如果你的环境已经可以使用就可以跳过这一步。这也将涉及到一个可选的web&服务配置。不管怎样,让我们先开始吧。
第一步你要做的事情是下载cocos2d-html5代码,
找到这个zip图标,如图所示,然后点击下载。
将所下载的东西保存到任意位置,只要记住保存在哪里,待会儿我们就会用到它。
现在我们将要安装一个Web服务器。这个部分是可选的,但是如果你想充分利用这些cocos 示例,你需要一个已安装的web 服务器。这可以让你在不同的机器上都能访问你自己的东西。而且,这是一个非常简单的过程。以下的这些说明都只针对windows系统。
先访问WAMP,下载他们的服务器程序。WAMP服务器是一个Apache,MySql,PHP和其他的一些程序的整合安装包,虽然它有点庞大,但它确实非常简单。选择哪个版本合适并不重要,只要你选择适用你的系统的版本就好(32位或64位)。
现在运行安装程序。我在需要输入的地方选择了默认值,然后让它安装到了C:\wamp。如果你保存到了不同的目录,你需要在后续的教程中做相应的调整。它需要你选择一个默认的浏览器,默认是指向explorer.exe。你可以指定一个你喜欢的其他浏览器,但很少有理由这样做。当涉及到邮箱设置,选择默认就行。WAMP服务器将会被安装完成,然后会运行在系统的托盘上。
就像这样,左击托盘按钮将会出现一个像上面的菜单。点击localhost可以查看正在运行的Web服务器。
如果一切按照计划进行,那么你将会看到:
现在,我们需要解压之前下载的cocos2d-html归档文件。打开zip文件,然后导航到如下的文件夹:
选择CTRL+A 全选整个目录的内容,然后粘贴到C:\wamp\www\.
现在在你的浏览器中,跳转到localhost/index.html,你将会看到:
假如你看到的图也是如此,恭喜,你已经成功建立了HTML5的Cocos2d环境。如果不是,确保在C:\wamp\www下有正确的内容,而不是存放在其子目录下。现在是可选做法,你可以开放访问权限,这样在同一网络的其他计算机也可以访问这个网页。我可不是一个apache专家(我是在IIS下出生并成长起来的),所以无论如何不要把这个当做权威!
当你想要编辑httpd.conf时,可以从托盘图标打开,如下图:
找到并定位到如下入口,要和我做的一样(显然要用你的IP地址):
设置你的IP和需要监听的端口号,入口通常是监听80端口:
#&Listen:&Allows&you&to&bind&Apache&to&specific&IP&addresses&and/or&
#&ports,&instead&of&the&default.&See&also&the&
#&directive.&
#&Change&this&to&Listen&on&specific&IP&addresses&as&shown&below&to&
#&prevent&Apache&from&glomming&onto&all&bound&IP&addresses.&
Listen&192.168.2.103:80&
将服务器名设置成你的服务器名,或者如果你没有配置DNS(例如),可以像我一样使用IP地址:
#&ServerName&gives&the&name&and&port&that&the&server&uses&to&identify&itself.&
#&This&can&often&be&determined&automatically,&but&we&recommend&you&specify&
#&it&explicitly&to&prevent&problems&during&startup.&
#&If&your&host&doesn't&have&a&registered&DNS&name,&enter&its&IP&address&here.&
ServerName&192.168.2.103&
最后,授权可以访问到你的www文件夹:
#&Possible&values&for&the&Options&directive&are&"None",&"All",&
#&or&any&combination&of:&
#&Indexes&Includes&FollowSymLinks&SymLinksifOwnerMatch&ExecCGI&MultiViews&
#&Note&that&"MultiViews"&must&be&named&*explicitly*&---&"Options&All"&
#&doesn't&give&it&to&you.&
#&The&Options&directive&is&both&complicated&and&important.&Please&see&
#&http://httpd.apache.org/docs/2.2/mod/core.html#options&
#&for&more&information.&
Options&Indexes&FollowSymLinks&
#&AllowOverride&controls&what&directives&may&be&placed&in&.htaccess&files.&
#&It&can&be&"All",&"None",&or&any&combination&of&the&keywords:&
#&Options&FileInfo&AuthConfig&Limit&
AllowOverride&all&
#&Controls&who&can&get&stuff&from&this&server.&
#&onlineoffline&tag&-&don't&remove&
Order&Allow,Deny&
Allow&from&all&
现在你应该可以在你的网络通过其他机器完全访问到你的网页服务文件夹(如果你外部没有防火墙或者已设置好端口转发)。当然你也可以没完没了地调整安全设置。
接着,保存更改并重新启动你的apache服务器,这又可以通过托盘图标来完成,仅左击并选择&Restart All Services&按钮。如果你的图标没有变绿,说明在httpd.conf文件中发生了错误。
再说一次,整个服务器的操作部分是可选的,你可以仅仅在本地的文件系统运行,但是这允许你使用所有的示例和测试单元。
说到这个,如果现在你打开浏览器至http://yourserverIP/tests/index.html,你应该已经连接到所有不同种类的Cocos2d测试,如下图:
现在你已经配置好,可以开始行动啦。在下个教程,我们将正式开始一些编程。
IOS开发之百度地图API应用 .
目前我们在做IOS开发中绝大多数用的是GoogleMap地图,IOS本身自带的也是googleMap,但是如果我们希望在地图上实时显示路况信息等部分功能,googlemap则没有,所以有时候我们可以应用百度地图做应用程序。下面我简单介绍一下BMapKit的应用:
一:首先我们有一点与用googlemap开发的不同,需要创建BMKMapManager管理应用程序的map,如果没有这个类,地图则不能够显示。
下面红色的字体是自己在百度官方申请的地图api&&key;
BMKMapManager& *_mapManager = [[BMKMapManageralloc] init];
BOOL ret = [_mapManagerstart:@"C3252C69EDB6D21A10B3FC9657FD1DDC7E0000**"generalDelegate:self];
if (!ret) {
NSLog(@"manager start failed!");
}二:在view中添加BMKMapView,同时设置BMKMapViewDelegate,添加annotation(记录兴趣点,BMKAnnotation),同时每个兴趣点可以设置其title(设置annotation的标题),以及subtitle(子标题)。
@interface MapBaiDu : UIViewController &BMKMapViewDelegate& { &}
@property (nonatomic, strong) BMKMapView *_mapV
- (void)viewDidLoad {
& &_mapView = [[BMKMapViewalloc] initWithFrame:CGRectMake(0, 39, 320, 377)]; & & //创建MKMapView
& & [self.view addSubview:_mapView];
& & [_mapView release];
& &_mapView.delegate = self;& & & & & & & & & & & & & &//设置代理
& & _mapView.showsUserLocation = YES; & & & & & & & &//设置为可以显示用户位置
& & CLLocationCoordinate2D & & & & & & & & &//设定经纬度
& &coordinate.latitude = 40.027283; & & & & //纬度
& & coordinate.longitude = 116.313217; & & &//经度
&BMKCoordinateRegion viewRegion = BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(1.0, 1.0));
& &BMKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];&
& &[_mapView setRegion:adjustedRegion animated:YES];}
上面最后一行 :设置当前地图的经纬度范围,设定的该范围可能会被调整为适合地图窗口显示的范围。region是BMKMapView的一个属性,类型BMKCoordinateRegion ,这行的意思是创建一个以coordinate为中心,上下左右个0.5个经(纬)度。但是这时我们需要注意一个问题就是,创建的区域是一个正方形,并不符合我们所需要的BMKMapView比例;之后用方法regionThatFits调整显示范围。
///表示一个经纬度区域
typedefstruct {
CLLocationCoordinate2D///& 中心点经纬度坐标
BMKCoordinateSpan///& 经纬度范围
} BMKCoordinateR
///表示一个经纬度范围
typedefstruct {
& & CLLocationDegrees latitudeD///& 纬度范围
& & CLLocationDegrees longitudeD///& 经度范围
} BMKCoordinateS
三:下面我们简单说一下delegate
1:地图区域改变时候调用函数:
- (void)mapView:(BMKMapView *)mapView regionWillChangeAnimated:(BOOL)
- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)2:annotation&
&*根据anntation生成对应的View
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id &BMKAnnotation&)
&*当mapView新添加annotation views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)
&*当选中一个annotation views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)
&*当取消选中一个annotation views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)而annotation分为两部分:BMKAnotation该类为标注点的protocol,提供了标注类的基本信息函数,title和subtitle分别是标题和子标题;同时可以设置标注的左边,在拖曳时候会被调用setCoordinate;BMKAnnotationView为标注点显示视图类,该类继承UIView,可以设置此view显示的图像,可以设置centerOffset(中心的位置,正的偏移使view超右下方移动,负的朝右上方移动,单位为像素),还可以设置calloutOffset改变淡出的气泡位置(正的偏移使view超右下方移动,负的朝左上方移动,单位是像素)。还可以设置其触摸事件,默认情况下为YES,可以选中,也可以是enabled = NO。其他的属性还有:selected,canShowCallout,leftCalloutAccessoryView,rightCalloutAccessoryView。等等
四:当地图view定位时调用函数:
&*当取消选中一个annotation views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)
&*在地图View将要启动定位时,会调用此函数
- (void)mapViewWillStartLocatingUser:(BMKMapView *)mapV
&*在地图View停止定位后,会调用此函数
- (void)mapViewDidStopLocatingUser:(BMKMapView *)mapV
&*定位失败后,会调用此函数
- (void)mapView:(BMKMapView *)mapView didFailToLocateUserWithError:(NSError *)
&*用户位置更新后,会调用此函数
- (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userL五:当有overlay(阴影标示某一个区域)生成或者新添加的时候调用此接口&
&*根据overlay生成对应的View
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id &BMKOverlay&)
&*当mapView新添加overlay views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didAddOverlayViews:(NSArray *)overlayV六:当点击annotation view弹出的泡泡时,调用此接口
*当点击annotation view弹出的泡泡时,调用此接口
- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)
九:annotation view有许多不同的状态,在不同状态的时候我们都可以设置不同的操作,拖动annotation view时view的状态变化
- (void)mapView:(BMKMapView *)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newState&
&& fromOldState:(BMKAnnotationViewDragState)oldS
& & BMKAnnotationViewDragStateNone = 0,& & & ///& 静止状态.
& & BMKAnnotationViewDragStateStarting,& & & ///& 开始拖动
& & BMKAnnotationViewDragStateDragging,& & & ///& 拖动中
& & BMKAnnotationViewDragStateCanceling, & & ///& 取消拖动
& & BMKAnnotationViewDragStateEnding & & & & ///& 拖动结束
typedef NSUInteger BMKAnnotationViewDragS
Three20学习资料
刚开始接触three20,在网上查了些资料,也知道现在这方面的资料很少。 所以我把自己找到的这方面资料网址整理出来,大家一块学习!!! 也希望其他人有这方面的资料也发出来!!~~~~~ Three20学习:
Three20 TTUrlMap 使用方法:
Three20中的extThree20XML用法 :
Three20系列之Three20概述 :
three20关于stylesheets用法(英文):
Three20 & TableView(TTTableViewController)用法:
iphone three20 保存本地的图片:
Three20之TTStyledTextLabel使用方法:
关于three20的TTURLRequest
请别叫我美工,否则你永远找不到好的搭档。
看了一篇讨论美工与设计师区别的帖子,有点想法,想再多说两句。
首先,虽然只是个称呼,但我很反感美工这个名字,就像别人叫你的外号一样。不知道是谁先起的,感觉像是个简称,也不知道完整的意思是什么,也许是美术工作者,也许是美术工人,whatever,在他们看来,美工的工作就是用些作图软件来修饰,来美化,把某种东西做的漂亮一些。
我觉得美工做的工作是设计的工作,但是却被人片面的理解了。在我看来,设计是通过各种形式和手段来解决一定的问题,美化和修饰只是其中的一部分,还有功能和组织结构,以及现在经常提到的易用性等等等等,只是我们更容易看到设计的表象,而忽视了设计实际起到的作用和真正所发挥的价值。
现在人们不都认识到了最有价值的是创意么,记得以前老师讲过,像nike、adidas、sony那些名牌卖的就是品牌,人家在本国没有工厂,只管设计和研发,机械性的制造操作都交给那些发展中国家,因为人家知道最有价值的东西在哪里,能获得最大利润的东西在哪里。
以前听人说美工的地位很低,经常让人看不起,这让我觉得很悲哀。作为一名设计师,不管在哪个领域里,不管东西做的好坏与否,都不是咱们机械制造出来的,都是一种创新,是这世界上独一无二的,难道这不值得骄傲和自豪么。也许还不能满足大家的需求,但通过不断的努力,来迎合人们共通的感觉和习惯,是可以让大多数人接受的。
话说回来了,不叫美工,那叫啥?光叫设计师总感觉有点那个,太牛x了的感觉。所以我还是习惯在之前加个前缀,缓和一下,比如网页设计师、UI设计师、交互设计师,哎~ 算啦,随便叫吧,一个称呼而已,但是!就别叫我美工,谢谢!
创建IOS 5 News Stand应用程序之一 – 外观
iOS 5提供了一个新的framework Newsstand framework,它允许把应用程序运行于News Stand中。实际上,News Stand相当于一个特制的文件夹专门放置报纸,杂志类应用程序。由于时间有限,这里我分几
&iOS 5提供了一个新的framework & Newsstand framework,它允许把应用程序运行于News Stand中。实际上,News Stand相当于一个特制的文件夹专门放置报纸,杂志类应用程序。由于时间有限,这里我分几个部分介绍这一技术。
首先介绍的就是怎样把一个应用程序改变成一个News Stand程序,这实际上有两步工作,一是让程序运行于News Stand,二是改变程序的图标。
1. 让程序运行于News Stand内
可以在Info.plist中添加
&key&UINewsstandApp&/key&&&&true/&
或者直接在Xcode中更改Info.plist(如图):
就这么简单,运行!你的程序就运行在News Stand中了。
不过,出现在News Stand中的是一个非常丑陋的白色方框。这一定不是你需要的效果。那么,我们需要第二步。
2. 为你的News Stand程序添加图标
应用程序仍需定义标准图标,这些图标用于settings,search,Push等,(而且你的程序有可能运行于iOS 5以前的版本)。Newsstand 图标可以反应应用的内容,可以动态更新,另外还可以加一些修饰,使其看上去就像真正的杂志或者报纸。
你可以直接修改Info.plist
或者直接使用Xcode编辑:
关于BindingType和BindingEdge应该很容易理解,我就不知赘述了。另外Newsstand中的图标不一定是正方形,只是不知有没有尺寸上的限制。
IAP应用内付费怎么实现?
参考苹果的In App Purchase文档:
简单地说:
1. iTunes Connect&& -&&& Manage Your Applications&&-&&&Manage In-App Purchases,创建你需要的Product,一般来说分为:消耗型、非消耗型、自动再生订阅、免费订阅、非自动再生订阅几种。消耗型一般适合于游戏里的虚拟物品,以及一次性使用的服务;非消耗型适用于功能解锁等
2. iTunes Connect 建立一个test user,专门用来测试in-App Purchases的,不会发生实际的购买
3. 实现IAP有内建模型和服务器模型两种,简单点的话直接内建模型,应用内搞定;要想安全一些,防破解高一些的话,就必须使用服务器模型了。
应用内建模型:
服务器模型:
首先确保项目链接了StoreKit.framework,应用中添加Store的详细步骤如下:
1. 定义应用需要递送的products。
Store Kit对products有一些限制,不允许应用对自己打补丁,或者下载额外的代码。products要么已经在应用的现有代码中,要么从远程服务器下载数据文件来实现。如果应用增加特性需要修改现有代码,必须发布一个新版本的应用。
2. 在iTunes Connect中为每个product注册详细信息
每次应用Store要增加一个新的product,都需要先在iTunes Connect中进行注册。每个product都需要一个唯一的ID字符串。App Store使用这个字符串来查找product信息以及处理支付请求。product ID特定于iTunes Connect账号,注册的方式与注册应用类似。
3. 确定系统能够处理支付
用户可以禁止应用内购买,因此你的应用需要先检查当前是否支持应用内购买。应用可以在显示Store给用户之前,或者在实际发起购买请求之前,进行这项检查。后者允许用户查看能够购买的products,即使应用内购买当前被禁止。
if ([SKPaymentQueue canMakePayments])
&&&... // 向用户显示Store
&&&... // 警告用户当前禁止应用内购买
4. 获取products的信息
应用创建一个SKProductsRequest对象,并初始化为一组你想要销售的product ID,添加一个delegate处理请求返回结果,然后就可以发起这个请求。响应结果保存了所有合法的products的本地化信息。应用必须首先获得product的信息,然后才能创建payment请求。
- (void) requestProductData
&&&SKProductsRequest *request= [[SKProductsRequest alloc]
initWithProductIdentifiers: [NSSet setWithObject:
kMyFeatureIdentifier]];
&&&request.delegate = self;
&&&[request start];
- (void)productsRequest:(SKProductsRequest *)request
didReceiveResponse:(SKProductsResponse *)response
&&&&NSArray *myProduct = response.
&&&&// 把信息显示到Store界面
&&&&[request autorelease];
5. 增加一个用户界面,显示products给用户
Store Kit不提供用户界面类,如何显示Store给用户是应用的事情。
6. 注册一个transaction observer到payment队列
应用实例化一个transaction observer,并将其注册到payment队列。
MyStoreObserver *observer = [[MyStoreObserver alloc] init];
[[SKPaymentQueue defaultQueue]
addTransactionObserver:observer];
如前所述,应用最好在启动时注册observer。交易完成之前应用退出,App Store也仍然记得这些交易。启动时注册observer确保所有之前排队交易的结果都能够被应用接收到。
7. 在应用的MyStoreObserver对象中实现paymentQueue:updatedTransactions: 方法
observer的paymentQueue:updatedTransactions: 方法在新交易被创建或更新时都会被调用
- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions
&&&&for (SKPaymentTransaction *transaction in transactions)
&&&&&&&&switch (transaction.transactionState)
&&&&&&&&&&&&case SKPaymentTransactionStatePurchased:
&&&&&&&&&&&&&&&&[self completeTransaction:transaction];
&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&case SKPaymentTransactionStateFailed:
&&&&&&&&&&&&&&&&[self failedTransaction:transaction];
&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&case SKPaymentTransactionStateRestored:
&&&&&&&&&&&&&&&&[self restoreTransaction:transaction];
&&&&&&&&&&&&default:
&&&&&&&&&&&&&&&&break;
8. observer在用户成功购买后提供相应的product
- (void) completeTransaction:
(SKPaymentTransaction *)transaction
// 应用需要实现这两个方法:记录交易、提供内容
&&&&[self recordTransaction: transaction];
&&&&[self provideContent: transaction
.payment.productIdentifier];
// 从payment队列中删除交易
&&&&[[SKPaymentQueue defaultQueue]
finishTransaction: transaction];
成功的交易包含一个transactionIdentifier属性和一个transactionReceipt属性,记录了已处理支付的详细信息。应用不需要对这些信息做任何处理。当然你可能希望记录这些信息并为交易建立一个审(我们的)查跟踪(audit trail)。如果使用服务器来递送内容,应用可以把receipt发送到服务器,然后由服务器向App Store验证该交易。
一旦你完成交付product给用户,应用必须调用finishTransaction: 来完成交易,交易将从payment队列中移除。为了确保products不会丢失,应用应该在调用finishTransaction: 之前交付内容。
9. 处理还原购买,结束交易
- (void) restoreTransaction:
(SKPaymentTransaction *)transaction
&&&&[self recordTransaction: transaction];
&&&&[self provideContent: transaction
.originalTransaction.payment.productIdentifier];
&&&&[[SKPaymentQueue defaultQueue]
finishTransaction: transaction];
这个方法类似于上面的购买。还原购买是一个新的交易,拥有不同的transaction ID和receipt。你可以单独保存这些信息,并建立审(我们的)查跟踪。但是当完成交易时,你还是要还原原始的交易,那里面保存了实际的payment对象和product ID。
10. 处理失败购买,结束交易
- (void) failedTransaction:
(SKPaymentTransaction *)transaction
&&&&if (transaction.error.code
!= SKErrorPaymentCancelled)
&&&&&&&&// 可以显示一个错误(可选的)
&&&&[[SKPaymentQueue defaultQueue]
finishTransaction: transaction];
通常交易失败都是用户决定不购买。应用可以读取失败交易的error域,从而了解为何交易失败。
对于失败的交易,应用唯一需要做的是从队列中移除它。如果应用在交易失败后显示一个对话框告诉用户交易出错,应该避免在用户主动取消时也显示该错误。
11. 做完上面所有以后,你就可以显示用户界面。当用户在Store中选择一项时,应用就创建一个payment对象,并将其添加到payment队列中。
SKPayment *payment = [SKPayment paymentWithProductIdentifier:kMyFeatureIdentifier];
[[SKPaymentQueue defaultQueue] addPayment:payment];
如果Store提供一次购买多个product的功能,你可以创建一个payment对象,并指定quantity属性
SKMutablePayment *payment =
[SKMutablePayment paymentWithProductIdentifier:
kMyFeatureIdentifier];
payment.quantity = 3;
[[SKPaymentQueue defaultQueue]
addPayment:payment];
分享10个最新的iPhone开发教程
本文分享了10篇英文iPhone开发教程,请各位按需点选。
阴影效果是电脑图形的一个很大的飞跃。使用它能够允许我们创建完整新特效并且有效控制屏幕。如果你希望使用阴影效果,你肯定需要阅读这个教程。
在这个教程中我们将学习如何在表视图中删除和编辑。
这个教程中我们将开发一个超简单的应用。我们将从一个空的项目来设计主要应用和登陆页面需要使用的核心数据布局。在成功登陆后我们将显示一个包含缩略图和数据的表。我们可以添加,删除并且使用相机功能来为每个数据条目拍照。
演示如何在一个MKMapView中使用KML文件。这个教程展示如何使用Mapkit的annotaions和overlay来在MKMapVIew中展示KML文件。
在这个教程中,我们将学习如何使用一个简单的使用FMS的敌人AI。
iphone SDK包含了各种你可以在iphone上使用的本地iphone过渡效果。使用Appcelerator API使得我们能够更加简单的执行这些过渡效果。在这个教程中,你将学习到如何执行各种过渡同时也可以学习如何使用MVC。
在这个3个部分的教程中我们将学习如何为一个小的商业客户设计iphone应用。在最后一部分中,我们将学习创建一个详细页面来展示公司的服务。
这篇文章中将介绍整个iphone的聊天应用开发过程
In this tutorial series we&re going to take the simple 2D &pew-pew ninja& game from our beginner Cocos2D tutorial and implement it completely in OpenGL ES 2.0, with GLKit!
在这个教程中我们将在Cocos2D教程中选择简单的2D"pew-pew忍者&游戏,然后重新使用openGL ES2.0来实现。
学习开发一个RSS阅读器是一个不错的学习iphone开发的方式。在这个教程中我们将创建一个RSS阅读器,同时也可以播放podcast。这个应用要求下载和解析RSS feed,并且在表中显示数据或者播放远端的podcast。这篇文章我假设大家知道一些cocoa的开发知识,但是如果没有的话,也很容易理解开发代码和过程。
未来是 Web App 的天下吗?
移动终端的原生程序大行其道,但基于web/browser的web app以其低成本开发、跨平台等优势不容忽视。随着HTML5的到来,值得思考。
一、Web App
Web无需安装,对设备碎片化的适应能力优于App,它只需要通过XHTML、CSS和JavaScript就可以在任意移动浏览器中执行。随着iPhone带来的WebKit浏览体验升级,使得专为iPhone等有WebKit浏览内核的移动设备开发的Web应用,也有了如App一般流畅的用户体验。
图1 Google Voice 和Google Gmail是Web App的设计典范
Web App的优势:
开发成本低
适配多种移动设备成本低
跨平台和终端
迭代更新容易
无需安装成本
Web App的劣势:
浏览的体验短期内还无法超越原生应用
不支持离线模式(html5将会解决这个问题)
消息推送不够及时
调用本地文件系统的能力弱
图2 街旁和百度小说,采用HTML5实现了接近Native的体验效果
二、Native App
而App因为位于平台层上方,向下访问和兼容的能力会比较好一些,可以支持在线或离线,消息推送或本地资源访问,摄像拨号功能的调取。但是由于设备碎片化,App的开发成本要高很多,维持多个版本的更新升级比较麻烦,用户的安装门槛也比较高。但是比较乐观的是,App store培养了一种比较好的用户付费模式,所以在Apple的生态圈里,开发者的盈利模式是一种明朗状态,其他market也在往这条路上靠拢。
图3 Gowalla和Awesome Note,是移动客户的经典设计案例
Native App的优势:
提供最佳的用户体验,最优质的用户界面,最华丽的交互
针对不同平台提供不同体验
可节省带宽成本
可访问本地资源
盈利模式明朗
Native App的劣势:
移植到不同平台上比较麻烦
维持多个版本的成本比较高
需要通过store或market的确认
盈利需要与第三方分成
乔布斯有一次谈到这个问题,他说Web是未来,虽然现阶段Native给了用户更好的体验。如果现在的开发者不有效的利用Web技术,那他就落伍了。但如果过分依赖Web,完全不用Native那也未必就是好事。
IOS平台上的app有三类:Web App,通过浏览器访问;Native App,通过app store安装;第三类叫Hybrid App,它虽然看上去是一个Native app,但只有一个UI WebView,里面访问的是一个Web App,比如街旁网最开始的应用就是包了个客户端的科,其实里面是HTML5的网页,后来才推出真正的原生应用。再彻底一点的,如掌上百度和淘宝客户端Android版,走的也是Hybrid App的路线,不过掌上百度里面封装的不是WebView,而是自己的浏览内核,所以体验上更像客户端,更高效。
图4 掌上百度和Naver客户端都是Web App+Native App的架构
图5 掌上百度的架构说明,客户端嵌套服务端,保证服务的高效迭代与更新
Google的Chrome OS和Android都是操作系统,但走的是两条路。ChromeOS走的是Web app的路。从Chrome OS 大会上发布的Chrome Web App能看出来,Google想为未来的Chrome OS做铺垫,鼓励更多的开发者开发出具有应用程序体验的Web App,正如Chrome OS官网上说的&&&Nothing but the web&。而Android走的是Native App的路。Android作为手机平台的操作系统,明显更注重应用程序开发,这一点从Android Market可以看出来。也许前微软首席架构师Ray Ozzie的评价更加一针见血:&Google的战略中Android(以app为主)是在赌过去,而Chrome OS(完全基于Web)则是在赌未来。&
于是我们可以得到这样一个启发,你要想服务于未来,必须不断的跟随技术发展的脚步,提供更好的网页服务和体验。但是人们是活在当下,为了当下用户的需求,又必须提供现阶段浏览体验最好的客户端产品。但是,客户端是笨重且迟缓的,它不能像传统网页那样,一有风吹草动就华丽转身,只能规划好功能点,一步一步迭代,毕竟用户的升级成本太高了。所以,就有了这种Web App + Native App的架构,在现有条件下给用户最好的浏览体验和升级迭代。
四、未来趋势
虽然我们都愿意相信,当Web的体验和Native的体验逐渐趋近的时候,人们更愿意把精力花在内容获取上,而不是软件交互上,但是现阶段的交互体验,恰恰是影响人们获取内容的主要短板。所以,趋势摆在那里,我们却无法预测这个时间差。
就跟电脑端的应用一样,虽然现在Web化的趋势已经非常明显了,但是还是无法取代你本机安装的一些工具类的、游戏类的应用,在Web技术没有达到本地应用的效率和体验之前,Web是无法颠覆Native的。
总得来说,Web只是我们作为设计者和开发者所期待的一种理想化结果,开发成本低、轻松跨平台、迭代更新快,但是显然,现阶段用户的期待和手机设备厂商的期待还是体验上更胜一筹的Native。Web之于我们,只是一种趋势。在这个也许会非常久的过渡阶段,对复杂产品来说,Native App + Web App也许是个不错的解决方案。
站长在关注

我要回帖

更多关于 苹果地理位置修改器 的文章

 

随机推荐