diff --git a/V2RayX/AdvancedWindow.xib b/V2RayX/AdvancedWindow.xib
index afcb9e9..7aa333d 100644
--- a/V2RayX/AdvancedWindow.xib
+++ b/V2RayX/AdvancedWindow.xib
@@ -62,7 +62,7 @@
-
+
@@ -217,7 +217,7 @@ Gw
-
+
@@ -292,7 +292,7 @@ Gw
-
+
@@ -439,7 +439,7 @@ Gw
-
+
@@ -693,7 +693,7 @@ Gw
-
+
@@ -1063,7 +1063,7 @@ will match all private IPs.
-
+
@@ -1131,7 +1131,7 @@ Gw
-
+
diff --git a/V2RayX/Info.plist b/V2RayX/Info.plist
index 296ba60..9ed5866 100644
--- a/V2RayX/Info.plist
+++ b/V2RayX/Info.plist
@@ -21,7 +21,7 @@
CFBundleSignature
????
CFBundleVersion
- 2
+ $(CURRENT_PROJECT_VERSION)
LSMinimumSystemVersion
$(MACOSX_DEPLOYMENT_TARGET)
LSUIElement
diff --git a/V2RayX/ServerProfile.h b/V2RayX/ServerProfile.h
index f95d003..7117d73 100644
--- a/V2RayX/ServerProfile.h
+++ b/V2RayX/ServerProfile.h
@@ -36,7 +36,8 @@ typedef enum NetWorkType : NSUInteger {
kcp,
ws,
http,
- quic
+ quic,
+ grpc
} NetWorkType;
@interface ServerProfile : NSObject
diff --git a/V2RayX/ServerProfile.m b/V2RayX/ServerProfile.m
index 444d508..7077049 100644
--- a/V2RayX/ServerProfile.m
+++ b/V2RayX/ServerProfile.m
@@ -66,6 +66,9 @@ - (ServerProfile*)init {
@"key": @"",
@"header": @{ @"type": @"none" }
},
+ @"grpcSettings": @{
+ @"multiMode": [NSNumber numberWithBool:NO],
+ },
@"sockopt": @{}
}];
[self setMuxSettings:@{
diff --git a/V2RayX/TransportWindow.xib b/V2RayX/TransportWindow.xib
index 276e427..fc1e29c 100644
--- a/V2RayX/TransportWindow.xib
+++ b/V2RayX/TransportWindow.xib
@@ -8,6 +8,8 @@
+
+
@@ -42,7 +44,7 @@
-
+
@@ -305,7 +307,7 @@
-
+
@@ -327,7 +329,7 @@
-
+
@@ -574,6 +576,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/V2RayX/TransportWindowController.h b/V2RayX/TransportWindowController.h
index 678b682..da4c296 100644
--- a/V2RayX/TransportWindowController.h
+++ b/V2RayX/TransportWindowController.h
@@ -58,6 +58,11 @@ NS_ASSUME_NONNULL_BEGIN
//tcp fast open
@property (weak) IBOutlet NSButton *tfoEnableButton;
+// grpc fields
+@property (weak) IBOutlet NSTextField *grpcServiceNameField;
+@property (weak) IBOutlet NSPopUpButton *grpcMultiMode;
+
+
@end
NS_ASSUME_NONNULL_END
diff --git a/V2RayX/TransportWindowController.m b/V2RayX/TransportWindowController.m
index c0af9ec..441f880 100644
--- a/V2RayX/TransportWindowController.m
+++ b/V2RayX/TransportWindowController.m
@@ -121,6 +121,11 @@ - (void)fillStream:(NSDictionary*)streamSettings andMuxSettings:(NSDictionary*)m
// mux
[_muxEnableButton setState:[nilCoalescing(muxSettings[@"enabled"], @NO) boolValue]];
[_muxConcurrencyField setIntegerValue:[nilCoalescing(muxSettings[@"concurrency"], @8) integerValue]];
+
+ // grpc
+ [_grpcServiceNameField setStringValue:nilCoalescing(streamSettings[@"grpcSettings"][@"serviceName"], @"")];
+ [_grpcMultiMode setState:[nilCoalescing(streamSettings[@"grpcSettings"][@"multiMode"], @NO) boolValue]];
+
// tcp fast open
NSDictionary* tfoSettings = [streamSettings objectForKey:@"sockopt"];
[_tfoEnableButton setState:[tfoSettings[@"tcpFastOpen"] boolValue]];
@@ -236,6 +241,10 @@ - (NSArray*)generateSettings {
@"allowInsecure": [NSNumber numberWithBool:[self->_tlsAiButton state]==1],
@"alpn": [[[_tlsAlpnField stringValue] stringByReplacingOccurrencesOfString:@" " withString:@""] componentsSeparatedByString:@","]
},
+ @"grpcSettings": @{
+ @"serviceName": [[_grpcServiceNameField stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]],
+ @"multiMode":[NSNumber numberWithBool:[self->_grpcMultiMode indexOfSelectedItem] != 0],
+ },
@"httpSettings": httpSettings
};
NSMutableDictionary *streamSettings = [streamSettingsImmutable mutableCopy];
diff --git a/V2RayX/dlcorex.sh b/V2RayX/dlcorex.sh
index 737e652..92b685d 100755
--- a/V2RayX/dlcorex.sh
+++ b/V2RayX/dlcorex.sh
@@ -1,4 +1,4 @@
-VERSION="1.5.5"
+VERSION="1.6.5"
RED='\033[0;31m'
GREEN='\033[0;32m'
BOLD='\033[1m'
diff --git a/V2RayX/utilities.h b/V2RayX/utilities.h
index 8cd1746..268543b 100644
--- a/V2RayX/utilities.h
+++ b/V2RayX/utilities.h
@@ -17,7 +17,7 @@
#define OBFU_LIST (@[@"none", @"srtp", @"utp", @"wechat-video", @"dtls", @"wireguard"])
#define VLESS_FLOW_LIST (@[@"", @"xtls-rprx-direct", @"xtls-rprx-direct-udp443", @"xtls-rprx-origin", @"xtls-rprx-origin-udp443", @"xtls-rprx-splice", @"xtls-rprx-splice-udp443"])
#define VMESS_SECURITY_LIST (@[@"none", @"auto", @"aes-128-gcm", @"chacha20-poly1305"])
-#define NETWORK_LIST (@[@"tcp", @"kcp", @"ws", @"http", @"quic"])
+#define NETWORK_LIST (@[@"tcp", @"kcp", @"ws", @"http", @"quic", @"grpc"])
#define QUIC_SECURITY_LIST (@[@"none", @"aes-128-gcm", @"chacha20-poly1305"])
#define TLS_SECURITY_LIST (@[@"none", @"tls", @"xtls"])
#define nilCoalescing(a,b) ( (a != nil) ? (a) : (b) ) // equivalent to ?? operator in Swift