python中时间日期格式化


Python中时间日期格式化符号:

1
%y 两位数的年份表示(00-99
2
%Y 四位数的年份表示(000-9999
3
%m 月份(01-12
4
%d 月内中的一天(0-31
5
%H 24小时制小时数(0-23
6
%I 12小时制小时数(01-12
7
%M 分钟数(00=59
8
%S 秒(00-59
9
%a 本地简化星期名称
10
%A 本地完整星期名称
11
%b 本地简化的月份名称
12
%B 本地完整的月份名称
13
%c 本地相应的日期表示和时间表示
14
%j 年内的一天(001-366
15
%p 本地A.M.或P.M.的等价符
16
%U 一年中的星期数(00-53)星期天为星期的开始
17
%w 星期(0-6),星期天为星期的开始
18
%W 一年中的星期数(00-53)星期一为星期的开始
19
%x 本地相应的日期表示
20
%X 本地相应的时间表示
21
%Z 当前时区的名称
22
%% %号本身

textView中字符串处理


1.获取textView中每行的字符串
相关代码如下:

1
- (NSArray *)getLinesArrayOfStringInLabel:(UITextView *)textView {
2
    NSString *text = [textView text];
3
    UIFont *font = [textView font];
4
    CGRect rect = [textView bounds];
5
6
    CTFontRef myFont = CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL);
7
    NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
8
    [attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)myFont range:NSMakeRange(0, attStr.length)];
9
    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attStr);
10
    CGMutablePathRef path = CGPathCreateMutable();
11
    CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000));
12
    CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
13
    NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
14
    NSMutableArray *linesArray = [[NSMutableArray alloc]init];
15
    for (id line in lines) {
16
        CTLineRef lineRef = (__bridge CTLineRef )line;
17
        CFRange lineRange = CTLineGetStringRange(lineRef);
18
        NSRange range = NSMakeRange(lineRange.location, lineRange.length);
19
        NSString *lineString = [text substringWithRange:range];
20
        [linesArray addObject:lineString];
21
    }
22
    return (NSArray *)linesArray;
23
}

2.按照2个英文字符作为一个字,一个中文汉字作为一个字的方式,计算字符串的实际长度
实现NSString的分类,在分类中添加方法代码:

1
//得到中英文字符串长度
2
- (NSInteger)convertToNumbers {
3
        NSInteger strlength = 0;
4
        char  *p = (char*)[self cStringUsingEncoding:NSUnicodeStringEncoding];
5
        for (NSInteger i = 0; i < [self lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]; i++) {
6
            if (*p) {
7
                p++;
8
                strlength++;
9
            }
10
            else {
11
                p++;
12
            }
13
        }
14
        return strlength;
15
}

字体的基本知识


字体的基本知识:
字体(Font):是一系列字号、样式和磅值相同的字符(例如:10磅黑体Palatino)。现多被视为字样的同义词
字面(Face):是所有字号的磅值和格式的综合
字体集(Font family):是一组相关字体(例如:Franklin family包括Franklin Gothic、Fran-klinHeavy和Franklin Compressed)
磅值(Weight):用于描述字体粗度。典型的磅值,从最粗到最细,有极细、细、book、中等、半粗、粗、较粗、极粗
样式(Style):字形有三种形式:Roman type是直体;oblique type是斜体;utakuc type是斜体兼曲线(比Roman type更像书法体)。
x高度(X height):指小写字母的平均高度(以x为基准)。磅值相同的两字母,x高度越大的字母看起来比x高度小的字母要大
Cap高度(Cap height):与x高度相似。指大写字母的平均高度(以C为基准)
下行字母(Descender):例如在字母q中,基线以下的字母部分叫下伸部分
上行字母(Ascender):x高度以上的部分(比如字母b)叫做上伸部分
基线(Baseline):通常在x、v、b、m下的那条线
描边(Stroke):组成字符的线或曲线。可以加粗或改变字符形状
衬线(Serif):用来使字符更可视的一条水平线。如字母左上角和下部的水平线。
无衬线(Sans Serif):可以让排字员不使用衬线装饰。
方形字(Block):这种字体的笔画使字符看起来比无衬线字更显眼,但还不到常见的衬线字的程度。例如Lubalin Graph就是方形字,这种字看起来好像是木头块刻的一样
手写体脚本(Calligraphic script):是一种仿效手写体的字体。例如Murray Hill或者Fraktur字体
艺术字(Decorative):像绘画般的字体
Pi符号(Pisymbol):非标准的字母数字字符的特殊符号。例如Wingdings和Mathematical Pi
连写(Ligature):是一系列连写字母如fi、fl、ffi或ffl。由于字些字母形状的原因经常被连写,故排字员已习惯将它们连写。

image

image

字符属性名称:

1
const CFStringRef kCTCharacterShapeAttributeName;              
2
//字体形状属性  必须是CFNumberRef对象默认为0,非0则对应相应的字符形状定义,如1表示传统字符形状
3
const CFStringRef kCTFontAttributeName;                        
4
//字体属性   必须是CTFont对象
5
const CFStringRef kCTKernAttributeName;                        
6
//字符间隔属性 必须是CFNumberRef对象
7
const CFStringRef kCTLigatureAttributeName;                 
8
//设置是否使用连字属性,设置为0,表示不使用连字属性。标准的英文连字有FI,FL.默认值为1,既是使用标准连字。也就是当搜索到f时候,会把fl当成一个文字。必须是CFNumberRef 默认为1,可取0,1,2
9
const CFStringRef kCTForegroundColorAttributeName;             
10
//字体颜色属性  必须是CGColor对象,默认为black
11
const CFStringRef kCTForegroundColorFromContextAttributeName;
12
 //上下文的字体颜色属性 必须为CFBooleanRef 默认为False,
13
const CFStringRef kCTParagraphStyleAttributeName;              
14
//段落样式属性 必须是CTParagraphStyle对象 默认为NIL
15
const CFStringRef kCTStrokeWidthAttributeName;              
16
//笔画线条宽度 必须是CFNumberRef对象,默为0.0f,标准为3.0f
17
const CFStringRef kCTStrokeColorAttributeName;              
18
//笔画的颜色属性 必须是CGColorRef 对象,默认为前景色
19
const CFStringRef kCTSuperscriptAttributeName;              
20
//设置字体的上下标属性 必须是CFNumberRef对象 默认为0,可为-1为下标,1为上标,需要字体支持才行。如排列组合的样式Cn1
21
const CFStringRef kCTUnderlineColorAttributeName;           
22
//字体下划线颜色属性 必须是CGColorRef对象,默认为前景色
23
const CFStringRef kCTUnderlineStyleAttributeName;           
24
//字体下划线样式属性 必须是CFNumberRef对象,默为kCTUnderlineStyleNone 可以通过CTUnderlineStypleModifiers 进行修改下划线风格
25
const CFStringRef kCTVerticalFormsAttributeName;
26
//文字的字形方向属性 必须是CFBooleanRef 默认为false,false表示水平方向,true表示竖直方向
27
const CFStringRef kCTGlyphInfoAttributeName;
28
//字体信息属性 必须是CTGlyphInfo对象
29
const CFStringRef kCTRunDelegateAttributeName
30
//CTRun 委托属性 必须是CTRunDelegate对象

钥匙串访问权限


ios 钥匙串的开发使用,这里使用的是SAMKeychain第三方库,详细使用参照SAMKeychain

####这里主要说的是钥匙串间的共享问题

1.首先新建一个项目SAMKeychainOne,并在项目中保存钥匙串信息

1
[SAMKeychain setPassword:@"zyn.geekzyn" forService:@"com.geekzyn" account:@"password"];
2
3
NSString *password = [SAMKeychain passwordForService:@"com.geekzyn" account:@"password" ];
4
5
self.label.text = password;

进行如下图的设置

截图.jpeg

然后新建项目2 SAMKeychainTwo,获取项目1中的保存的信息

1
NSString *password = [SAMKeychain passwordForService:@"com.geekzyn" account:@"password" ];
2
3
self.label.text = password;

并进行截图相同的配置 即可取到消息了,

必须要保证开发者账号是同一个账号下的应用可以进行共享

gzip数据压缩解析


1.需要服务器进行配置Content-Type 为gzip
2.AFN框架客户端使用下列代码即可
``OBJC
// 1.创建请求管理对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Accept-Content"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
manager.requestSerializer.timeoutInterval = timeoutInterval;

manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"application/json;charset=utf-8", @"text/json", @"text/javascript", @"text/plain",@"text/html", nil];

[manager POST:url parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {

// NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatin1);

    NSString* strdata = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSData *data = [strdata dataUsingEncoding:NSUTF8StringEncoding];


    NSMutableString *strM = [[NSMutableString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding];

    NSData* jsonData = [strM dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];
 //   NSDictionary *dict = [NSDictionary initWithJsonString:strM.copy];

    if (success) {
        success(dict);
    }
} failure:^(NSURLSessionDataTask *task, NSError *error) {
    if (failure) {
        failure(error);
    }
}];
1
2

时间格式转换问题


NSDateFormatter 格式说明:

G: 公元时代,例如AD公元
yy:年的后2位
yyyy:完整年
MM:月,显示为1-12
MMM:月,显示为英文月份简写,如 Jan
MMMM:月,显示为英文月份全称,如 Janualy
dd:日,2位数表示,如02
d:日,1-2位显示,如2
EEE:简写星期几,如Sun
EEEE:全写星期几,如Sunday
aa:上下午,AM/PM
H:时,24小时制,0-23
K:时,12小时制,0-11
m:分,1-2位
mm:分,2位
s:秒,1-2位
ss:秒,2位
S:毫秒

hh:mm:ss

按照12小时制的格式进行字符串格式化

如果时间处于00:00:00——12:59:59,则返回的字符串正常

如果时间处于13:00:00——23:59:59,则返回的字符串是实际时间-12小时后的值,也就是说比真实的时间少了12个小时。

例如:14:00:00进行格式化后的字符串为“2:00:00”

HH:mm:ss

按照24小时制的格式进行字符串格式化

当时间为任意一个区间,则返回的字符串都是正常的。

获取iOS设备唯一标识


获取iOS设备唯一标识

在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理。我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊。
具体可以分为如下几种:

  1. UUID
  2. IDFA
  3. IDFV
  4. MAC
  5. UUID

下面我们来具体分析下每种获取方法的利弊

1. UDID

什么是UDID?
UDID 「Unique Device Identifier Description」是由子母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备,包括 iPhones, iPads, 以及 iPod touches,这些编码看起来是随机的,实际上是跟硬件设备特点相联系的。

UDID是用来干什么的?
UDID可以关联其它各种数据到相关设备上。例如,连接到开发者账号,可以允许在发布前让设备安装或测试应用;也可以让开发者获得iOS测试版进行体验。苹果用UDID连接到苹果的ID,这些设备可以自动下载和安装从App Store购买的应用、保存从iTunes购买的音乐、帮助苹果发送推送通知、即时消息。 在iOS 应用早期,UDID被第三方应用开发者和网络广告商用来收集用户数据,可以用来关联地址、记录应用使用习惯……以便推送精准广告。

为什么苹果反对开发人员使用UDID?
iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。 许多开发者把UDID跟用户的真实姓名、密码、住址、其它数据关联起来;网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据。同时大部分应用确实在频繁传输UDID和私人信息。 为了避免集体诉讼,苹果最终决定在iOS 5 的时候,将这一惯例废除,开发者被引导生成一个唯一的标识符,只能检测应用程序,其他的信息不提供。现在应用试图获取UDID已被禁止且不允许上架。

所以这个方法作废。

2. IDFA

全名:advertisingIdentifier
直译就是广告id, 在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪 里重置此id的值,或限制此id的使用,故此id有可能会取不到值,但好在Apple默认是允许追踪的,而且一般用户都不知道有这么个设置,所以基本上用来监测推广效果,是戳戳有余了。
获取代码:

1
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
注意:由于idfa会出现取不到的情况,故绝不可以作为业务分析的主id,来识别用户。

3. IDFV

全名:identifierForVendor
顾名思义,是给Vendor标识用户用的,每个设备在所属同一个Vender的应用里,都有相同的值。其中的Vender是指应用提供商,但准确点说,是通过BundleID的反转的前两部分进行匹配,如果相同就是同一个Vender,例如对于com.taobao.app1, com.taobao.app2 这两个BundleID来说,就属于同一个Vender,共享同一个idfv的值。和idfa不同的是,idfv的值是一定能取到的,所以非常适合于作为内部用户行为分析的主id,来标识用户,替代OpenUDID。
获取代码:

1
NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
注意:如果用户将属于此Vender的所有App卸载,则idfv的值会被重置,即再重装此Vender的App,
idfv的值和之前不同。

4. MAC地址

使用WiFi的mac地址来取代已经废弃了的uniqueIdentifier方法。具体可见:http://stackoverflow.com/questions/677530/how-can-i-programmatically-get-the-mac-address-of-an-iphone

然而在iOS 7中苹果再一次无情的封杀mac地址,使用之前的方法获取到的mac地址全部都变成了02:00:00:00:00:00。

5. UUID

我们可以获取到UUID,然后把UUID保存到KeyChain里面。

这样以后即使APP删了再装回来,也可以从KeyChain中读取回来。使用group还可以可以保证同一个开发商的所有程序针对同一台设备能够获取到相同的不变的UDID。
但是刷机或重装系统后uuid还是会改变。

使用Keychain,将UUID当做密码信息来存储.
流程如下:

  1. 通过AdSupport获取UUID

    1
    -(NSString *)appleIFA {
    2
      NSString *ifa = nil;
    3
        Class ASIdentifierManagerClass = NSClassFromString(@"ASIdentifierManager");
    4
        if (ASIdentifierManagerClass) { // a dynamic way of checking if AdSupport.framework is available
    5
            SEL sharedManagerSelector = NSSelectorFromString(@"sharedManager");
    6
            id sharedManager = ((id (*)(id, SEL))[ASIdentifierManagerClass methodForSelector:sharedManagerSelector])(ASIdentifierManagerClass, sharedManagerSelector);
    7
            SEL advertisingIdentifierSelector = NSSelectorFromString(@"advertisingIdentifier");
    8
            NSUUID *advertisingIdentifier = ((NSUUID* (*)(id, SEL))[sharedManager methodForSelector:advertisingIdentifierSelector])(sharedManager, advertisingIdentifierSelector);
    9
            ifa = [advertisingIdentifier UUIDString];
    10
        }
    11
        return ifa;
    12
    }
  2. 如果不支持AdSupport,那就使用IFV/IDFV (Identifier for Vendor)

    1
    + (NSString *)appleIFV {
    2
        if(NSClassFromString(@"UIDevice") && [UIDevice instancesRespondToSelector:@selector(identifierForVendor)]) {
    3
            // only available in iOS >= 6.0
    4
            return [[UIDevice currentDevice].identifierForVendor UUIDString];
    5
        }
    6
        return nil;
    7
    }
  3. 如果以上的都不支持,使用CFUUIDRef手动创建UUID

    1
    + (NSString *)randomUUID {
    2
        if(NSClassFromString(@"NSUUID")) { // only available in iOS >= 6.0
    3
            return [[NSUUID UUID] UUIDString];
    4
        }
    5
        CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
    6
        CFStringRef cfuuid = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
    7
        CFRelease(uuidRef);
    8
        NSString *uuid = [((__bridge NSString *) cfuuid) copy];
    9
        CFRelease(cfuuid);
    10
        return uuid;
    11
    }

NSDateFormatter格式


a: AM/PM (上午/下午)
A: 086399999 (一天的第A微秒)
c/cc: 1
7 (一周的第一天, 周天为1)
ccc: Sun/Mon/Tue/Wed/Thu/Fri/Sat (星期几简写)
cccc: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday (星期几全拼)
d: 131 (月份的第几天, 带0)
D: 1
366 (年份的第几天,带0)
e: 17 (一周的第几天, 带0)
E
EEE: Sun/Mon/Tue/Wed/Thu/Fri/Sat (星期几简写)
EEEE: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday (星期几全拼)
F: 15 (每月的第几周, 一周的第一天为周一)
g: Julian Day Number (number of days since 4713 BC January 1) 未知
G
GGG: BC/AD (Era Designator Abbreviated) 未知
GGGG: Before Christ/Anno Domini 未知
h: 112 (0 padded Hour (12hr)) 带0的时, 12小时制
H: 0
23 (0 padded Hour (24hr)) 带0的时, 24小时制
k: 124 (0 padded Hour (24hr) 带0的时, 24小时制
K: 0
11 (0 padded Hour (12hr)) 带0的时, 12小时制
L/LL: 112 (0 padded Month) 第几月
LLL: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec 月份简写
LLLL: January/February/March/April/May/June/July/August/September/October/November/December 月份全称
m: 0
59 (0 padded Minute) 分钟
M/MM: 112 (0 padded Month) 第几月
MMM: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
MMMM: January/February/March/April/May/June/July/August/September/October/November/December
q/qq: 1
4 (0 padded Quarter) 第几季度
qqq: Q1/Q2/Q3/Q4 季度简写
qqqq: 1st quarter/2nd quarter/3rd quarter/4th quarter 季度全拼
Q/QQ: 14 (0 padded Quarter) 同小写
QQQ: Q1/Q2/Q3/Q4 同小写
QQQQ: 1st quarter/2nd quarter/3rd quarter/4th quarter 同小写
s: 0
59 (0 padded Second) 秒数
S: (rounded Sub-Second) 未知
u: (0 padded Year) 未知
vvvv: (General GMT Timezone Abbreviation) 常规GMT时区的编写
vvvv: (General GMT Timezone Name) 常规GMT时区的名称
w: 1
53 (0 padded Week of Year, 1st day of week = Sunday, NB: 1st week of year starts from the last Sunday of last year) 一年的第几周, 一周的开始为周日,第一周从去年的最后一个周日起算
W: 15 (0 padded Week of Month, 1st day of week = Sunday) 一个月的第几周
y/yyyy: (Full Year) 完整的年份
yy/yyy: (2 Digits Year) 2个数字的年份
Y/YYYY: (Full Year, starting from the Sunday of the 1st week of year) 这个年份未知干嘛用的
YY/YYY: (2 Digits Year, starting from the Sunday of the 1st week of year) 这个年份未知干嘛用的
z
zzz: (Specific GMT Timezone Abbreviation) 指定GMT时区的编写
zzzz: (Specific GMT Timezone Name) Z: +0000 (RFC 822 Timezone) 指定GMT时区的名称

OC中的initialize和load


Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

它们的相同点在于:方法只会被调用一次。(其实这是相对runtime来说的,后边会做进一步解释)。

文档也明确阐述了方法调用的顺序:父类(Superclass)的方法优先于子类(Subclass)的方法,类中的方法优先于类别(Category)中的方法。

下面是官方给出的说明

+(void)initialize

The runtime sendsinitializeto each class in a program exactly one time just before the class, or any class that inherits from it, is sent its first message from within the program. (Thus the method may never be invoked if the class is not used.) The runtime sends the initialize message to classes in a thread-safe manner.Superclasses receive this message before their subclasses.

+(void)load

Theloadmessage is sent to classes and categories that are both dynamically loaded and statically linked, but only if the newly loaded class or category implements a method that can respond.

The order of initialization is as follows:

All initializers in any framework you link to.

All+loadmethods in your image.

All C++ static initializers and C/C++attribute(constructor)functions in your image.

All initializers in frameworks that link to you.

In addition:

A class’s+loadmethod is called after all of its superclasses’+loadmethods.

A category+loadmethod is called after the class’s own+loadmethod.

In a custom implementation ofloadyou can therefore safely message other unrelated classes from the same image, but anyloadmethods implemented by those classes may not have run yet.

OAuth2.0和SSO授权


#####一、OAuth2.0授权协议
  一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该访问令牌访问资源服务器的资源。由于用户的账号密码并不与本APP直接交互,而是与官方服务器交互,因而它是安全的。
授权图示
授权过程

流程:
1、获取未授权的Request Token。
url:request token url。
  param:appKey/appSecret,签名方法/签名(如HMAC-SHA1),timeStamp(时间戳:距1970/0/0/0/0/0的秒数),nonce(随机生成的string,防止重复请求)
  response:Oauth_Token/Auth_Secret

2、获取用户授权的Request Token。
  url:user authorizition url。
  param:Oauth_Token(上个步骤返回的令牌),callback_url(授权成功后返回的地址)
  response:Oauth_Token(被用户授权或否决的令牌)

3、用已授权的Request Token换取AccessToken。
  url:access token url。
  param:appKey,Oauth_Token(上个步骤返回的令牌),签名,TimeStamp,nonce
  response:Access_Token/Secret

参考新浪微博:http://open.weibo.com/wiki/授权机制说明

#####二、SSO授权技术

  全称:Single Sign On,用户只需登陆一次即可访问相互信任的子系统。用户访问系统1时,登陆成功后会返回一个ticket,当用户访问系统2时,会把ticket带上,待验证合法后即可访问系统2。听起来跟cookie有点像,没错,Web-SSO便有基于cookie的实现方案。
  以新浪微博为例,很多手机APP在点击新浪授权时,会跳到新浪客户端的登陆页面,这里就用到SSO技术啦。在本APP授权新浪微博时,会先检测手机是否安装了新浪微博客户端。
  [[UIApplicationsharedApplication] openURL:xxx]可以打开另一个APP。这里sinaweibosso://login为客户端的url并传递三个参数,AppKey,RedirectURI,ssoCallbackScheme。
  ssoCallbackScheme是返回的App Url地址,即自己定义的sinaweibosso.appKey。
  登陆成功后,客户端会直接把AccessToken返回给本App,就完成了一次授权。  

参考新浪微博:http://open.weibo.com/wiki/移动应用SSO授权

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×