Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 26 additions & 5 deletions .pubnub.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,30 @@
---
name: objective-c
scm: github.com/pubnub/objective-c
version: "6.1.1"
version: "7.0.0"
schema: 1
changelog:
- date: 2026-03-23
version: 7.0.0
changes:
- type: bug
text: "Fix `PNRequestRetryConfiguration` `copyWithZone` not copying `excludedEndpoints`, causing all endpoint groups to become eligible for retry after `PNConfiguration` copy."
- type: bug
text: "Remove hardcoded `retriable = NO` from `PNSubscribeRequest` so transport-level retry configuration is applied to subscribe long-poll requests."
- type: bug
text: "Add `subscribeCycleGeneration` counter to `PNSubscriber` to detect and discard stale continuation calls dispatched asynchronously before a new subscribe cycle started."
- type: improvement
text: "Add `retriable = NO` to `PNFileUploadRequest` because body streams cannot be rewound after a partial send."
- type: improvement
text: "Add `request` method override with `retriable = NO` to `PNPresenceHeartbeatRequest` because presence heartbeat has its own timer-based periodic mechanism."
- type: improvement
text: "BREAKING CHANGES: Delete `PNReachability` class and remove references from `PubNub.podspec` and Framework project in favor of transport-level retry for network recovery."
- type: improvement
text: "Update export script to generate a directory umbrella modulemap instead of flat header symlinks. Configure publicHeadersPath and cSettings in Package.swift."
- type: improvement
text: "Add unit tests for `copyWithZone` preserving excluded endpoints, default configuration retrying only subscribe, and heartbeat / file upload requests not being retriable."
- type: improvement
text: "Add generation counter and retry tests Add unit tests verifying generation counter prevents stale subscribe continuations and transport-level retry works for subscribe requests using `NSURLProtocol` interception."
- date: 2025-12-15
version: 6.1.1
changes:
Expand Down Expand Up @@ -1411,7 +1432,7 @@ sdks:
- distribution-type: source
distribution-repository: GitHub release
package-name: PubNub.framework
location: https://github.com/pubnub/objective-c/archive/refs/tags/v6.1.1.zip
location: https://github.com/pubnub/objective-c/archive/refs/tags/v7.0.0.zip
supported-platforms:
supported-operating-systems:
macOS:
Expand Down Expand Up @@ -1472,7 +1493,7 @@ sdks:
- distribution-type: library
distribution-repository: GitHub release
package-name: PubNub.ios.xcframework.tar.gz
location: https://github.com/pubnub/objective-c/releases/download/v6.1.1/PubNub.ios.xcframework.tar.gz
location: https://github.com/pubnub/objective-c/releases/download/v7.0.0/PubNub.ios.xcframework.tar.gz
supported-platforms:
supported-operating-systems:
iOS:
Expand All @@ -1491,7 +1512,7 @@ sdks:
- distribution-type: library
distribution-repository: GitHub release
package-name: PubNub.macos.framework.tar.gz
location: https://github.com/pubnub/objective-c/releases/download/v6.1.1/PubNub.macos.framework.tar.gz
location: https://github.com/pubnub/objective-c/releases/download/v7.0.0/PubNub.macos.framework.tar.gz
supported-platforms:
supported-operating-systems:
macOS:
Expand All @@ -1507,7 +1528,7 @@ sdks:
- distribution-type: library
distribution-repository: GitHub release
package-name: PubNub.tvos.xcframework.tar.gz
location: https://github.com/pubnub/objective-c/releases/download/v6.1.1/PubNub.tvos.xcframework.tar.gz
location: https://github.com/pubnub/objective-c/releases/download/v7.0.0/PubNub.tvos.xcframework.tar.gz
supported-platforms:
supported-operating-systems:
tvOS:
Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
## 7.0.0
March 23 2026

#### Fixed
- Fix `PNRequestRetryConfiguration` `copyWithZone` not copying `excludedEndpoints`, causing all endpoint groups to become eligible for retry after `PNConfiguration` copy.
- Remove hardcoded `retriable = NO` from `PNSubscribeRequest` so transport-level retry configuration is applied to subscribe long-poll requests.
- Add `subscribeCycleGeneration` counter to `PNSubscriber` to detect and discard stale continuation calls dispatched asynchronously before a new subscribe cycle started.

#### Modified
- Add `retriable = NO` to `PNFileUploadRequest` because body streams cannot be rewound after a partial send.
- Add `request` method override with `retriable = NO` to `PNPresenceHeartbeatRequest` because presence heartbeat has its own timer-based periodic mechanism.
- BREAKING CHANGES: Delete `PNReachability` class and remove references from `PubNub.podspec` and Framework project in favor of transport-level retry for network recovery.
- Update export script to generate a directory umbrella modulemap instead of flat header symlinks. Configure publicHeadersPath and cSettings in Package.swift.
- Add unit tests for `copyWithZone` preserving excluded endpoints, default configuration retrying only subscribe, and heartbeat / file upload requests not being retriable.
- Add generation counter and retry tests Add unit tests verifying generation counter prevents stale subscribe continuations and transport-level retry works for subscribe requests using `NSURLProtocol` interception.

## 6.1.1
December 15 2025

Expand Down
116 changes: 0 additions & 116 deletions Example/PubNub Example.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,13 @@
6003F59E195388D20070C39A /* PNAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* PNAppDelegate.m */; };
6003F5A7195388D20070C39A /* PNViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* PNViewController.m */; };
6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; };
6E62272CF5614DB346C8AFCF /* Pods_PubNub_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F572CBC0DC97DD3F470035D2 /* Pods_PubNub_Example.framework */; };
793D26AF1B44049400509447 /* VERSION in Resources */ = {isa = PBXBuildFile; fileRef = 793D26AE1B44049400509447 /* VERSION */; };
873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; };
A530F8C524085644001B2B08 /* CHANGELOG.md in Resources */ = {isa = PBXBuildFile; fileRef = A530F8C424085644001B2B08 /* CHANGELOG.md */; };
A530F8C624085644001B2B08 /* CHANGELOG.md in Resources */ = {isa = PBXBuildFile; fileRef = A530F8C424085644001B2B08 /* CHANGELOG.md */; };
E074AE87BDB6C44276D1D512 /* Pods_PubNub_Mac_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0451137235DA1596688C4D44 /* Pods_PubNub_Mac_Example.framework */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
0451137235DA1596688C4D44 /* Pods_PubNub_Mac_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PubNub_Mac_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
511725D41BE92F7B008F069E /* PubNub Mac Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PubNub Mac Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
511725D61BE92F7B008F069E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
511725D71BE92F7B008F069E /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
Expand All @@ -39,7 +36,6 @@
511725DF1BE92F7B008F069E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
511725E21BE92F7B008F069E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
511725E41BE92F7B008F069E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5AE2B490CFDD8C02EECF89C7 /* Pods-PubNub_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PubNub_Example.debug.xcconfig"; path = "Target Support Files/Pods-PubNub_Example/Pods-PubNub_Example.debug.xcconfig"; sourceTree = "<group>"; };
6003F58A195388D20070C39A /* PubNub_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PubNub_Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
Expand All @@ -57,20 +53,15 @@
793D26AE1B44049400509447 /* VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = VERSION; path = ../VERSION; sourceTree = "<group>"; };
7A9945019D33BCC2C3B3B7C1 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
A149D49D150B7B757D55D167 /* Pods-PubNub_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PubNub_Example.release.xcconfig"; path = "Target Support Files/Pods-PubNub_Example/Pods-PubNub_Example.release.xcconfig"; sourceTree = "<group>"; };
A530F8C424085644001B2B08 /* CHANGELOG.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = CHANGELOG.md; path = ../CHANGELOG.md; sourceTree = "<group>"; };
C4C1ED79724D56B45766CFFA /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
DEEB307881C0C803272E5996 /* Pods-PubNub Mac Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PubNub Mac Example.release.xcconfig"; path = "Target Support Files/Pods-PubNub Mac Example/Pods-PubNub Mac Example.release.xcconfig"; sourceTree = "<group>"; };
F572CBC0DC97DD3F470035D2 /* Pods_PubNub_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PubNub_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
FDE08A50B1DD0A6FF09F6257 /* Pods-PubNub Mac Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PubNub Mac Example.debug.xcconfig"; path = "Target Support Files/Pods-PubNub Mac Example/Pods-PubNub Mac Example.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
511725D11BE92F7B008F069E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E074AE87BDB6C44276D1D512 /* Pods_PubNub_Mac_Example.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -81,7 +72,6 @@
6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */,
6003F592195388D20070C39A /* UIKit.framework in Frameworks */,
6003F58E195388D20070C39A /* Foundation.framework in Frameworks */,
6E62272CF5614DB346C8AFCF /* Pods_PubNub_Example.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -119,7 +109,6 @@
511725D51BE92F7B008F069E /* PubNub Mac Example */,
6003F58C195388D20070C39A /* Frameworks */,
6003F58B195388D20070C39A /* Products */,
64EBBFA0F7BF43305BE7BEF0 /* Pods */,
);
sourceTree = "<group>";
};
Expand All @@ -138,8 +127,6 @@
6003F58D195388D20070C39A /* Foundation.framework */,
6003F58F195388D20070C39A /* CoreGraphics.framework */,
6003F591195388D20070C39A /* UIKit.framework */,
0451137235DA1596688C4D44 /* Pods_PubNub_Mac_Example.framework */,
F572CBC0DC97DD3F470035D2 /* Pods_PubNub_Example.framework */,
);
name = Frameworks;
sourceTree = "<group>";
Expand Down Expand Up @@ -182,30 +169,16 @@
name = "Podspec Metadata";
sourceTree = "<group>";
};
64EBBFA0F7BF43305BE7BEF0 /* Pods */ = {
isa = PBXGroup;
children = (
FDE08A50B1DD0A6FF09F6257 /* Pods-PubNub Mac Example.debug.xcconfig */,
DEEB307881C0C803272E5996 /* Pods-PubNub Mac Example.release.xcconfig */,
5AE2B490CFDD8C02EECF89C7 /* Pods-PubNub_Example.debug.xcconfig */,
A149D49D150B7B757D55D167 /* Pods-PubNub_Example.release.xcconfig */,
);
name = Pods;
path = ../Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
511725D31BE92F7B008F069E /* PubNub Mac Example */ = {
isa = PBXNativeTarget;
buildConfigurationList = 511725F41BE92F7B008F069E /* Build configuration list for PBXNativeTarget "PubNub Mac Example" */;
buildPhases = (
3E97D35FEE390FF4192C0DFC /* [CP] Check Pods Manifest.lock */,
511725D01BE92F7B008F069E /* Sources */,
511725D11BE92F7B008F069E /* Frameworks */,
511725D21BE92F7B008F069E /* Resources */,
2CD31650FEB28D6485FD69C1 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
Expand All @@ -220,11 +193,9 @@
isa = PBXNativeTarget;
buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "PubNub_Example" */;
buildPhases = (
027CEE2CC9DCB8600172CD3E /* [CP] Check Pods Manifest.lock */,
6003F586195388D20070C39A /* Sources */,
6003F587195388D20070C39A /* Frameworks */,
6003F588195388D20070C39A /* Resources */,
2C7E52831852C5D96DA8A5E8 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
Expand Down Expand Up @@ -297,89 +268,6 @@
};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
027CEE2CC9DCB8600172CD3E /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-PubNub_Example-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
2C7E52831852C5D96DA8A5E8 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-PubNub_Example/Pods-PubNub_Example-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/PubNub-iOS/PubNub.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PubNub.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PubNub_Example/Pods-PubNub_Example-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
2CD31650FEB28D6485FD69C1 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-PubNub Mac Example/Pods-PubNub Mac Example-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/PubNub-macOS/PubNub.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PubNub.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PubNub Mac Example/Pods-PubNub Mac Example-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3E97D35FEE390FF4192C0DFC /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-PubNub Mac Example-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
511725D01BE92F7B008F069E /* Sources */ = {
isa = PBXSourcesBuildPhase;
Expand Down Expand Up @@ -425,7 +313,6 @@
/* Begin XCBuildConfiguration section */
511725F01BE92F7B008F069E /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = FDE08A50B1DD0A6FF09F6257 /* Pods-PubNub Mac Example.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
Expand All @@ -448,7 +335,6 @@
};
511725F11BE92F7B008F069E /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = DEEB307881C0C803272E5996 /* Pods-PubNub Mac Example.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
Expand Down Expand Up @@ -606,7 +492,6 @@
};
6003F5C0195388D20070C39A /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 5AE2B490CFDD8C02EECF89C7 /* Pods-PubNub_Example.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
Expand Down Expand Up @@ -640,7 +525,6 @@
};
6003F5C1195388D20070C39A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = A149D49D150B7B757D55D167 /* Pods-PubNub_Example.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
Expand Down
Loading
Loading