CocoaChina12月源码精选

转自http://www.cocoachina.com/applenews/devnews/2012/1227/5428.html

优秀开源代码解读:JS与iOS Native Code互调实现方法
http://www.cocoachina.com/newbie/basic/2012/1126/5177.html?1354777093

开源demo:各种模型图表
http://www.cocoachina.com/downloads/code/2012/1211/5304.html?1356333348

一个仿clear的demo
http://www.cocoachina.com/iphonedev/toolthain/2012/1215/5341.html?1356333642

Xcode4.5(iOS6SDK)和老版cocos2d支持iPhone5分辨率经验
http://www.cocoachina.com/gamedev/2012/1130/5221.html?1354780336

分享三个小工具(Url编解码、png解密、正则表达式
http://www.cocoachina.com/downloads/code/2012/1129/5214.html?1354780347

会说话的汤姆猫山寨版源码完整版
http://www.cocoachina.com/downloads/code/2012/1203/5237.html?1354780435

用Block代替delegate来传递值
http://www.cocoachina.com/downloads/code/2012/1129/5215.html?1354777210

用Lua脚本写app
http://www.cocoachina.com/applenews/devnews/2012/1128/5202.html?1354777164

批量导出缩放切片和@2x切片
http://www.cocoachina.com/downloads/code/2012/1127/5197.html?1354777132

仿陌陌个人资料照片墙
http://www.cocoachina.com/downloads/code/2012/1210/5291.html?1356333544

使用cocos2d-x 和Lua快速开发游戏
http://www.cocoachina.com/downloads/ebook/2012/1221/5390.html?1356333271

 

posted @ 2012-12-27 15:45 一梦浮生2012 阅读(4) 评论(0)  编辑

需要了解的10大开发趋势和技能

转自http://www.oschina.net/translate/10-development-trends-and-skills-for-developers-in-2013

技术的不断进化,使得软件开发也跟踪不仅进化,而且成熟了很多。一个不可否认的事实是,科技永远不能是静态的,因为它必须满足与之关联的人的需求。我所见过的软件世界,我必须承认,它是一个动态字段。就像我常说的,技术不断发展演变,有时真的让我们很难跟这个趋势保持同步。

作为一个码农,在码农的世界跟不上潮流是伤不起的。写代码心如止水,但是此时此刻你应该准迎接新的天翻地覆。根据最新的报道表明,2013年码农是最高薪的职业。为了成为码农中的码农,你必须了解并且准备好2013年的技术趋势。

让我等码农一起来围观10大码农必看的软件开发技能和趋势。

1.掌握移动技术

智能移动电话的使用日渐普及,而且使用的人数已经在2012年超过PC桌面。因为使用移动设备的用户越来越多,使得响应式的Web设计成为了趋势。开发者应该能开发支持多种设备同时访问的网站,包括智能电话——iOS、Android、WindowsPhone和黑莓等。作为一个开发者,你不能忽略大量的移动用户,因此你必须学习响应式网站开发和移动UI工具包。

2.敏捷方法论

开发者应该意识到敏捷开发的重要性。敏捷大致就是一系列能够帮助你日常项目管理的规则,不同于一般的项目管理规则,敏捷开发是在慢慢地影响着开发者的工作和交流方式。你必须认识到瀑布模型已经将近过时了。如果你希望能够获得更好的软件质量,敏捷开发是一种可选的开发方式,使用敏捷开发你可以很容易的在你的软件中实现任何需求更改

3.单元测试

作为一名开发者,如果你不是在进行单元测试,你就是在去进行单元测试的路上。单元测试已经不再只是开发者们的一门用来提高自身资历的选修课而是一门必须的技能。谈到单元测试,你可以找到大量的工具和框架供你使用。赶快去学它(如果你还不会的话)因为他在接下来的一年中会对你非常有用。

4.云计算

云计算已经成为企业日常运作不可或缺的一部分。计算让业务流程变得更见容易,让客户更加便捷。这个在2013年是一个高需求的行业。

5.HTML5

HTML5是最受欢迎的工具,而且不断的在发展。在HTML5全面繁荣之前,你应该准备开始HTML5的知识储备。如果你想成为下一代应用的开发者,必须学习HTML5。移动设备也完全支持HTML5,因此你在学习HTML5的同时也是在学习移动开发。

6.Python或者Ruby

PHP经过漫长的发展已经成为佼佼者,不过好消息是Python和Ruby已经在开发行业找到了自己的方式。Ruby+Rails和Python+Django都是非常牛逼的Web开发框架。Python和Ruby虽然不能完美的满足各种各样的项目,但是他们可以作为一个额外技能。此外,他们可以在很多其他项目中提供一些帮助。因此,确保你可以花点时间去学习这些技能。

7.CSS3

HTML5和CSS3越来越流行,使用HTML5和CSS3你可以开发语义连贯的网站。CSS3有很多很棒的特性,例如可下载的自定义字体(font-face)、RGBA色彩、色彩梯度、多背景、透明、变换等等。

8、响应式页面设计

由于移动设备对互联网的的使用日益增长,响应式web设计正在成为最重要的设计技巧之一,每个开发者都应当对它有所了解。你应能设计出响应式的页面来匹配不同的分辨率,当然还有不同的屏幕尺寸。作为一个开发者,你需要有能力设计出适用于任何任何浏览器及设备的网站。

9.Java Script和jQuery

对于台式机或者平板电脑来说,javaScript变得越来越重要,尤其是在Windows8发布以后。随着HTML5和Javascript的结合,你可以在web开发中做的更好。除了JavaScript,JQuery是一项必须熟知的技能如果你的工作中使用到了HTML5。当然你也可以找到一些好的能实现同等效果的其他技术,但是到目前为止,JQuery是最好的。你应该掌握多种而非单一的编程语言。

10.基于位置的计算

目前,绝大多数的移动设备都集成了GPS,这也是为什么foursquare和facebookcheck-in这样的应用会火。也就是说人们喜欢基于位置的应用。所以多学习一些基于地理位置的编程,它将是2013年的流行元素。

posted @ 2012-12-27 15:09 一梦浮生2012 阅读(2) 评论(0)  编辑

ios应用程序语言本地化

转自http://chenjohney.iteye.com/blog/1303723                       

具体实现如下:

静态本地化 : 加载的文件,如xib文件,图像文件,还有实现应用程序名本地化

动态本地化: 显示的字符串本地化

一。先做准备:设置程序本地化

在xcode点击程序图标:点击Info选项->Localizationn,点击“+”,选择要添加的语言,简体中文选择Chinese(zh-Hans)

你会在你工程目录下发现多了个文件夹,“zh-Hans.lproj",x-code使用.lproj作为其本地化文件夹的扩展名。


 

二。设置xib文件本地化, 图像本地化的方法是一样道理的,可以根据用户的显示语言加载不同的xib文件

操作:点击xib文件,在IB窗口中选择选项选择“File Inspecter",也就是第一个选项,选择“Localization->"+"选择添加的语言,

效果如下,原来的xib文件就会出现三角形,其下有两个文件,因为我的为storyboard,但效果是一样的。就可以实现将其本地化了,非常简单吧

 


 

三。设置应用程序名本地化,

      设置应用程序名存储在应用程序的Info.plist文件中,我们例子实际上为Localize-Info.plist,选择文件,并不需要对文件进行本地化,而是使"Info.strings"本地化就可以了,在Localize.Info.plist,空白处右键,选择Show Raw Keys/Values,就会看到应用程序名实际为CFBundleDisplayName,我们只需要在对应的 Info.plist中添加以下代码就可以了

英文版:

C代码   收藏代码
  1. CFBundleDisplayName = "Localization";  

 中文版:

C代码   收藏代码
  1. CFBundleDisplayName = "本地化";  



 效果图:


四、加载的字符串本地化,

      原理:在代码中将加入的字符串加入NSLocalizeString宏中,启动程序时,系统将根据语言加载相应的文件得到其对应的字符串文件,这个字符串可以通过系统将NSLocalizedString中的宏生成名为“Localizable.strings”的文件,当然你可以自己去创建这个文件,然后手动是添加对应的字符串。,

C代码   收藏代码
  1. labelName.text = NSLocalizedString(@"Name", @"The name is ");  
  2. labelPassword.text  = NSLocalizedString(@"Password:",@"The password is");  

 NSlocalizeString 第一个参数是内容,第二个参数将会转化为字符串文件里的注释。

转化方法如下 :先关闭项目,打开终端,进入到项目的目录,输入genStrings 文件名.m就可以将该文件中的宏转化为相应的字符串文件,

 


效果如下:会看到生成"Localizable.strings",

打开文件,就可以交给翻译人员去翻译了


最后附上例子,http://dl.iteye.com/topics/download/df3a4497-5785-3852-a876-c07033f3f980

 

posted @ 2012-12-27 15:02 一梦浮生2012 阅读(0) 评论(0)  编辑

UIProgressView进度条的详细使用

转自http://www.cnblogs.com/aipingguodeli/archive/2012/04/27/2473422.html

#import "ActivityViewController.h"

@interface ActivityViewController : UIViewController

{

    UIProgressView *proView;  

    double proValue;

    NSTimer *timer;

}

@property(nonatomic, retain)  UIProgressView *proView;

-(IBAction)btnStartClick;

 

#import "ActivityViewController.m"

 

@implementation ActivityViewController

@synthesize proView;

 #pragma mark - View lifecycle

-(IBAction)btnStartClick

{

    proValue=0;

     timer = [NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(changeProgress)userInfo:nilrepeats:YES]; //利用计时器,每隔1秒调用一次(changeProgress)

}

-(void)changeProgress

{

    proValue += 1.0; //改变proValue的值

    if(proValue > 5)

    {

        //停用计时器

        [timer invalidate];        

    }

    else

    {

        [proViewsetProgress:(proValue / 5)];//重置进度条

    }

}

- (void)viewDidLoad

{

    [super viewDidLoad];

    proView = [[UIProgressViewalloc] initWithFrame:CGRectMake(100, 100, 150, 20)];

    [proViewsetProgressViewStyle:UIProgressViewStyleDefault]; //设置进度条类型

    [self.view addSubview:proView];

}

 

posted @ 2012-12-27 14:56 一梦浮生2012 阅读(4) 评论(0)  编辑

UIWebView实现离线浏览

转自

http://www.keakon.net/2011/08/14/%E4%B8%BAUIWebView%E5%AE%9E%E7%8E%B0%E7%A6%BB%E7%BA%BF%E6%B5%8F%E8%A7%88

智能手机的流行让移动运营商们大赚了一笔,然而消费者们却不得不面对可怕的数据流量账单。因为在线看部电影可能要上千块通讯费,比起电影院什么的简直太坑爹了。

所 以为了减少流量开销,离线浏览也就成了很关键的功能,而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离线浏览,也就体现不出这种方法的意义了,于是只好拿百度来垫背。

#import <UIKit/UIKit.h>

@interface WebViewController : UIViewController <UIWebViewDelegate> {
    UIWebView *web;
    UILabel *label;
}

@property (nonatomic, retain) UIWebView *web;
@property (nonatomic, retain) UILabel *label;

- (IBAction)click;

@end


#import "WebViewController.h"
#import "URLCache.h"

@implementation WebViewController

@synthesize web, label;

- (IBAction)click {
    if (web) {
        [web removeFromSuperview];
        self.web = nil;
    } else {
        CGRect frame = {{0, 0}, {320, 380}};
        UIWebView *webview = [[UIWebView alloc] initWithFrame:frame];
        webview.scalesPageToFit = YES;
        self.web = webview;
        
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com/"]];
        [webview loadRequest:request];
        [self.view addSubview:webview];
        [webview release];
    }
}

- (void)addButton {
    CGRect frame = {{130, 400}, {60, 30}};
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = frame;
    [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
    [button setTitle:@"我点" forState:UIControlStateNormal];	
    [self.view addSubview:button];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    URLCache *sharedCache = [[URLCache alloc] initWithMemoryCapacity:1024 * 1024 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    
    CGRect frame = {{60, 200}, {200, 30}};
    UILabel *textLabel = [[UILabel alloc] initWithFrame:frame];
    textLabel.textAlignment = UITextAlignmentCenter;
    [self.view addSubview:textLabel];
    self.label = textLabel;
    
    if (![sharedCache.responsesInfo count]) { // not cached
        textLabel.text = @"缓存中…";
        
        CGRect frame = {{0, 0}, {320, 380}};
        UIWebView *webview = [[UIWebView alloc] initWithFrame:frame];
        webview.delegate = self;
        self.web = webview;
        
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com/"]];
        [webview loadRequest:request];
        [webview release];
    } else {
        textLabel.text = @"已从硬盘读取缓存";
        [self addButton];
    }
    
    [sharedCache release];
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    self.web = nil;
    label.text = @"请接通网络再运行本应用";
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    self.web = nil;
    label.text = @"缓存完毕";
    [self addButton];
    
    URLCache *sharedCache = (URLCache *)[NSURLCache sharedURLCache];
    [sharedCache saveInfo];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
    if (!web) {
        URLCache *sharedCache = (URLCache *)[NSURLCache sharedURLCache];
        [sharedCache removeAllCachedResponses];
    }
}

- (void)viewDidUnload {
    self.web = nil;
    self.label = nil;
}


- (void)dealloc {
    [super dealloc];
    [web release];
    [label release];
}

@end

大部分的代码没什么要说的,随便挑2点。
实现了UIWebViewDelegate,因为需要知道缓存完毕或下载失败这个事件。
另外,正如前面所说的,UIWebView可能不会通知释放缓存。所以在收到内存警告时,如果UIWebView对象已被释放,那么就可以安全地清空缓存了(或许还要考虑多线程的影响)。

接下来就是重点了:实现URLCache类。
它需要2个属性:一个是用于保存NSCachedURLResponse的cachedResponses,另一个是用于保存响应信息的responsesInfo(包括MIME类型和文件名)。
另外还需要实现一个saveInfo方法,用于将responsesInfo保存到磁盘。不过大多数应用应该使用数据库来保存,这里我只是为了简化而已。

#import <Foundation/Foundation.h>


@interface URLCache : NSURLCache {
    NSMutableDictionary *cachedResponses;
    NSMutableDictionary *responsesInfo;
}

@property (nonatomic, retain) NSMutableDictionary *cachedResponses;
@property (nonatomic, retain) NSMutableDictionary *responsesInfo;

- (void)saveInfo;

@end


#import "URLCache.h"


@implementation URLCache

@synthesize cachedResponses, responsesInfo;

- (void)removeCachedResponseForRequest:(NSURLRequest *)request {
    NSLog(@"removeCachedResponseForRequest:%@", request.URL.absoluteString);
    [cachedResponses removeObjectForKey:request.URL.absoluteString];
    [super removeCachedResponseForRequest:request];
}

- (void)removeAllCachedResponses {
    NSLog(@"removeAllObjects");
    [cachedResponses removeAllObjects];
    [super removeAllCachedResponses];
}

- (void)dealloc {
    [cachedResponses release];
    [responsesInfo release];
}

@end


写完这些没技术含量的代码后,就来实现saveInfo方法吧。
这 里有一个要点需要说下,iTunes会备份所有的应用资料,除非放在Library/Caches或tmp文件夹下。由于缓存并不是什么很重要的用户资 料,没必要增加用户的备份时间和空间,所以我们应该把缓存放到这2个文件夹里。而后者会在退出应用或重启系统时清空,这显然不是我们想要的效果,于是最佳 选择是前者。

static NSString *cacheDirectory;

+ (void)initialize {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    cacheDirectory = [[paths objectAtIndex:0] retain];
}

- (void)saveInfo {
    if ([responsesInfo count]) {
        NSString *path = [cacheDirectory stringByAppendingString:@"responsesInfo.plist"];
        [responsesInfo writeToFile:path atomically: YES];
    }	
}

这里我用了stringByAppendingString:方法,更保险的是使用stringByAppendingPathComponent:。不过我估计后者会做更多的检查工作,所以采用了前者。

在实现saveInfo后,初始化方法就也可以实现了。它主要就是载入保存的plist文件,如果不存在则新建一个空的NSMutableDictionary对象。

- (id)initWithMemoryCapacity:(NSUInteger)memoryCapacity diskCapacity:(NSUInteger)diskCapacity diskPath:(NSString *)path {
    if (self = [super initWithMemoryCapacity:memoryCapacity diskCapacity:diskCapacity diskPath:path]) {
        cachedResponses = [[NSMutableDictionary alloc] init];
        NSString *path = [cacheDirectory stringByAppendingString:@"responsesInfo.plist"];
        NSFileManager *fileManager = [[NSFileManager alloc] init];
        if ([fileManager fileExistsAtPath:path]) {
            responsesInfo = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
        } else {
            responsesInfo = [[NSMutableDictionary alloc] init];
        }
        [fileManager release];
    }
    return self;
}


接下来就可以实现cachedResponseForRequest:方法了。
我们得先判断是不是GET方法,因为其他方法不应该被缓存。还得判断是不是网络请求,例如http、https和ftp,因为连data协议等本地请求都会跑到这个方法里来…

static NSSet *supportSchemes;

+ (void)initialize {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    cacheDirectory = [[paths objectAtIndex:0] retain];
    supportSchemes = [[NSSet setWithObjects:@"http", @"https", @"ftp", nil] retain];
}

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
    if ([request.HTTPMethod compare:@"GET"] != NSOrderedSame) {
        return [super cachedResponseForRequest:request];
    }

    NSURL *url = request.URL;
    if (![supportSchemes containsObject:url.scheme]) {
        return [super cachedResponseForRequest:request];
    }
    //...
}

因为没必要处理它们,所以直接交给父类的处理方法了,它会自行决定是否返回nil的。

接着判断是不是已经在cachedResponses里了,这样的话直接拿出来即可:

NSString *absoluteString = url.absoluteString;
NSLog(@"%@", absoluteString);
NSCachedURLResponse *cachedResponse = [cachedResponses objectForKey:absoluteString];
if (cachedResponse) {
    NSLog(@"cached: %@", absoluteString);
    return cachedResponse;
}


再查查responsesInfo里有没有,如果有的话,说明可以从磁盘获取:

NSDictionary *responseInfo = [responsesInfo objectForKey:absoluteString];
if (responseInfo) {
    NSString *path = [cacheDirectory stringByAppendingString:[responseInfo objectForKey:@"filename"]];
    NSFileManager *fileManager = [[NSFileManager alloc] init];
    if ([fileManager fileExistsAtPath:path]) {
        [fileManager release];
        
        NSData *data = [NSData dataWithContentsOfFile:path];
        NSURLResponse *response = [[NSURLResponse alloc] initWithURL:request.URL MIMEType:[responseInfo objectForKey:@"MIMEType"] expectedContentLength:data.length textEncodingName:nil];
        cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data];
        [response release];
        
        [cachedResponses setObject:cachedResponse forKey:absoluteString];
        [cachedResponse release];
        NSLog(@"cached: %@", absoluteString);
        return cachedResponse;
    }
    [fileManager release];
}

这里的难点在于构造NSURLResponse和NSCachedURLResponse,不过对照下文档看看也就清楚了。如前文所说,我们还得把cachedResponse保存到cachedResponses里,避免它被提前释放。

接下来就说明缓存不存在了,需要我们自己发起一个请求。可恨的是NSURLResponse不能更改属性,所以还需要手动新建一个NSMutableURLRequest对象:

NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:request.timeoutInterval];
newRequest.allHTTPHeaderFields = request.allHTTPHeaderFields;
newRequest.HTTPShouldHandleCookies = request.HTTPShouldHandleCookies;

实际上NSMutableURLRequest还有一些其他的属性,不过并不太重要,所以我就只复制了这2个。

然后就可以用它来发起请求了。由于UIWebView就是在子线程调用cachedResponseForRequest:的,不用担心阻塞的问题,所以无需使用异步请求:

NSError *error = nil;
NSURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:newRequest returningResponse:&response error:&error];
if (error) {
    NSLog(@"%@", error);
    NSLog(@"not cached: %@", absoluteString);
    return nil;
}


如果下载没出错的话,我们就能拿到data和response了,于是就能将其保存到磁盘了。保存的文件名必须是合法且独一无二的,所以我就用到了sha1算法

NSString *filename = sha1([absoluteString UTF8String]);
NSString *path = [cacheDirectory stringByAppendingString:filename];
NSFileManager *fileManager = [[NSFileManager alloc] init];
[fileManager createFileAtPath:path contents:data attributes:nil];
[fileManager release];


接下来还得将文件信息保存到responsesInfo,并构造一个NSCachedURLResponse。
然而这里还有个陷阱,因为直接使用response对象会无效。我稍微研究了一下,发现它其实是个NSHTTPURLResponse对象,可能是它的allHeaderFields属性影响了缓存策略,导致不能重用。
不过这难不倒我们,直接像前面那样构造一个NSURLResponse对象就行了,这样就没有allHeaderFields属性了:

NSURLResponse *newResponse = [[NSURLResponse alloc] initWithURL:response.URL MIMEType:response.MIMEType expectedContentLength:data.length textEncodingName:nil];
responseInfo = [NSDictionary dictionaryWithObjectsAndKeys:filename, @"filename", newResponse.MIMEType, @"MIMEType", nil];
[responsesInfo setObject:responseInfo forKey:absoluteString];
NSLog(@"saved: %@", absoluteString);

cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:newResponse data:data];
[newResponse release];
[cachedResponses setObject:cachedResponse forKey:absoluteString];
[cachedResponse release];
return cachedResponse;


OK,现在终于大功告成了,打开WIFI然后启动这个程序,过一会就会提示缓存完毕了。然后关掉WIFI,尝试打开网页,你会发现网页能正常载入了。
而查看log,也能发现这确实是从我们的缓存中取出来的。
还不放心的话可以退出程序,这样内存缓存肯定就释放了。然后再次进入并打开网页,你会发现一切仍然正常~    

posted @ 2012-12-26 15:13 一梦浮生2012 阅读(2) 评论(0)  编辑

说一些产品以外的东西

转自http://www.cocoachina.com/appstore/exp/2012/1225/5407.html

关于代理

我记得top4fun的吉哥在微博上说过,移动游戏不需要代理,还举了麒麟狗的收入做例子。但是我觉得,那是因为吉哥已经做到了那种程度了,有人来财力去做推广。对于独立开发者,或者小团队,我始终觉得,不管国外和国内,找个代理,总比自己折腾的好,原因我觉得至少有两个:

1.国外市场,文化差异,语言差异,玩家习惯其实都很不一样,理解当地情况的代理能够更好把握,譬如以前在西山居做SNS游戏的时候,找了一个台湾的代理,他们反映过来台湾人的SNS游戏习惯跟我们想象的就不一样,譬如我们国内SNS游戏的活跃高峰都在中午12点和晚上8点半~但是台湾的时间就要晚一些。

2.小团队应该更发挥自己做产品灵活性的优势,把主要精力放在产品上面。

至于代理商怎么找google一下就好了,有个小tips,代理商基本都要先看你的Demo,然后我发现好几个国外的代理商都有用testflight的习惯,如果可以,可以先准备一下。

BTW:我们也找过代理,接触过不少国内国外的代理商,国内比较倾向于收费点集中的网游,国外比较倾向于有创新意味的作品,很少提到收费点。

然后提一个:CC做单机代理业务的MM态度很好,网络代理那个就差点了。。^_^

关于外包

美术:美术外包,个人认为可以尝试,但是外包前自己必须很清楚需求和风格。

程序:我觉得游戏的程序全靠外包真的不适合,除非你的游戏做出来就不改,或者是用分成的方式,程序愿意改。我经历过被程序卖代码后,真心不敢碰了!

音乐:我们的游戏全部是论坛里面的一些朋友推荐的外包公司做的,音尚月,很靠谱,关键是愿意改!

策划:说真的,我还真试过去猪八戒上面花钱买创意。当头脑风暴是可以的,但是外包设计案,那就SB了。另外就是:想到了点子,要做,一定要够快,特别你的点子不是完全原创的,我们有个产品做到一半的时候<小小星球>上推荐了,一模一样的微创新。最后只能撤掉了!既生瑜,何生亮啊,更何况,我们只是几个臭屁匠。

关于盗版平台

我觉得真可以一试,虽然这里一定会有大牛很鄙视我这个看法;那天自从我看了这个消息我就不能蛋定了。“黑马大赛冠军:在91平台月收入超100W”

有两个原因让我觉得一试:

1.91平台的用户和App Store的用户是不同的用户群,至少在付费用户上不是。所以对于开发厂商来说不会有太多的伤害。

2.91平台相对来说门槛较低,对于大学生群体,用来练手,其实算是个不凑的尝试(特别是对没有条件支付一堆苹果设备和各种授权费用的朋友)。

3.如果害怕像企鹅在91上产品导致苹果封开发者ID的话。大可以把91作为一个用户测试平台,用来做产品迭代也是有好处的。

不好的影响目测有两种

1.对于游戏的品牌影响不好?

2.也许你做91平台习惯,忘了真正的平台是App Store了。(我以前做过一款游戏,把人人网作为测试平台,本来想在测试平台测好就放到facebook平台。但是忽略了不少东西)主要可能会是:盗版平台的用户群和正版平台的用户群在用户习惯和消费习惯上有很大的区别。在者可能你会陷在盗版平台的测试,在不断的修改中,迷失方向,丢失信心。

关于团队

我接触到的小团队,大部分团队都是不完整的,当然,个人觉得创业没有必要等团队完备了才开搞,但是创业,一定要团队有同意的理念,有同样的工作态度!不是说,不怕神一样的对手,就怕猪一样的队友么?心里想不到一块,团队没有形成默契前,几个人聚在一起根本就是减分怎样才能形成默契,个人感觉,遭遇差不多的,有个相似经历的,对于事物的看法都差不多。至少有两种人,个人觉得不靠谱:

1.创业极不适合和那些给自己留着退路的人,想过安逸日子的人(通常这种人,刚开始会看到美好的前景就一时冲动跟你开干了,但是一遇到挫折,也是先打退堂鼓的,最重要的,他们不会跟你拼命!)

2.自己在联想打工的时候,那里的大BOSS一直很强调做员工要有“Sense”,说白了,是一种意识,不是那种砖牛角尖的,不是那种踢一脚动一下的,那种“画公仔画出肠”的人,他们就算创业还是会用打工者的心态去对待,会分清楚,这个是你的事,那个是我的事,而不会把产品当成自己的。

再说创业

记得出来时,有个兄弟说“创业后悔3年,不创业后悔一辈子”,嗯,说真的,这一年多,很苦逼,看到很多后来人超过自己,也会看到很多人在倒下,认识的在死亡线上挣扎的小团队不在小数,从做SNS游戏折腾到现在,三年多,极少能睡个安稳的觉~当然累趴下变死猪的除外,还需要去面对各种质疑和各种来自自己或者别人有意无意的打击,连健康都得陪进去。真的像个输红了眼的赌徒,因为已经付出了足够多,不坚持,就什么都没有了。虽说可以从头再来,但对奔三的人。还有多少次重来的机会呢......算了!有句话说得好:从创业的第一天起,你每天要面对的是困难和失败,而不是成功。我最困难的时候还没有到,但有一天一定会到。”挑战者们,坚定自己坚持的,努力吧!

 

posted @ 2012-12-26 10:04 一梦浮生2012 阅读(2) 评论(0)  编辑

Distimo报道更少的应用带走了更多收入

转自http://www.cocoachina.com/gamedev/misc/2012/1225/5406.html

热门应用整合

应用开发者会发现很难保证其应用在任何一个国家的应用商店都会成功。Distimo发现在2012年11月AppStore中七成应用合计只获得10%的收入,比起2012年1月,这个收入百分比明显降低。在iPad上,仅仅最高的6款应用占据了10%的收入,但在GooglePlay则更是4款应用就占据了10%的收入。

在苹果推出其自身免费的iOS地图服务之前(可能是之后),iPad上平均每人花在导航应用上的钱是11.54美元,在iPhone上则是7.25美元,这是各应用类别中单个应用收入最高的。在iPad上,商业和效率类应用的收入情况紧随其后,在iPhone上也是同样的情况,然后新闻和旅游应用类的收入是最低的。

 

然而,总体而言,无论在GooglePlay还是AppStore,游戏才是明确的赢家,占据三分之一的下载量,以及更高比例的收入。排名第二的类别是小工具类,下载量的比例仅为8%。

俄罗斯很喜欢平板电脑,日本相反

Distimo为各个国家使用平板电脑的不同情况提供了新的见解。首先是一种老生常谈的观点,认为日本人更喜欢小巧精细的东西,因此日本人最不喜欢平板电脑。最喜欢平板电脑的国家是俄罗斯,其iOS下载中有46%是在iPad上,其次是荷兰和芬兰,分别达38%和35%。日本是最不平板的国家,因为只有7%的iOS下载是iPad应用。

 

Distimo发现,相比iPad,美国人购买的应用中大约24%是iPhone应用。

如何开发赚钱的应用

Distimo的报告建议:作为一个移动应用开发者来说,一夜暴富的机会是微乎其微的,其比较实用的做法是开发iPhone上的游戏或者效率类应用。

还有另一个值得考虑的事情,DrawSomething一夜成名,其下载量在50天内达到5000万次,但其坠落的速度亦几乎相当。现在其每个月的下载量只有2百万左右。而LinePop的GooglePlay页面上亦显示几乎相同的下降趋势。应用的红火是短暂的,用户总是在追逐着下一个热门的产品。

 

 

posted @ 2012-12-25 15:25 一梦浮生2012 阅读(1) 评论(0)  编辑

Camera360SDK

Camera360SDK申请地址

http://sdk.camera360.com/

 Camera360SDK是基于Camera360第三代图像处理引擎,集相机拍照、图像处理和API特效Demo于一体的软件开发工具包。免费为开发者提供了从拍照、图像处理到自定义特效的一站式服务,无需手写一行代码,直接集成SDK,大大减轻了移动应用开发者的工作。接入Camera360SDK,让移动应用轻松拥有炫酷拍照、特效功能。最令人印象深刻的是,品果科技还提供1对1的技术人员对接培训,帮助开发者解决各种SDK植入的技术问题。

Camera360,中文名“相机360”它是一款风靡全球的手机拍照应用。其简单的操作、丰富迷人的照片特效、流畅的用户体验已经赢得了全球超过6000万用户的青睐。其开发团队品果科技在Camera360成功之后,又相继开发了秀色360、HelloCamera、Movie360等衍生应用。此后,移动应用+云计算开始当道,品果又进一步的推出了云相册服务。近日,从品果科技获悉,品果又推出了“Camera360SDK”将手机相机拍照的强大能力开放出来。

Camera360SDK功能解析:相机拍照

当开发者的应用使用相机拍照时,会直接调用SDK整体集成的相机功能。目前相机拍照支持拍照和照片编辑功能。其中包含实时特效滤镜、闪光灯、边框、前后镜头切换、照片更换滤镜特效等模块。用户在完成实时滤镜取景拍照后,会自动进入照片编辑界面,可以对滤镜特效和边框进行再次更换。当照片美化完成后,会返回到SDK调用前应用的页面。

由于实时滤镜特效对手机性能要求较高,以iPhone4为标准,对每个实时滤镜特效进行了帧数的统计,建议选择帧数大于等于15以上的滤镜,否则可能会引起卡顿的现象。需要注意的是,滤镜特效和边框是一一对应的关系,即更换滤镜特效,边框随即改变。


Camera360SDK功能解析:图像处理

SDK支持的图像来源有许多渠道,不仅支持普通照片,还支持其它格式的图片,如JPG,JPEG,BMP,BMPf,GIF,PNG,ICO,CUR,XBM,TIFF,TIF等。当开发者应用需要对图像进行美化编辑的时候,调用该功能,SDK将读取图像数据并显示图像,用户选择滤镜特效或边框完成美化后会自动返回调用前应用的页面,从而完成对该图像的特效处理。

图像处理模块中的边框与滤镜特效也是一一对应的关系。但是与相机拍照不同的是,图像处理中滤镜特效对手机性能是没有要求的。

Camera360SDK功能解析:API特效Demo

这个API功能主要面向高级合作伙伴开放,将为开发者提供可以自定义滤镜特效的功能。当开发者通过效果列表选择特效后,如果对该特效不满意,还可以通过修改或增加某些参数来生成该系列的新特效。增强应用中图像特效的个性和趣味性。同时,预设的产品界面开发者也可以选择性使用,或者自己定制。

申请Camera360SDK流程

目前Camera360SDK开发者接入资格采用人工审核验证,开发者在填写申请资料后,会进入审核流程。品果会有专人对开发者资格进行审核和验证,所以开发者在填写资料的时要真实有效,以便确认身份。资格审核通过后,开发者需要选择合作模式。合作确定签署协议,在六个工作日内,开发者就能收到品果的开发资料。包括:SDK开发文档、效果参数说明文档、SDK介绍文档以及SDK开发包。同时,也有1对1的技术支持,解决使用SDK时遇到的问题。

 转自

http://www.csdn.net/article/2012-12-21/2813064-Camera360-SDK

 

posted @ 2012-12-25 15:00 一梦浮生2012 阅读(1) 评论(0)  编辑

m3u8文件内容剖析

转自http://blog.csdn.net/afeng0007/article/details/6765105

m3u8 笔记:

 m3u8格式用来流播放,直播流或者点播形式,目的是实现时实性及保密性它会不让你获取它的视频所在地址,所以你做视频软件的

时候就不能实现下载的功能。

其实大部分我们做视频推荐类的应用时候,使用的视频都是从优酷及土豆上获取的,其实它们提供了开放的API,可以获取视频地址

以及视频的多个标签,视频的同类视频推荐,视频同类目下的视频等,开发者可以去申请。

优酷视频开放平台:

http://open.youku.com/

土豆视频开放平台:

http://api.tudou.com/apps/main.php

在IOS device和mac上可以用http的方式进行分发,其中playlist标准为由m3u扩展而来的m3u8文件,媒体文件为MPEG2-TS或者AAC文件(audio only)。

m3u8文件有两种应用场景

multi bitrate adaptive streaming

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000

http://example.com/low.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000

http://example.com/mid.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000

http://example.com/hi.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5"

http://example.com/audio-only.m3u8

sbr bitrate adaptive streaming

#EXTM3U

#EXT-X-TARGETDURATION:5220

#EXTINF:5220,

http://media.example.com/entire.ts

#EXT-X-ENDLIST

 

rfc doc:

http://tools.ietf.org/html/draft-pantos-http-live-streaming-06

m3u8 文件是m3u文件的扩展。在该rfc中定义了扩展的关键字:
其中:

#EXT-X-TARGETDURATION
定义每个TS的最大的duration。
#EXT-X-MEDIA-SEQUENCE
定义当前m3u8文件中第一个文件的序列号,每个ts文件在m3u8文件中都有固定唯一的序列号,该序列号用于在MBR时切换码率进行对齐。

#EXT-X-KEY

定义加密方式和key文件的url,用于取得16bytes的key文件解码ts文件。

属性:
METHOD
URL
#EXT-X-PROGRAM-DATE-TIME

第一个文件的绝对时间

#EXT-X-ALLOW-CACHE

是否允许cache。
#EXT-X-ENDLIST
表明m3u8文件的结束。live m3u8没有该tag。
#EXT-X-STREAM-INF
属性:
BANDWIDTH
PROGRAM-ID
CODECS
#EXT-X-DISCONTINUITY
当遇到该tag的时候说明以下属性发生了变化:
file format 
number and type of tracks
encoding parameters
encoding sequence

timestamp sequence

#EXT-X-VERSION

 

posted @ 2012-12-25 14:51 一梦浮生2012 阅读(16) 评论(0)  编辑

iPad、iPhone 界面设计标准

1.

http://www.uisheji.com/146648.html

 

2.

1.支持iPhone的app图标要求。

app图标必须要求直角效果的(图标的圆角效果是系统自动加上的)。

光晕效果可以自己设计,可以选择使用系统自动加载,也可以选择不使用光晕效果。

 

尺寸

文件名

用途

是否必须

备注

512×512

iTunesArtwork

Ad Hoc iTunes

可选,但建议加入

文件应该是PNG格式

57×57

Icon.png

iPhone/iPod touch的App Store和主屏幕(Home screen)

必须

114×114

Icon@2x.png

高分辨率的iPhone 4,4s,5主屏幕

可选,但建议加入

72×72

Icon-72.png

主屏幕,为了兼容iPad

可选,但建议加入

29×29

Icon-Small.png

Spotlight和设置app

可选,但建议加入

50×50

Icon-Small-50.png

Spotlight,为了兼容iPad

如果app有设置程序包,那么建议加入。否则可选,但建议加入。

58×58

Icon-Small@2x.png

高分辨率的iPhone 4的Spotlight和设置app

如果app有设置程序包,那么建议加入。否则可选,但建议加入。

 

2.

启动画面的尺寸

类型尺寸  文件名

iphone3gs   320 x 480    Default.png

iphone4,4s640 x 960Default@2x.png

iphone5640 x 1136         Default-568h@2x.png

 

 

 

设备情况:

设备分辨率 宽高

 

iPhone5        640*1136  高度 568  宽度320

 

iphone4,4s   640*960    高度 480  宽度320

 

iphone3gs    320*480    高度 480  宽度320

 

newipad       1536*2048      高度1024 宽度768

 

ipad2        768*1024           高度1024 宽度768


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1. 开始 . 4 1.1.1.1. 基本设置 基本设置 . 4 建立你的 建立你的 SwiftSwift 环境 . 5 理解 SwiftSwift 导入过程 导入过程 . 6 2. 互用性 互用性 . 7 2.1. 2.1. 与 Objective ObjectiveObjective Objective Objective-C API 交互 7 初始化 (Initialization)(Initialization) (Initialization) (Initialization) (Initialization) (Initialization)(Initialization)(Initialization)(Initialization) (Initialization) 7 访问属性 访问属性 (Accessing Properties)(Accessing Properties) (Accessing Properties) (Accessing Properties) (Accessing Properties)(Accessing Properties) (Accessing Properties)(Accessing Properties)(Accessing Properties)(Accessing Properties) (Accessing Properties)(Accessing Properties) (Accessing Properties) . 8 方法 (Working with Methods)(Working with Methods)(Working with Methods)(Working with Methods)(Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) (Working with Methods) . 9 id 兼容性 兼容性 (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility)(id Compatibility) (id Compatibility) (id Compatibility) (id Compatibility) 10 使用 nil (Working with nilWorking with nilWorking with nilWorking with nil Working with nil Working with nil Working with nil Working with nil ) . 11 扩展( Extensions Extensions Extensions Extensions ) . 12 闭包( Closures ClosuresClosures Closures ) . 13 比较对象( 比较对象( Object Comparison Object Comparison Object Comparison Object Comparison Object ComparisonObject ComparisonObject ComparisonObject ComparisonObject Comparison) 14 SwiftSwift 类型兼容性( 类型兼容性( 类型兼容性( Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type CompatibilitySwift Type Compatibility Swift Type Compatibility Swift Type Compatibility Swift Type Compatibility) . 14 Objective Objective Objective Objective-C选择器 选择器 (Selectors)(Selectors)(Selectors) (Selectors)(Selectors)(Selectors)(Selectors) 15 2.2. 2.2. 使用 Objective Objective Objective Objective-C特性编写 特性编写 SwiftSwift 类 16 继承 Objective ObjectiveObjective Objective Objective-C的类 16 采用协议 采用协议 . 17 编写构造器 和析编写构造器 和析编写构造器 和析编写构造器 和析 . 17 集成 Interface Builder Interface BuilderInterface Builder Interface BuilderInterface Builder Interface Builder Interface Builder Interface Builder Interface Builder . 18 指明属性 特指明属性 特指明属性 特 . 19 实现 Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object Subclasses Core Data Managed Object SubclassesCore Data Managed Object Subclasses 20 2.3. Cocoa2.3. Cocoa 2.3. Cocoa 2.3. Cocoa2.3. Cocoa2.3. Cocoa数据类型 数据类型 . 20 字符串 . 21 数字 . 22 类集合 . 22 FoundationFoundationFoundation Foundation FoundationFoundation Foundation数据类型 . 24 FoundationFoundationFoundation Foundation FoundationFoundation Foundation函数 . 25 Core Foundation Core FoundationCore FoundationCore Foundation Core FoundationCore Foundation Core Foundation Core FoundationCore Foundation Core Foundation 25 2.4. 2.4. 采用 Cocoa CocoaCocoaCocoa设计模式 设计模式 . 27 委托 . 27 延迟初始化 延迟初始化 . 28 错误报告 错误报告 . 28 键值观察 键值观察 . 29 TargetTarget TargetTarget -Action Action Action模式 29 类型匹配与统一规范 类型匹配与统一规范 类型匹配与统一规范 类型匹配与统一规范 . 29 Using Swift with Cocoa and Objective-C 完整中文版(CocoaChina 精校) 3 2.5. 2.5. 与 C 语言交互编程 语言交互编程 语言交互编程 语言交互编程 30 基本数据类型 基本数据类型 基本数据类型 . 30 枚举 . 31 指针 . 32 全局常量 全局常量 . 37 预处理指令 预处理指令 . 37 3.Mix and Match3.Mix and Match 3.Mix and Match 3.Mix and Match 3.Mix and Match3.Mix and Match 3.Mix and Match3.Mix and Match . 39 3.1. 3.1. 在同一工程中使用 在同一工程中使用 在同一工程中使用 在同一工程中使用 SwiftSwift Swift 和 Objective Objective Objective Objective-C . 39 Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match Mix and Match 概述 . 39 在同一个 在同一个 App Target App Target App TargetApp TargetApp TargetApp Target 中进行代码导入 中进行代码导入 中进行代码导入 中进行代码导入 . 40 在同个 在同个 Framework Framework Framework Framework Framework Framework Framework 的 TargetTarget TargetTarget 中导入代码 中导入代码 中导入代码 . 43 将 Swift Swift Swift 导入 Objc Objc . 44 导入外部 导入外部 FramewoFramewoFramewo FramewoFramewoFramework 44 在 Objective Objective Objective Objective-C中使用 中使用 SwiftSwift Swift 45 Product ModuleProduct ModuleProduct ModuleProduct Module Product Module Product Module Product Module Product Module 模块命名 模块命名 . 47 问题解决提示 问题解决提示 问题解决提示 . 47 4. 迁移 . 48 4.1. 4.1. 将 Objective ObjectiveObjective Objective Objective-C代码迁至 代码迁至 代码迁至 SwiftSwift . 48 为你的 为你的 Objective Objective Objective Objective-C代码迁移做好准备 代码迁移做好准备 代码迁移做好准备 代码迁移做好准备 48 迁移过程 迁移过程 . 48 问题解决提示 问题解决提示 问题解决提示 . 50 Using Swift with Cocoa and Objective-C 完整中文版(CocoaChina 精校) 4 1. 开始 1.1.1.1.1.1.1.1.基本 设置 本篇译者: 本篇译者: CreolophusCreolophusCreolophusCreolophus Creolophus Creolophus (githubgithubgithub githubgithub主页 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 ),敬请勘误。 重要事项 这篇文章初步介绍了在开发中用到的 API 或技术。苹果公司提供这些信息来帮助您规划本文所说明的技术和接口以用于苹果的产品上。这些信息会改变,并且根据这篇文章所实现的软件应该在最新的操作系统并根据最新的文档测试。本文档的新版本,可能在未来通过技术和 API 的 seeds 版本来提供 Swift 被设计用来无缝兼容 Cocoa 和 Objective-C 。在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objective-C中 使用 Swift 的 API。这种兼容性使 Swift 变成了一个简单、方便并且强大的工具集成到你的 Cocoa 应用开发工作流程中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值