{"record":{"id":"3dd2ca9049c55133","repo":"siyuan-note/siyuan","slug":"conf-language-122-localized-subscription-require","errorCode":null,"errorMessage":"Conf.Language(122) (localized subscription-required message for iOS container)","messagePattern":"Conf\\.Language\\(122\\) \\(localized subscription-required message for iOS container\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kernel/model/blockial.go","lineNumber":43,"sourceCode":"\n\t\"github.com/88250/gulu\"\n\t\"github.com/88250/lute/ast\"\n\t\"github.com/88250/lute/editor\"\n\t\"github.com/88250/lute/html\"\n\t\"github.com/88250/lute/parse\"\n\t\"github.com/araddon/dateparse\"\n\t\"github.com/siyuan-note/siyuan/kernel/av\"\n\t\"github.com/siyuan-note/siyuan/kernel/cache\"\n\t\"github.com/siyuan-note/siyuan/kernel/filesys\"\n\t\"github.com/siyuan-note/siyuan/kernel/sql\"\n\t\"github.com/siyuan-note/siyuan/kernel/treenode\"\n\t\"github.com/siyuan-note/siyuan/kernel/util\"\n)\n\nfunc SetCloudReminder(id, content, timed string) (err error) {\n\tif !IsSubscriber() {\n\t\tif \"ios\" == util.Container {\n\t\t\treturn errors.New(Conf.Language(122))\n\t\t}\n\t\treturn errors.New(Conf.Language(29))\n\t}\n\n\tvar timedMills int64\n\tif \"0\" != timed {\n\t\tt, e := dateparse.ParseIn(timed, time.Now().Location())\n\t\tif nil != e {\n\t\t\treturn e\n\t\t}\n\t\ttimedMills = t.UnixMilli()\n\t}\n\n\tcontent = strings.TrimSpace(content)\n\terr = SetCloudBlockReminder(id, content, timedMills)\n\tif err != nil {\n\t\treturn\n\t}","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/kernel/model/blockial.go#L25-L61","documentation":"SetCloudReminder requires an active SiYuan subscription to store reminders in the cloud. When the user is not a subscriber and the kernel runs inside the iOS container (util.Container == \"ios\"), it returns the iOS-specific localized message from Conf.Language(122). This is a paywall/entitlement guard, not a bug.","triggerScenarios":"Calling SetCloudReminder (API /api/block/setCloudReminder) on iOS without an active subscription — e.g. a client setting a reminder on a block in the iOS app while the account has no paid subscription or the subscription has expired.","commonSituations":"iOS app users with expired subscriptions relying on reminder sync; third-party clients hitting the cloud reminder API against an iOS-hosted workspace; trial accounts after expiry.","solutions":["Purchase or renew the SiYuan subscription (Membership in settings) and log in again","Use local reminders instead of cloud sync features, or skip setCloudReminder for non-subscribers","Surface the localized message (Conf.Language(122)) to the user and stop retrying until subscription is active"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"const isSubscriber = (await fetchPost('/api/setting/...', {})); // check subscription state before calling\nif (!isSubscriber) showMessage(window.siyuan.languages[122]);","typeGuard":null,"tryCatchPattern":"try {\n  await fetchPost('/api/block/setCloudReminder', {id, content, timed});\n} catch (e) {\n  if (String(e.msg || e) === window.siyuan.languages[122]) {\n    showMessage('SiYuan Membership required for cloud reminders', 6000, 'info');\n    return; // do not retry\n  }\n  throw e;\n}","preventionTips":["Check subscription state client-side before invoking cloud reminder APIs","Offer a local-only reminder fallback for non-subscribers","Do not auto-retry this error; it only clears after subscription activation"],"tags":["subscription","cloud-reminder","ios","entitlement"],"backgroundTag":"authentication-required","analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}