diff --git a/CHANGELOG.md b/CHANGELOG.md
index f2e3e35935808bce1511ef1ba48fb0d4b743cc45..6afc27ab495b0f1997abd91d66219672a1a521e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
 # IPtProxy Changelog
 
+## 1.8.1
+- Added `Obfs4proxyLogFile` which returns the static log file name of Obfs4proxy.
+
+## 1.8.0
+- Updated Obfs4proxy to latest version 0.0.14.
+- Updated Snowflake to latest version 2.3.1.
+- Added support for macOS 11.
+- Fixed warning in Xcode 14.
+
 ## 1.7.1
 - Fixed Snowflake Proxy support.
 
diff --git a/IPtProxy-sources.jar b/IPtProxy-sources.jar
index 7b86497135e18d4b69280959ba858a5f4d6c6b19..4965f85137a12f5db578e346fdd0e6a49a78c8bb 100644
Binary files a/IPtProxy-sources.jar and b/IPtProxy-sources.jar differ
diff --git a/IPtProxy.aar b/IPtProxy.aar
index 0b1a777b1ed672e0ffd6a6a400ed7dc00f101e01..499e140280cbee4fd54c151beefacb6f9688a678 100644
Binary files a/IPtProxy.aar and b/IPtProxy.aar differ
diff --git a/IPtProxy.go/IPtProxy.go b/IPtProxy.go/IPtProxy.go
index c2b9b2f5b1a5511ebf5a5f80fa839b40fb0c41c5..9fea4f39684cab80ab59fc3e0ee644be96e03fc5 100644
--- a/IPtProxy.go/IPtProxy.go
+++ b/IPtProxy.go/IPtProxy.go
@@ -9,10 +9,11 @@ import (
 	"log"
 	"net"
 	"os"
+	"path/filepath"
 	"runtime"
+	"runtime/debug"
 	"strconv"
 	"time"
-	"runtime/debug"
 )
 
 var meekPort = 47000
@@ -89,37 +90,46 @@ func init() {
 		StateLocation = os.Getenv("TMPDIR")
 	}
 
-	StateLocation += "/pt_state"
+	StateLocation = filepath.Join(StateLocation, "pt_state")
 }
 
 // Obfs4ProxyVersion - The version of Obfs4Proxy bundled with IPtProxy.
 //
 //goland:noinspection GoUnusedExportedFunction
 func Obfs4ProxyVersion() string {
-    return obfs4proxy.Obfs4proxyVersion
+	return obfs4proxy.Obfs4proxyVersion
 }
 
-// SnowflakeVersion  - The version of Snowflake bundled with IPtProxy.
+// SnowflakeVersion - The version of Snowflake bundled with IPtProxy.
 //
 //goland:noinspection GoUnusedExportedFunction
 func SnowflakeVersion() string {
-    bi, ok := debug.ReadBuildInfo()
-    if !ok {
-        log.Printf("Failed to read build info")
-        return ""
-    }
-
-    for _, dep := range bi.Deps {
-    	if dep.Path == "git.torproject.org/pluggable-transports/snowflake.git/v2" {
-    	    if dep.Version[0:1] == "v" {
-        		return dep.Version[1:len(dep.Version)]
-    	    } else {
-    	        return dep.Version
-    	    }
-    	}
-    }
-
-    return ""
+	bi, ok := debug.ReadBuildInfo()
+	if !ok {
+		log.Printf("Failed to read build info")
+		return ""
+	}
+
+	for _, dep := range bi.Deps {
+		if dep.Path == "git.torproject.org/pluggable-transports/snowflake.git/v2" {
+			if dep.Version[0:1] == "v" {
+				return dep.Version[1:len(dep.Version)]
+			} else {
+				return dep.Version
+			}
+		}
+	}
+
+	return ""
+}
+
+// Obfs4proxyLogFile - The log file name used by Obfs4proxy.
+//
+// The Obfs4proxy log file can be found at `filepath.Join(StateLocation, Obfs4proxyLogFile())`.
+//
+//goland:noinspection GoUnusedExportedFunction
+func Obfs4proxyLogFile() string {
+	return obfs4proxy.Obfs4proxyLogFile
 }
 
 // StartObfs4Proxy - Start the Obfs4Proxy.
@@ -136,6 +146,7 @@ func SnowflakeVersion() string {
 // @param proxy HTTP, SOCKS4 or SOCKS5 proxy to be used behind Obfs4proxy. E.g. "socks5://127.0.0.1:12345"
 //
 // @return Port number where Obfs4Proxy will listen on for Obfs4(!), if no error happens during start up.
+//
 //	If you need the other ports, check MeekPort, Obfs2Port, Obfs3Port and ScramblesuitPort properties!
 //
 //goland:noinspection GoUnusedExportedFunction
@@ -217,7 +228,8 @@ func StopObfs4Proxy() {
 // @param front Front domain.
 //
 // @param ampCache OPTIONAL. URL of AMP cache to use as a proxy for signaling.
-//        Only needed when you want to do the rendezvous over AMP instead of a domain fronted server.
+//
+//	Only needed when you want to do the rendezvous over AMP instead of a domain fronted server.
 //
 // @param logFile Name of log file. OPTIONAL. Defaults to no log.
 //
@@ -289,8 +301,9 @@ type SnowflakeClientConnected interface {
 // @param unsafeLogging Prevent logs from being scrubbed.
 //
 // @param clientConnected A delegate which is called when a client successfully connected.
-//       Will be called on its own thread! You will need to switch to your own UI thread,
-//       if you want to do UI stuff!! OPTIONAL
+//
+//	Will be called on its own thread! You will need to switch to your own UI thread,
+//	if you want to do UI stuff!! OPTIONAL
 //
 //goland:noinspection GoUnusedExportedFunction
 func StartSnowflakeProxy(capacity int, broker, relay, stun, natProbe, logFile string, keepLocalAddresses, unsafeLogging bool, clientConnected SnowflakeClientConnected) {
@@ -302,16 +315,16 @@ func StartSnowflakeProxy(capacity int, broker, relay, stun, natProbe, logFile st
 		capacity = 0
 	}
 
-	snowflakeProxy = &sfp.SnowflakeProxy {
-		Capacity:           uint(capacity),
-		STUNURL:            stun,
-		BrokerURL:          broker,
-		KeepLocalAddresses: keepLocalAddresses,
-		RelayURL:           relay,
-		NATProbeURL:        natProbe,
-		ProxyType:          "iptproxy",
+	snowflakeProxy = &sfp.SnowflakeProxy{
+		Capacity:               uint(capacity),
+		STUNURL:                stun,
+		BrokerURL:              broker,
+		KeepLocalAddresses:     keepLocalAddresses,
+		RelayURL:               relay,
+		NATProbeURL:            natProbe,
+		ProxyType:              "iptproxy",
 		RelayDomainNamePattern: "snowflake.torproject.net$",
-		AllowNonTLSRelay: false,
+		AllowNonTLSRelay:       false,
 		ClientConnectedCallback: func() {
 			if clientConnected != nil {
 				clientConnected.Connected()
@@ -326,7 +339,7 @@ func StartSnowflakeProxy(capacity int, broker, relay, stun, natProbe, logFile st
 		log.SetFlags(log.LstdFlags | log.LUTC)
 
 		if logFile != "" {
-			f, err := os.OpenFile(logFile, os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0600)
+			f, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
 			if err != nil {
 				log.Fatal(err)
 			}
@@ -352,6 +365,7 @@ func StartSnowflakeProxy(capacity int, broker, relay, stun, natProbe, logFile st
 func IsSnowflakeProxyRunning() bool {
 	return snowflakeProxy != nil
 }
+
 // StopSnowflakeProxy - Stop the Snowflake proxy.
 //
 //goland:noinspection GoUnusedExportedFunction
@@ -364,7 +378,7 @@ func StopSnowflakeProxy() {
 		snowflakeProxy.Stop()
 	}(snowflakeProxy)
 
-    snowflakeProxy = nil
+	snowflakeProxy = nil
 }
 
 // IsPortAvailable - Checks to see if a given port is not in use.
@@ -373,7 +387,7 @@ func StopSnowflakeProxy() {
 func IsPortAvailable(port int) bool {
 	address := net.JoinHostPort("127.0.0.1", strconv.Itoa(port))
 
-	conn, err := net.DialTimeout("tcp", address, 500 * time.Millisecond)
+	conn, err := net.DialTimeout("tcp", address, 500*time.Millisecond)
 
 	if err != nil {
 		return true
diff --git a/IPtProxy.podspec b/IPtProxy.podspec
index 2a0af9dca9abbd86f70bb163dda0260eeee1872a..fca84d2bfd71aa4a3df7c5c05d647deb5d6bc39a 100644
--- a/IPtProxy.podspec
+++ b/IPtProxy.podspec
@@ -8,7 +8,7 @@
 
 Pod::Spec.new do |s|
   s.name             = 'IPtProxy'
-  s.version          = '1.7.1'
+  s.version          = '1.8.1'
   s.summary          = 'Obfs4proxy and Snowflake Pluggable Transports for iOS and macOS'
 
   s.description      = <<-DESC
@@ -37,8 +37,8 @@ Pod::Spec.new do |s|
 
     | Transport  | Version |
     |------------|--------:|
-    | Obfs4proxy |  0.0.13 |
-    | Snowflake  |   2.3.0 |
+    | Obfs4proxy |  0.0.14 |
+    | Snowflake  |   2.3.1 |
 
                        DESC
 
@@ -49,7 +49,7 @@ Pod::Spec.new do |s|
   s.social_media_url = 'https://twitter.com/tladesignz'
 
   s.ios.deployment_target = '11.0'
-  s.osx.deployment_target = '12'
+  s.osx.deployment_target = '11'
 
   s.preserve_paths = 'build.sh', '*.patch', 'IPtProxy.go/*'
 
@@ -62,6 +62,7 @@ Pod::Spec.new do |s|
     :name => 'Go build of IPtProxy.xcframework',
     :execution_position => :before_compile,
     :script => 'sh "$PODS_TARGET_SRCROOT/build.sh"',
+    :output_files => ['$(DERIVED_FILE_DIR)/IPtProxy.xcframework'],
   }
 
   # This will only work, if `prepare_command` was successful, or if you
diff --git a/IPtProxy.xcframework/Info.plist b/IPtProxy.xcframework/Info.plist
index ba015a463cc599e571604feb65d01905df4d8219..12a4244c73b1e7f905caca0b6eeac40ed4ca104c 100644
--- a/IPtProxy.xcframework/Info.plist
+++ b/IPtProxy.xcframework/Info.plist
@@ -19,30 +19,30 @@
 		</dict>
 		<dict>
 			<key>LibraryIdentifier</key>
-			<string>ios-arm64_x86_64-simulator</string>
+			<string>ios-arm64</string>
 			<key>LibraryPath</key>
 			<string>IPtProxy.framework</string>
 			<key>SupportedArchitectures</key>
 			<array>
 				<string>arm64</string>
-				<string>x86_64</string>
 			</array>
 			<key>SupportedPlatform</key>
 			<string>ios</string>
-			<key>SupportedPlatformVariant</key>
-			<string>simulator</string>
 		</dict>
 		<dict>
 			<key>LibraryIdentifier</key>
-			<string>ios-arm64</string>
+			<string>ios-arm64_x86_64-simulator</string>
 			<key>LibraryPath</key>
 			<string>IPtProxy.framework</string>
 			<key>SupportedArchitectures</key>
 			<array>
 				<string>arm64</string>
+				<string>x86_64</string>
 			</array>
 			<key>SupportedPlatform</key>
 			<string>ios</string>
+			<key>SupportedPlatformVariant</key>
+			<string>simulator</string>
 		</dict>
 	</array>
 	<key>CFBundlePackageType</key>
diff --git a/IPtProxy.xcframework/ios-arm64/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h b/IPtProxy.xcframework/ios-arm64/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
index 09324fabf4e99595e8897ffff628e5618629eaa7..6868b197003cdba2bf15825a849ea03264ad62de 100644
--- a/IPtProxy.xcframework/ios-arm64/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
+++ b/IPtProxy.xcframework/ios-arm64/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
@@ -71,6 +71,13 @@ FOUNDATION_EXPORT long IPtProxyObfs4Port(void);
  */
 FOUNDATION_EXPORT NSString* _Nonnull IPtProxyObfs4ProxyVersion(void);
 
+/**
+ * Obfs4proxyLogFile - The log file name used by Obfs4proxy.
+
+The Obfs4proxy log file can be found at `filepath.Join(StateLocation, Obfs4proxyLogFile())`.
+ */
+FOUNDATION_EXPORT NSString* _Nonnull IPtProxyObfs4proxyLogFile(void);
+
 /**
  * ScramblesuitPort - Port where Obfs4proxy will provide its Scramblesuit service.
 Only use this property after calling StartObfs4Proxy! It might have changed after that!
@@ -84,7 +91,7 @@ Only use this property after calling StartSnowflake! It might have changed after
 FOUNDATION_EXPORT long IPtProxySnowflakePort(void);
 
 /**
- * SnowflakeVersion  - The version of Snowflake bundled with IPtProxy.
+ * SnowflakeVersion - The version of Snowflake bundled with IPtProxy.
  */
 FOUNDATION_EXPORT NSString* _Nonnull IPtProxySnowflakeVersion(void);
 
@@ -103,6 +110,7 @@ Only use the port properties after calling this, they might have been changed!
 @param proxy HTTP, SOCKS4 or SOCKS5 proxy to be used behind Obfs4proxy. E.g. "socks5://127.0.0.1:12345"
 
 @return Port number where Obfs4Proxy will listen on for Obfs4(!), if no error happens during start up.
+
 	If you need the other ports, check MeekPort, Obfs2Port, Obfs3Port and ScramblesuitPort properties!
  */
 FOUNDATION_EXPORT long IPtProxyStartObfs4Proxy(NSString* _Nullable logLevel, BOOL enableLogging, BOOL unsafeLogging, NSString* _Nullable proxy);
@@ -117,7 +125,8 @@ FOUNDATION_EXPORT long IPtProxyStartObfs4Proxy(NSString* _Nullable logLevel, BOO
 @param front Front domain.
 
 @param ampCache OPTIONAL. URL of AMP cache to use as a proxy for signaling.
-       Only needed when you want to do the rendezvous over AMP instead of a domain fronted server.
+
+	Only needed when you want to do the rendezvous over AMP instead of a domain fronted server.
 
 @param logFile Name of log file. OPTIONAL. Defaults to no log.
 
@@ -153,8 +162,9 @@ FOUNDATION_EXPORT long IPtProxyStartSnowflake(NSString* _Nullable ice, NSString*
 @param unsafeLogging Prevent logs from being scrubbed.
 
 @param clientConnected A delegate which is called when a client successfully connected.
-      Will be called on its own thread! You will need to switch to your own UI thread,
-      if you want to do UI stuff!! OPTIONAL
+
+	Will be called on its own thread! You will need to switch to your own UI thread,
+	if you want to do UI stuff!! OPTIONAL
  */
 FOUNDATION_EXPORT void IPtProxyStartSnowflakeProxy(long capacity, NSString* _Nullable broker, NSString* _Nullable relay, NSString* _Nullable stun, NSString* _Nullable natProbe, NSString* _Nullable logFile, BOOL keepLocalAddresses, BOOL unsafeLogging, id<IPtProxySnowflakeClientConnected> _Nullable clientConnected);
 
diff --git a/IPtProxy.xcframework/ios-arm64/IPtProxy.framework/Versions/A/IPtProxy b/IPtProxy.xcframework/ios-arm64/IPtProxy.framework/Versions/A/IPtProxy
index b3bbffe0aca39dc79c395501aa6d99b07daf7764..ab6d1f3c4bd58c97be09d5c1da3be007ed41a008 100644
Binary files a/IPtProxy.xcframework/ios-arm64/IPtProxy.framework/Versions/A/IPtProxy and b/IPtProxy.xcframework/ios-arm64/IPtProxy.framework/Versions/A/IPtProxy differ
diff --git a/IPtProxy.xcframework/ios-arm64_x86_64-simulator/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h b/IPtProxy.xcframework/ios-arm64_x86_64-simulator/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
index 09324fabf4e99595e8897ffff628e5618629eaa7..6868b197003cdba2bf15825a849ea03264ad62de 100644
--- a/IPtProxy.xcframework/ios-arm64_x86_64-simulator/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
+++ b/IPtProxy.xcframework/ios-arm64_x86_64-simulator/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
@@ -71,6 +71,13 @@ FOUNDATION_EXPORT long IPtProxyObfs4Port(void);
  */
 FOUNDATION_EXPORT NSString* _Nonnull IPtProxyObfs4ProxyVersion(void);
 
+/**
+ * Obfs4proxyLogFile - The log file name used by Obfs4proxy.
+
+The Obfs4proxy log file can be found at `filepath.Join(StateLocation, Obfs4proxyLogFile())`.
+ */
+FOUNDATION_EXPORT NSString* _Nonnull IPtProxyObfs4proxyLogFile(void);
+
 /**
  * ScramblesuitPort - Port where Obfs4proxy will provide its Scramblesuit service.
 Only use this property after calling StartObfs4Proxy! It might have changed after that!
@@ -84,7 +91,7 @@ Only use this property after calling StartSnowflake! It might have changed after
 FOUNDATION_EXPORT long IPtProxySnowflakePort(void);
 
 /**
- * SnowflakeVersion  - The version of Snowflake bundled with IPtProxy.
+ * SnowflakeVersion - The version of Snowflake bundled with IPtProxy.
  */
 FOUNDATION_EXPORT NSString* _Nonnull IPtProxySnowflakeVersion(void);
 
@@ -103,6 +110,7 @@ Only use the port properties after calling this, they might have been changed!
 @param proxy HTTP, SOCKS4 or SOCKS5 proxy to be used behind Obfs4proxy. E.g. "socks5://127.0.0.1:12345"
 
 @return Port number where Obfs4Proxy will listen on for Obfs4(!), if no error happens during start up.
+
 	If you need the other ports, check MeekPort, Obfs2Port, Obfs3Port and ScramblesuitPort properties!
  */
 FOUNDATION_EXPORT long IPtProxyStartObfs4Proxy(NSString* _Nullable logLevel, BOOL enableLogging, BOOL unsafeLogging, NSString* _Nullable proxy);
@@ -117,7 +125,8 @@ FOUNDATION_EXPORT long IPtProxyStartObfs4Proxy(NSString* _Nullable logLevel, BOO
 @param front Front domain.
 
 @param ampCache OPTIONAL. URL of AMP cache to use as a proxy for signaling.
-       Only needed when you want to do the rendezvous over AMP instead of a domain fronted server.
+
+	Only needed when you want to do the rendezvous over AMP instead of a domain fronted server.
 
 @param logFile Name of log file. OPTIONAL. Defaults to no log.
 
@@ -153,8 +162,9 @@ FOUNDATION_EXPORT long IPtProxyStartSnowflake(NSString* _Nullable ice, NSString*
 @param unsafeLogging Prevent logs from being scrubbed.
 
 @param clientConnected A delegate which is called when a client successfully connected.
-      Will be called on its own thread! You will need to switch to your own UI thread,
-      if you want to do UI stuff!! OPTIONAL
+
+	Will be called on its own thread! You will need to switch to your own UI thread,
+	if you want to do UI stuff!! OPTIONAL
  */
 FOUNDATION_EXPORT void IPtProxyStartSnowflakeProxy(long capacity, NSString* _Nullable broker, NSString* _Nullable relay, NSString* _Nullable stun, NSString* _Nullable natProbe, NSString* _Nullable logFile, BOOL keepLocalAddresses, BOOL unsafeLogging, id<IPtProxySnowflakeClientConnected> _Nullable clientConnected);
 
diff --git a/IPtProxy.xcframework/ios-arm64_x86_64-simulator/IPtProxy.framework/Versions/A/IPtProxy b/IPtProxy.xcframework/ios-arm64_x86_64-simulator/IPtProxy.framework/Versions/A/IPtProxy
index 5a625f67d1514273850a5201a3ce62453bf66ee7..d375bfaa43f28be1273e217f7582ac1e6b69002a 100644
Binary files a/IPtProxy.xcframework/ios-arm64_x86_64-simulator/IPtProxy.framework/Versions/A/IPtProxy and b/IPtProxy.xcframework/ios-arm64_x86_64-simulator/IPtProxy.framework/Versions/A/IPtProxy differ
diff --git a/IPtProxy.xcframework/macos-arm64_x86_64/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h b/IPtProxy.xcframework/macos-arm64_x86_64/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
index 09324fabf4e99595e8897ffff628e5618629eaa7..6868b197003cdba2bf15825a849ea03264ad62de 100644
--- a/IPtProxy.xcframework/macos-arm64_x86_64/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
+++ b/IPtProxy.xcframework/macos-arm64_x86_64/IPtProxy.framework/Versions/A/Headers/IPtProxy.objc.h
@@ -71,6 +71,13 @@ FOUNDATION_EXPORT long IPtProxyObfs4Port(void);
  */
 FOUNDATION_EXPORT NSString* _Nonnull IPtProxyObfs4ProxyVersion(void);
 
+/**
+ * Obfs4proxyLogFile - The log file name used by Obfs4proxy.
+
+The Obfs4proxy log file can be found at `filepath.Join(StateLocation, Obfs4proxyLogFile())`.
+ */
+FOUNDATION_EXPORT NSString* _Nonnull IPtProxyObfs4proxyLogFile(void);
+
 /**
  * ScramblesuitPort - Port where Obfs4proxy will provide its Scramblesuit service.
 Only use this property after calling StartObfs4Proxy! It might have changed after that!
@@ -84,7 +91,7 @@ Only use this property after calling StartSnowflake! It might have changed after
 FOUNDATION_EXPORT long IPtProxySnowflakePort(void);
 
 /**
- * SnowflakeVersion  - The version of Snowflake bundled with IPtProxy.
+ * SnowflakeVersion - The version of Snowflake bundled with IPtProxy.
  */
 FOUNDATION_EXPORT NSString* _Nonnull IPtProxySnowflakeVersion(void);
 
@@ -103,6 +110,7 @@ Only use the port properties after calling this, they might have been changed!
 @param proxy HTTP, SOCKS4 or SOCKS5 proxy to be used behind Obfs4proxy. E.g. "socks5://127.0.0.1:12345"
 
 @return Port number where Obfs4Proxy will listen on for Obfs4(!), if no error happens during start up.
+
 	If you need the other ports, check MeekPort, Obfs2Port, Obfs3Port and ScramblesuitPort properties!
  */
 FOUNDATION_EXPORT long IPtProxyStartObfs4Proxy(NSString* _Nullable logLevel, BOOL enableLogging, BOOL unsafeLogging, NSString* _Nullable proxy);
@@ -117,7 +125,8 @@ FOUNDATION_EXPORT long IPtProxyStartObfs4Proxy(NSString* _Nullable logLevel, BOO
 @param front Front domain.
 
 @param ampCache OPTIONAL. URL of AMP cache to use as a proxy for signaling.
-       Only needed when you want to do the rendezvous over AMP instead of a domain fronted server.
+
+	Only needed when you want to do the rendezvous over AMP instead of a domain fronted server.
 
 @param logFile Name of log file. OPTIONAL. Defaults to no log.
 
@@ -153,8 +162,9 @@ FOUNDATION_EXPORT long IPtProxyStartSnowflake(NSString* _Nullable ice, NSString*
 @param unsafeLogging Prevent logs from being scrubbed.
 
 @param clientConnected A delegate which is called when a client successfully connected.
-      Will be called on its own thread! You will need to switch to your own UI thread,
-      if you want to do UI stuff!! OPTIONAL
+
+	Will be called on its own thread! You will need to switch to your own UI thread,
+	if you want to do UI stuff!! OPTIONAL
  */
 FOUNDATION_EXPORT void IPtProxyStartSnowflakeProxy(long capacity, NSString* _Nullable broker, NSString* _Nullable relay, NSString* _Nullable stun, NSString* _Nullable natProbe, NSString* _Nullable logFile, BOOL keepLocalAddresses, BOOL unsafeLogging, id<IPtProxySnowflakeClientConnected> _Nullable clientConnected);
 
diff --git a/IPtProxy.xcframework/macos-arm64_x86_64/IPtProxy.framework/Versions/A/IPtProxy b/IPtProxy.xcframework/macos-arm64_x86_64/IPtProxy.framework/Versions/A/IPtProxy
index 900e6ae88238501126c60d1339d1dd206a40a747..f03392e83307dfd92c7228ce57d2739d1c4d2132 100644
Binary files a/IPtProxy.xcframework/macos-arm64_x86_64/IPtProxy.framework/Versions/A/IPtProxy and b/IPtProxy.xcframework/macos-arm64_x86_64/IPtProxy.framework/Versions/A/IPtProxy differ
diff --git a/README.md b/README.md
index dfa06b8cffe800cc266a9b8825d8f7530eadd9e4..1e67c2e557169c43930970cae348a04795b25a03 100644
--- a/README.md
+++ b/README.md
@@ -9,8 +9,8 @@ Obfs4proxy and Snowflake Pluggable Transports for iOS, MacOS and Android
 
 | Transport  | Version |
 |------------|--------:|
-| Obfs4proxy |  0.0.13 |
-| Snowflake  |   2.3.0 |
+| Obfs4proxy |  0.0.14 |
+| Snowflake  |   2.3.1 |
 
 Both Obfs4proxy and Snowflake Pluggable Transports are written in Go, which
 is a little annoying to use on iOS and Android.
@@ -44,11 +44,23 @@ IPtProxy is available through [CocoaPods](https://cocoapods.org). To install
 it, simply add the following line to your `Podfile`:
 
 ```ruby
-pod 'IPtProxy', '~> 1.7'
+pod 'IPtProxy', '~> 1.8'
 ```
 
 ### Getting Started
 
+Before using IPtProxy it is recommended to specify a place on disk for the transports 
+to store their state information and log files.
+
+By default, a temporary directory is created, but often times, that is not sufficient.
+
+```swift
+let ptDir = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.app")?
+  .appendingPathComponent("pt_state")
+
+IPtProxy.setStateLocation(ptDir?.path)
+```
+
 There's a companion library [IPtProxyUI](https://github.com/tladesignz/IPtProxyUI)
 which explains the use of IPtProxy and provides all the necessary UI and additional 
 information to use this library completely in a Tor context.
@@ -62,7 +74,7 @@ IPtProxy is available through [JitPack](https://jitpack.io). To install
 it, simply add the following line to your `build.gradle` file:
 
 ```groovy
-implementation 'com.github.tladesignz:IPtProxy:1.7.1'
+implementation 'com.github.tladesignz:IPtProxy:1.8.0'
 ```
 
 And this to your root `build.gradle` at the end of repositories:
diff --git a/build.sh b/build.sh
index e35e70552ca97b04adc2bd5d2be42efa69fca0b6..f020c4de52b4b4f0b89100e988338879c279487c 100755
--- a/build.sh
+++ b/build.sh
@@ -34,11 +34,11 @@ else
     # No .git directory - That's a normal install.
     git clone https://gitlab.com/yawning/obfs4.git
     cd obfs4 || exit 1
-    git checkout --force --quiet 77af0cba
+    git checkout --force --quiet 336a71d6
     cd ..
     git clone https://git.torproject.org/pluggable-transports/snowflake.git
     cd snowflake || exit 1
-    git checkout --force --quiet c983c13a
+    git checkout --force --quiet 36f03dfd
     cd ..
 fi
 
@@ -54,6 +54,6 @@ cd IPtProxy.go || exit 1
 
 gomobile init
 
-gomobile bind -target=$TARGET -o ../$OUTPUT -iosversion 11.0 -androidapi 19 -v
+MACOSX_DEPLOYMENT_TARGET=11.0 gomobile bind -target=$TARGET -o ../$OUTPUT -iosversion 11.0 -androidapi 19 -v
 
 printf '\n\n--- Done.\n\n'
diff --git a/jitpack.yml b/jitpack.yml
index 85b437188b835da3a8250e2fcaef03aef0ab5aac..884a19830b90b4cd71a313fa2498532043dd4229 100644
--- a/jitpack.yml
+++ b/jitpack.yml
@@ -1,3 +1,3 @@
 install:
   - FILE="-Dfile=IPtProxy.aar"
-  - mvn install:install-file $FILE -DgroupId=com.github.tladesignz -DartifactId=IPtProxy -Dversion=1.7.1 -Dpackaging=aar -DgeneratePom=true -Dsources=IPtProxy-sources.jar
+  - mvn install:install-file $FILE -DgroupId=com.github.tladesignz -DartifactId=IPtProxy -Dversion=1.8.1 -Dpackaging=aar -DgeneratePom=true -Dsources=IPtProxy-sources.jar
diff --git a/obfs4 b/obfs4
index 77af0cba934d73c4baeb709560bcfc9a9fbc661c..336a71d6e4cfd2d33e9c57797828007ad74975e9 160000
--- a/obfs4
+++ b/obfs4
@@ -1 +1 @@
-Subproject commit 77af0cba934d73c4baeb709560bcfc9a9fbc661c
+Subproject commit 336a71d6e4cfd2d33e9c57797828007ad74975e9
diff --git a/obfs4.patch b/obfs4.patch
index 1776f08c010dd12f68a8970344123160c88d28db..09ad0a43869db5120b468b989ac0b23547843c1b 100644
--- a/obfs4.patch
+++ b/obfs4.patch
@@ -1,5 +1,5 @@
 diff --git a/obfs4proxy/obfs4proxy.go b/obfs4proxy/obfs4proxy.go
-index d92f5f5..d849b80 100644
+index f295926..df9627e 100644
 --- a/obfs4proxy/obfs4proxy.go
 +++ b/obfs4proxy/obfs4proxy.go
 @@ -27,10 +27,9 @@
@@ -22,15 +22,14 @@ index d92f5f5..d849b80 100644
  	"sync"
  	"syscall"
  
-@@ -51,6 +51,7 @@ import (
- 
- const (
- 	obfs4proxyVersion = "0.0.13"
-+	Obfs4proxyVersion = obfs4proxyVersion
+@@ -53,12 +53,14 @@ const (
+ 	obfs4proxyVersion = "0.0.14"
  	obfs4proxyLogFile = "obfs4proxy.log"
  	socksAddr         = "127.0.0.1:0"
++	Obfs4proxyVersion = obfs4proxyVersion
++	Obfs4proxyLogFile = obfs4proxyLogFile
  )
-@@ -58,7 +59,7 @@ const (
+ 
  var stateDir string
  var termMon *termMonitor
  
@@ -39,7 +38,7 @@ index d92f5f5..d849b80 100644
  	ptClientInfo, err := pt.ClientSetup(transports.Transports())
  	if err != nil {
  		golog.Fatal(err)
-@@ -85,7 +86,20 @@ func clientSetup() (launched bool, listeners []net.Listener) {
+@@ -85,7 +87,20 @@ func clientSetup() (launched bool, listeners []net.Listener) {
  			continue
  		}
  
@@ -61,7 +60,7 @@ index d92f5f5..d849b80 100644
  		if err != nil {
  			_ = pt.CmethodError(name, err.Error())
  			continue
-@@ -304,22 +318,16 @@ func getVersion() string {
+@@ -304,22 +319,16 @@ func getVersion() string {
  	return fmt.Sprintf("obfs4proxy-%s", obfs4proxyVersion)
  }
  
@@ -90,7 +89,7 @@ index d92f5f5..d849b80 100644
  	if err := log.SetLogLevel(*logLevelStr); err != nil {
  		golog.Fatalf("[ERROR]: %s - failed to set log level: %s", execName, err)
  	}
-@@ -338,8 +346,7 @@ func main() {
+@@ -338,8 +347,7 @@ func main() {
  		golog.Fatalf("[ERROR]: %s - failed to initialize logging", execName)
  	}
  	if err = transports.Init(); err != nil {
@@ -100,7 +99,7 @@ index d92f5f5..d849b80 100644
  	}
  
  	log.Noticef("%s - launched", getVersion())
-@@ -347,7 +354,7 @@ func main() {
+@@ -347,7 +355,7 @@ func main() {
  	// Do the managed pluggable transport protocol configuration.
  	if isClient {
  		log.Infof("%s - initializing client transport listeners", execName)
@@ -109,7 +108,7 @@ index d92f5f5..d849b80 100644
  	} else {
  		log.Infof("%s - initializing server transport listeners", execName)
  		launched, ptListeners = serverSetup()
-@@ -379,3 +386,11 @@ func main() {
+@@ -379,3 +387,11 @@ func main() {
  	}
  	termMon.wait(true)
  }
diff --git a/pom.xml b/pom.xml
index 1184fa066de6daa5dccd6a49082d055ad7fd664c..c43448aef83ae58f7d9635d9d58dad89c19bbe29 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,5 +5,5 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.github.tladesignz</groupId>
   <artifactId>IPtProxy</artifactId>
-  <version>1.7.1</version>
+  <version>1.8.1</version>
 </project>
diff --git a/snowflake b/snowflake
index c983c13a84554d0ba1ffcdd054491090c0eafc54..36f03dfd4483922b3e7400dedc71df9cf2f30b6b 160000
--- a/snowflake
+++ b/snowflake
@@ -1 +1 @@
-Subproject commit c983c13a84554d0ba1ffcdd054491090c0eafc54
+Subproject commit 36f03dfd4483922b3e7400dedc71df9cf2f30b6b