diff --git a/docs/ai/agent-skills/sdk/ios/v7/SKILL.md b/docs/ai/agent-skills/sdk/ios/v7/SKILL.md index cc285af..e8158ea 100644 --- a/docs/ai/agent-skills/sdk/ios/v7/SKILL.md +++ b/docs/ai/agent-skills/sdk/ios/v7/SKILL.md @@ -47,7 +47,7 @@ ls Podfile Package.swift Cartfile 2>/dev/null # Existing Bugsee install (and which major version) grep -ri bugsee Podfile Package.swift Package.resolved Cartfile 2>/dev/null | head -10 -# Deployment target — 7.x requires iOS 13+ +# Deployment target — 7.x requires iOS 15+ grep -r "IPHONEOS_DEPLOYMENT_TARGET" *.xcodeproj/project.pbxproj 2>/dev/null | sort -u | head -5 # Entry point @@ -65,7 +65,7 @@ grep -rnE '"(BugseeAppLaunchCrashDetectionKey|BugseeDefaultBugPriority|BugseeDef | Question | Impact | |----------|--------| -| Deployment target below iOS 13? | Raise it — 7.x will not link otherwise | +| Deployment target below iOS 15? | Raise it — 7.x will not link otherwise | | `Podfile` / `Cartfile` only? | 7.x ships via SPM; the project needs an SPM dependency added | | Existing Bugsee 6.x found? | This is a migration, not a fresh install — go to Phase 2b after Phase 2 | | Raw option-key strings found? | **Fix these first** — they fail silently, with no compiler error | @@ -105,7 +105,7 @@ targets: [ ] ``` -`exact:` is mandatory. SwiftPM excludes pre-release versions from version ranges, so `from:` silently fails to resolve a 7.x beta. The target must also declare `platforms: [.iOS(.v13)]` or resolution fails. +`exact:` is mandatory. SwiftPM excludes pre-release versions from version ranges, so `from:` silently fails to resolve a 7.x beta. The target must also declare `platforms: [.iOS(.v15)]` or resolution fails. **`.xcodeproj` with no package manifest** — the reference lives in `.xcodeproj/project.pbxproj` as an `XCRemoteSwiftPackageReference` plus an `XCSwiftPackageProductDependency` wired into the target's `packageProductDependencies`. Hand-editing that file corrupts projects. Do not attempt it: ask the user to add the package once through Xcode (**File → Add Package Dependencies…**, the URL above, dependency rule **Exact Version**), then continue from Phase 3. Confirm it landed before moving on: @@ -116,11 +116,11 @@ grep -rn "bugsee/spm" *.xcodeproj/project.pbxproj *.xcworkspace/xcshareddata/swi > **Do not guess the version.** Ask the user which 7.x version to pin. If an existing `Package.swift` or `Package.resolved` already references `bugsee/spm`, change the rule in place rather than adding a second dependency on the same repository. -Requirements: iOS 13+, tvOS 13+, visionOS 1+. +Requirements: iOS 15+, tvOS 15+, visionOS 1+. ### Optional: in-app feedback -Feedback is no longer in the core framework. It ships as a separate Swift package, `BugseeFeedback`, published alongside the beta. Add it only if the app uses in-app feedback / chat. +Feedback is no longer in the core framework. It ships as a separate Swift package, `BugseeFeedback`, published alongside the beta at `https://github.com/bugsee/feedback-spm`. Add it only if the app uses in-app feedback / chat, with the **Exact Version** rule at the same version as the core package — each `BugseeFeedback` release requires that core version exactly. Its package identity is `feedback-spm`: `.product(name: "BugseeFeedback", package: "feedback-spm")`. --- @@ -145,7 +145,7 @@ Work in this order — it is not arbitrary: events and traces keep being recorded. If the app used `pause` to stop *all* capture, `[Bugsee stop:]` is the honest replacement. -Raising the deployment target to iOS 13 is a prerequisite for all of the above. +Raising the deployment target to iOS 15 is a prerequisite for all of the above. **Renamed.** A plain search and replace does most of these. diff --git a/docs/sdk/ios/swiftui.md b/docs/sdk/ios/swiftui.md index 1171098..c880d42 100644 --- a/docs/sdk/ios/swiftui.md +++ b/docs/sdk/ios/swiftui.md @@ -24,6 +24,12 @@ struct BugseeSwiftUIApp: App { Bugsee.launch(token: "", options: options) } + + var body: some Scene { + WindowGroup { + ContentView() + } + } } ``` @@ -40,6 +46,8 @@ import BugseeSwiftUI :::info `BugseeSwiftUI` requires iOS 13.0 or later; on iOS 12 the core `Bugsee` module remains fully usable. The module is part of the Swift Package Manager distribution only — the CocoaPods pod and the Carthage/manual XCFramework ship the core `Bugsee` framework alone. + +In 7.x both modules require iOS 15, Swift Package Manager is the only distribution channel, the dictionary launch above becomes `Bugsee.launch(token:dictionaryOptions:)`, and the option keys are renamed to the `BugseeOption*` family (for example `BugseeMaxRecordingTimeKey` → `BugseeOptionConfigDuration`). See the [7.x migration guide](/sdk/ios/v7/migration). ::: **Static protection** (view is always hidden): diff --git a/docs/sdk/ios/symbolication.mdx b/docs/sdk/ios/symbolication.mdx index 07c643e..7cda13c 100644 --- a/docs/sdk/ios/symbolication.mdx +++ b/docs/sdk/ios/symbolication.mdx @@ -420,7 +420,7 @@ Add bugsee fastlane to your project: fastlane add_plugin bugsee ``` -For uploading symbols during build(gym) (non-Bitcode case): +To upload symbols right after the build (`gym`): ``` lane :mybuildlane do @@ -433,7 +433,7 @@ lane :mybuildlane do end ``` -For refreshing dSYM files from App Store Connect (Bitcode case): +Builds uploaded with Bitcode (Xcode 13 and earlier) were recompiled by Apple, so their dSYM files have to be downloaded from App Store Connect instead: ``` lane :refresh_dsyms do diff --git a/docs/sdk/ios/v7/migration.mdx b/docs/sdk/ios/v7/migration.mdx index 4f556bb..812f684 100644 --- a/docs/sdk/ios/v7/migration.mdx +++ b/docs/sdk/ios/v7/migration.mdx @@ -994,6 +994,7 @@ Renamed — a plain search and replace does most of these. | `registerEvent:` | `event:` | | `registerEvent:withParams:` | `event:params:` (params now optional) | | `traceKey:withValue:` | `trace:value:` | +| Swift `Bugsee.trace(key:value:)` | Swift `Bugsee.trace(_:value:)` | | `registerNetworkEvent:` | `addNetworkEvent:` | | `registerNetworkEvent:needsToBeFiltered:` | `addNetworkEvent:requiresFiltering:` | | `removeNetworkEventFilter` | `setNetworkEventFilter:nil` | @@ -1027,7 +1028,7 @@ Removed with no direct replacement. | `isViewHidden:` | — | | `hideKeyboard:` | — | | `setInternalSecureRectangles:` | — | -| `logAssert:withLocation:` | Use `logException:reason:options:completion:` | +| `logAssert:withLocation:` / `BUGSEE_ASSERT` | Use `logException:reason:options:completion:` | | `log:level:timestamp:` | `log:level:requiresFiltering:` takes the slot but does something different — it opts the message into the log filter | | `setDefaultCrashPriority:` | `BugseeOptionReportingDefaultCrashPriority` at launch | | `setDefaultErrorPriority:` | `BugseeOptionReportingDefaultErrorPriority` at launch | diff --git a/docusaurus.config.ts b/docusaurus.config.ts index ce3bb48..367ac4e 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -2,6 +2,9 @@ import { themes as prismThemes } from 'prism-react-renderer'; import type { Config } from '@docusaurus/types'; import type * as Preset from '@docusaurus/preset-classic'; +// Wrapper SDKs share one layout: an installation page and a privacy section. +const wrapperSdks = ['cordova', 'dotnet', 'flutter', 'kmp', 'react_native', 'unity', 'xamarin']; + const config: Config = { title: 'Bugsee', tagline: 'Documentation', @@ -63,6 +66,49 @@ const config: Config = { ], ], + plugins: [ + [ + '@docusaurus/plugin-client-redirects', + { + redirects: [ + // Section roots have no page of their own; send them to the first page. + { from: '/sdk/ios', to: '/sdk/ios/installation/' }, + { from: '/sdk/ios/v7', to: '/sdk/ios/v7/installation/' }, + { from: '/sdk/ios/builds', to: '/sdk/ios/builds/overview/' }, + { from: '/sdk/ios/privacy', to: '/sdk/ios/privacy/overview/' }, + { from: '/sdk/android', to: '/sdk/android/overview/' }, + { from: '/sdk/android/manual', to: '/sdk/android/manual/bug-reporting/' }, + { from: '/sdk/android/privacy', to: '/sdk/android/privacy/overview/' }, + { from: '/sdk/android/v6', to: '/sdk/android/v6/installation/' }, + { from: '/sdk/android/v6/privacy', to: '/sdk/android/v6/privacy/overview/' }, + ...wrapperSdks.flatMap((sdk) => [ + { from: `/sdk/${sdk}`, to: `/sdk/${sdk}/installation/` }, + { from: `/sdk/${sdk}/privacy`, to: `/sdk/${sdk}/privacy/overview/` }, + ]), + // Android pages that were split or renamed. + { from: '/sdk/android/custom', to: '/sdk/android/events-and-traces/' }, + { from: '/sdk/android/crashes', to: '/sdk/android/issue-detection/crashes/' }, + { from: '/sdk/android/gradle-plugin-releases', to: '/sdk/android/gradle-plugin/releases/' }, + { from: '/sdk/android/v7', to: '/sdk/android/overview/' }, + { from: '/sdk/android/v7/privacy', to: '/sdk/android/privacy/overview/' }, + { from: '/sdk/android/v7/custom', to: '/sdk/android/events-and-traces/' }, + { from: '/sdk/android/v7/crashes', to: '/sdk/android/issue-detection/crashes/' }, + { from: '/sdk/android/v7/detection', to: '/sdk/android/issue-detection/' }, + { from: '/sdk/android/v7/extensions', to: '/sdk/android/extensibility/bugsee-extensions/' }, + { from: '/sdk/android/v7/manual', to: '/sdk/android/manual/bug-reporting/' }, + ], + // Android 7.x lived under /sdk/android/v7/ until it became the default; + // every current Android page keeps answering at its old v7 address. + createRedirects(existingPath: string) { + if (existingPath.startsWith('/sdk/android/') && !existingPath.startsWith('/sdk/android/v6/')) { + return existingPath.replace('/sdk/android/', '/sdk/android/v7/'); + } + return undefined; + }, + }, + ], + ], + presets: [ [ 'classic', diff --git a/package-lock.json b/package-lock.json index cace06f..94f2f57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@docusaurus/core": "3.10.2", "@docusaurus/faster": "^3.10.2", + "@docusaurus/plugin-client-redirects": "3.10.2", "@docusaurus/preset-classic": "3.10.2", "@easyops-cn/docusaurus-search-local": "^0.55.3", "@mdx-js/react": "^3.0.0", @@ -3648,6 +3649,30 @@ "react-dom": "*" } }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.2.tgz", + "integrity": "sha512-z5I5ttCXw+8y2gHVZvqAMmUw4Rb0ZzKA5eCPk87SfM/jCKOTvE24yDpPAwwipvug96ij7mOwEHXWw8G4LlWdGA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/logger": "3.10.2", + "@docusaurus/utils": "3.10.2", + "@docusaurus/utils-common": "3.10.2", + "@docusaurus/utils-validation": "3.10.2", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, "node_modules/@docusaurus/plugin-content-blog": { "version": "3.10.2", "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.2.tgz", diff --git a/package.json b/package.json index fc3a91f..513fa53 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "dependencies": { "@docusaurus/core": "3.10.2", "@docusaurus/faster": "^3.10.2", + "@docusaurus/plugin-client-redirects": "3.10.2", "@docusaurus/preset-classic": "3.10.2", "@easyops-cn/docusaurus-search-local": "^0.55.3", "@mdx-js/react": "^3.0.0",