diff --git a/ShadowsocksX-NG.xcodeproj/project.pbxproj b/ShadowsocksX-NG.xcodeproj/project.pbxproj
index d160b0b..6723139 100644
--- a/ShadowsocksX-NG.xcodeproj/project.pbxproj
+++ b/ShadowsocksX-NG.xcodeproj/project.pbxproj
@@ -825,6 +825,7 @@
"$(inherited)",
"$(SDKROOT)/usr/lib/system",
"$(PROJECT_DIR)/ShadowsocksX-NG",
+ "$(PROJECT_DIR)",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG";
@@ -851,6 +852,7 @@
"$(inherited)",
"$(SDKROOT)/usr/lib/system",
"$(PROJECT_DIR)/ShadowsocksX-NG",
+ "$(PROJECT_DIR)",
);
MACOSX_DEPLOYMENT_TARGET = 10.10;
PRODUCT_BUNDLE_IDENTIFIER = "com.qiuyuzhou.ShadowsocksX-NG";
diff --git a/ShadowsocksX-NG/Info.plist b/ShadowsocksX-NG/Info.plist
index f350173..5124f8a 100644
--- a/ShadowsocksX-NG/Info.plist
+++ b/ShadowsocksX-NG/Info.plist
@@ -17,7 +17,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 1.2
+ 1.2.R
CFBundleSignature
????
CFBundleURLTypes
@@ -34,6 +34,18 @@
ss
+
+ CFBundleTypeRole
+ Viewer
+ CFBundleURLIconFile
+ menu_icon@2x
+ CFBundleURLName
+ shadowsocks
+ CFBundleURLSchemes
+
+ ssr
+
+
CFBundleVersion
1
diff --git a/ShadowsocksX-NG/Notifications.swift b/ShadowsocksX-NG/Notifications.swift
index 69b798f..e511516 100644
--- a/ShadowsocksX-NG/Notifications.swift
+++ b/ShadowsocksX-NG/Notifications.swift
@@ -10,4 +10,5 @@ import Foundation
let NOTIFY_SERVER_PROFILES_CHANGED = "NOTIFY_SERVER_PROFILES_CHANGED"
let NOTIFY_ADV_PROXY_CONF_CHANGED = "NOTIFY_ADV_PROXY_CONF_CHANGED"
-let NOTIFY_ADV_CONF_CHANGED = "NOTIFY_ADV_CONF_CHANGED"
\ No newline at end of file
+let NOTIFY_ADV_CONF_CHANGED = "NOTIFY_ADV_CONF_CHANGED"
+let NOTIFY_INVALIDE_QR = "NOTIFY_INVALIDE_QR"
\ No newline at end of file
diff --git a/ShadowsocksX-NG/ServerProfile.swift b/ShadowsocksX-NG/ServerProfile.swift
index 2042835..1c149ab 100644
--- a/ShadowsocksX-NG/ServerProfile.swift
+++ b/ShadowsocksX-NG/ServerProfile.swift
@@ -39,24 +39,20 @@ class ServerProfile: NSObject {
profile.serverPort = (data["ServerPort"] as! NSNumber).unsignedShortValue
profile.method = data["Method"] as! String
profile.password = data["Password"] as! String
+ profile.ssrObfs = data["ssrObfs"] as! String
+ profile.ssrObfsParam = data["ssrObfsParam"] as! String
+ profile.ssrProtocol = data["ssrProtocol"] as! String
+ profile.ssrProtocolParam = data["ssrProtocolParam"] as! String
+
if let remark = data["Remark"] {
profile.remark = remark as! String
}
if let ota = data["OTA"] {
profile.ota = ota as! Bool
}
- if let ssrProtocol = data["ssrProtocol"]{
- profile.ssrProtocol = ssrProtocol as! String
- }
if let ssrProtocolParam = data["ssrProtocolParam"]{
profile.ssrProtocolParam = ssrProtocolParam as! String
}
- if let ssrObfs = data["ssrObfs"]{
- profile.ssrObfs = ssrObfs as! String
- }
- if let ssrObfsParam = data["ssrObfsParam"]{
- profile.ssrObfsParam = ssrObfsParam as! String
- }
}
if let id = data["Id"] as? String {
@@ -151,7 +147,7 @@ class ServerProfile: NSObject {
}
func URL() -> NSURL? {
- if(ssrObfs==""){
+ if(ssrObfs=="plain"){
let parts = "\(method):\(password)@\(serverHost):\(serverPort)"
let base64String = parts.dataUsingEncoding(NSUTF8StringEncoding)?
.base64EncodedStringWithOptions(NSDataBase64EncodingOptions())
diff --git a/ShadowsocksX-NG/Utils.m b/ShadowsocksX-NG/Utils.m
index d463664..468344b 100644
--- a/ShadowsocksX-NG/Utils.m
+++ b/ShadowsocksX-NG/Utils.m
@@ -53,7 +53,7 @@ void ScanQRCodeOnScreen() {
CGImageRef image = CGDisplayCreateImage(displays[displaysIndex]);
NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:image]];
for (CIQRCodeFeature *feature in features) {
- NSLog(@"%@", feature.messageString);
+// NSLog(@"%@", feature.messageString);
if ( [feature.messageString hasPrefix:@"ss://"] )
{
[foundSSUrls addObject:[NSURL URLWithString:feature.messageString]];
@@ -77,7 +77,6 @@ void ScanQRCodeOnScreen() {
// 解析SS URL,如果成功则返回一个与ServerProfile类兼容的dict
// 或SSR URL,ServerProfile类已经默认添加SSR参数,默认放空,如果URL为SSR://则改变解析方法
// ss:// + base64(method:password@domain:port)
-// ssr:// + base64(abc.xyz:12345:auth_sha1_v2:rc4-md5:tls1.2_ticket_auth:{base64(password)}/?obfsparam={base64(混淆参数(网址))}&remarks={base64(节点名称)})
NSDictionary* ParseSSURL(NSURL* url) {
if (!url.host) {
return nil;
@@ -86,7 +85,7 @@ NSDictionary* ParseSSURL(NSURL* url) {
NSString *urlString = [url absoluteString];
int i = 0;
NSString *errorReason = nil;
- if([[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:NULL ] hasPrefix:@"ss://"]){
+ if([urlString hasPrefix:@"ss://"]){
while(i < 2) {
if (i == 1) {
NSString* host = url.host;
@@ -136,8 +135,90 @@ NSDictionary* ParseSSURL(NSURL* url) {
};
}
- }else if ([[NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:NULL ] hasPrefix:@"ssr://"]){
- NSLog(@"Have One ssr QR coming");
+ }else if ([urlString hasPrefix:@"ssr://"]){
+ // ssr:// + base64(abc.xyz:12345:auth_sha1_v2:rc4-md5:tls1.2_ticket_auth:{base64(password)}/?obfsparam={base64(混淆参数(网址))}&remarks={base64(节点名称)})
+ urlString = [urlString stringByReplacingOccurrencesOfString:@"ssr://" withString:@"" options:NSAnchoredSearch range:NSMakeRange(0, urlString.length)];
+ NSData *data = [[NSData alloc] initWithBase64EncodedString:urlString options:0];
+ NSString *decodedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ urlString = decodedString;
+
+ if (data == NULL) {
+ [[NSNotificationCenter defaultCenter]
+ postNotificationName:@"NOTIFY_INVALIDE_QR"
+ object:nil
+ userInfo: @{ @"urls": @"配置二维码无效!",
+ @"source": @"qrcode"
+ }
+ ];
+ }else{
+ NSRange paramSplit = [decodedString rangeOfString:@"?"];
+ NSString *firstParam = [decodedString substringToIndex:paramSplit.location-1];
+ NSString *lastParam = [decodedString substringFromIndex:paramSplit.location];
+ lastParam = [lastParam substringFromIndex:1];
+
+ NSArray *lastParamArray = [lastParam componentsSeparatedByString:@"&"];
+ NSMutableDictionary *parserLastParamDict = [[NSMutableDictionary alloc]init];
+ for (int i=0; i