爱意满满的作品展示区。
iPocket

[送码] 维护了快一年的会员订阅管理工具 — 口袋订阅,最近大幅优化了一版本

  •  
  •   iPocket · May 26 · 6810 views
    This topic created in 160 days ago, the information mentioned may be changed or developed.
    一个苹果 iOS 原生制作的会员订阅管理工具 —— 口袋订阅,维护了快一年了,总体很稳定了,非常感谢国内外的朋友反馈,特别是一个老外叫 Jimmy ,好像非常喜欢我这款产品,他发现 bug 总是发邮件给我,邮件里有和他对话的几十封邮件了,真的非常感谢,也很开心。
    产品主打简约,可以快速添加会员订阅,快速查找会员订阅,其他功能,订阅 APP 里该有的应该都有。然后可以通过长按别的 APP 分享到 口袋订阅 快速添加,也可以通过搜索 APP/网站 名称来快速添加,其他功能我倒觉得没那么重要,主要看个大概的费用。
    APP 不搜集你的任何数据,这里其实有个缺点,就是你想改善你的产品的时候,没有数据,就会发现无从下手,你根本不知道用户在哪个页面体验不好😂,全靠用户从其他渠道反馈,邮件、小红书等。如有苹果开发者也可以一起交流下这方面的经验。
    App Store 地址: https://apps.apple.com/cn/app/%E5%8F%A3%E8%A2%8B%E8%AE%A2%E9%98%85-%E8%AE%A2%E9%98%85%E7%AE%A1%E7%90%86%E4%B8%8E%E8%B4%A6%E5%8D%95%E6%8F%90%E9%86%92/id6752631319


    留言抽 20 个永久会员,明天收市后按上证指数抽出,因为我发现我送的很多兑换码感觉被机器人秒了
    抽奖程序由 GPT 提供,代码如下
    ```javascript
    (async function lottery() {
    const drawTime = "2026-05-27 18:00:00"; // 开奖时间
    const postUrl = "https://example.com/post/123"; // 帖子链接
    const shIndex = "3123.45"; // 上证指数,建议用字符串,避免小数精度问题
    const replyTotal = 1000; // 回复总数
    const winnerCount = 20; // 抽奖个数

    if (!drawTime || !postUrl || !shIndex) {
    console.error("开奖时间、帖子链接、上证指数不能为空");
    return;
    }

    if (!Number.isSafeInteger(replyTotal) || replyTotal <= 0) {
    console.error("回复总数必须是大于 0 的安全整数");
    return;
    }

    if (!Number.isSafeInteger(winnerCount) || winnerCount <= 0) {
    console.error("抽奖个数必须是大于 0 的安全整数");
    return;
    }

    if (winnerCount > replyTotal) {
    console.error("抽奖个数不能大于回复总数");
    return;
    }

    async function sha256Hex(text) {
    const data = new TextEncoder().encode(text);
    const hashBuffer = await crypto.subtle.digest("SHA-256", data);

    return Array.from(new Uint8Array(hashBuffer))
    .map(b => b.toString(16).padStart(2, "0"))
    .join("");
    }

    function hexToBigInt(hex) {
    return BigInt("0x" + hex);
    }

    async function randomInt(seed, counter, maxExclusive) {
    const max = BigInt(maxExclusive);
    const space = 1n << 256n;
    const limit = space - (space % max);

    while (true) {
    const hash = await sha256Hex(seed + ":" + counter.value);
    counter.value++;

    const num = hexToBigInt(hash);

    // 拒绝采样,避免简单取模产生偏差
    if (num < limit) {
    return Number(num % max);
    }
    }
    }

    async function drawWinners(seed, replyTotal, winnerCount) {
    const winners = [];
    const swapped = new Map();
    const counter = { value: 0 };

    for (let i = 0; i < winnerCount; i++) {
    const remaining = replyTotal - i;
    const r = await randomInt(seed, counter, remaining);

    const selectedIndex = i + r;

    const selectedValue = swapped.has(selectedIndex)
    ? swapped.get(selectedIndex)
    : selectedIndex + 1;

    const currentValue = swapped.has(i)
    ? swapped.get(i)
    : i + 1;

    swapped.set(selectedIndex, currentValue);
    winners.push(selectedValue);
    }

    return winners;
    }

    const rawSeed = [
    `开奖时间=${drawTime}`,
    `帖子链接=${postUrl}`,
    `上证指数=${shIndex}`,
    `回复总数=${replyTotal}`,
    `抽奖个数=${winnerCount}`
    ].join("|");

    const seedHash = await sha256Hex(rawSeed);
    const winners = await drawWinners(seedHash, replyTotal, winnerCount);
    const sortedWinners = [...winners].sort((a, b) => a - b);

    console.log("========== 抽奖结果 ==========");
    console.log("原始种子:");
    console.log(rawSeed);
    console.log("");
    console.log("种子 SHA-256:");
    console.log(seedHash);
    console.log("");
    console.log("中奖楼层:");
    console.log(winners.join(", "));
    console.log("");
    console.log("中奖楼层,升序:");
    console.log(sortedWinners.join(", "));
    console.log("============================");
    })();
    ```
    147 replies  •  2026-06-15 09:55:19 +08:00
    1  2  
    ❮ ❯
    viso7682
    viso7682
    May 27
    101
    @iPocket #97 dmlzbzc2ODJAb3V0bG9vay5jb20= 谢谢大佬
    cyang
    cyang
    PRO
    May 27
    102
    @iPocket bG92ZXl1eWFvQG91dGxvb2suY29t 谢谢
    viso7682
    viso7682
    May 27
    103
    @iPocket #97 dmlzbzc2ODJAb3V0bG9vay5jb20=刚回复错了,谢谢大佬🤣
    passtest
    passtest
    May 27 via iPhone
    104
    又当分母了🥲
    kongzz
    kongzz
    May 27
    105
    @sun522198558 #99 谢谢老板, a29uZ0Brb25nenoueHl6
    iPocket
    iPocket
    OP
    May 27
    106
    @sun522198558
    @Wyearn
    @viso7682
    @cyang
    @kongzz
    已发送,请查收
    lc4t
    lc4t
    May 27
    107
    @iPocket #97 谢谢老板~ bGM0dDAuMEBnbWFpbC5jb20=
    48odaerina
    108
    @iPocket #97 谢谢老板 NDhvZGFlcmluYUBnbWFpbC5jb20=
    luckycoding
    109
    @iPocket 谢谢老板 cmh5c3Blbm4ubWVAZ21haWwuY29t
    vpromise
    vpromise
    May 27
    110
    @iPocket #97 感谢 dnByb21pc2V2ZXJAZ21haWwuY29t
    iPocket
    iPocket
    OP
    May 27
    111
    @lc4t
    @48odaerina
    @luckycoding
    @vpromise 已发送,请查收
    Muyun
    Muyun
    May 27
    112
    支持老板
    marcoseaver
    113
    謝謝:d3VtYXJjb0A4OC5jb20=
    marcoseaver
    114
    @iPocket #97 謝謝 d3VtYXJjb0A4OC5jb20=
    chocolatesir
    115
    感谢楼主 Z2V0dUBkdWNrLmNvbQ==
    ganzhen
    ganzhen
    May 28 via iPhone
    116
    @iPocket 感谢 MTQyNTgxMzIxMUAxMzkuY29t
    imbelike
    imbelike
    May 28
    117
    @iPocket 感谢老板,bXNiZWxpdmVAaWNsb3VkLmNvbQ==
    song135711
    118
    @iPocket thanks, YmVuc29uZzIwMTdAaG90bWFpbC5jb20K
    whiteleopard520
    120
    @iPocket 谢谢佬,忘记用 base 码了,MjYxOTgxNzU3QHFxLmNvbQ==
    Rex180123
    Rex180123
    May 28
    121
    @iPocket #97 谢谢老板,Ym9sbC50YXJnZXRzLjd3QG91dGxvb2suY29t
    lwsbluesky
    122
    @iPocket 谢谢大佬,邮箱:aTU2NDAyNTEwMEBnbWFpbC5jb20=
    Sooncheng
    Sooncheng
    May 28
    123
    @iPocket 感谢老板,MTg0NTMwOTY1QHFxLmNvbQ==
    Latin
    Latin
    May 28
    124
    @iPocket #83 谢谢老板 aWJsYWNraGFja2VkQGdtYWlsLmNvbQ==
    evilHa
    evilHa
    May 28
    125
    @iPocket #106
    ZXZvbGluZ3lvdW5nQHFxLmNvbQ==
    谢谢老板
    w797200
    w797200
    May 28
    126
    @iPocket #97 dzc5NzIwMEAxNjMuY29t 谢谢大佬
    sdushn
    sdushn
    May 28
    127
    @iPocket 感谢大佬,我是 74 层,邮箱 c2R1c2huQGdtYWlsLmNvbQ==
    chiaoyuja
    chiaoyuja
    May 28
    128
    @iPocket #97 卧槽 我竟然中了,感谢大佬, 邮箱 Y2hpYW95dWppYUBnbWFpbC5jb20=
    LightChan
    LightChan
    May 28
    129
    @iPocket #97 [email protected] ,感谢老板🙏🥰
    LightChan
    LightChan
    May 28
    130
    @LightChan #129 bGlnaHQuZmluZG1lQG91dGxvb2suY29t,忘记套编码了,补一个,感谢老板
    iPocket
    iPocket
    OP
    May 28
    131
    Tongwin
    Tongwin
    May 28
    132
    来晚了!还能再来 1 次抽奖吗?最近订阅了 gpt plus ,然后就下载了口袋订阅来提醒。
    chiaoyuja
    chiaoyuja
    May 28
    133
    @iPocket #131 感谢,已收到,有个建议,可以单独有个地方管理硬件成本吗,记录购买的东西和时间,计算到当前的日均成本
    feisualio
    feisualio
    May 28
    134
    很好的软件,来晚了
    tychanges
    tychanges
    May 28
    135
    @iPocket #97 感谢大佬,邮箱:eWFueXVlemh1b0BnbWFpbC5jb20K
    emberzhang
    136
    @iPocket 谢谢老板 ZW1iZXJ6aGFuZ0BnbWFpbC5jb20=
    sktline
    sktline
    May 28
    137
    @Peikon 谢谢老板,eGR5bjIwMjZAb3V0bG9vay5jb20=
    vpromise
    vpromise
    May 28
    138
    @iPocket #111 已收到,感谢,app 好看
    marcoseaver
    139
    @iPocket #131 謝謝!
    NullWithMe
    140
    NTMyODc2MDkxQHFxLmNvbQ==
    支持一下,看看是不是分子
    pljhonglu
    pljhonglu
    May 28
    141
    @iPocket #97 cGxqaG9uZ2x1QGdtYWlsLmNvbQ== 谢谢老板
    iPocket
    iPocket
    OP
    May 28
    142
    @pljhonglu
    @tychanges
    @emberzhang
    @sktline 已发送,请查收
    iPocket
    iPocket
    OP
    May 28
    143
    @chiaoyuja 在设置里有个地方可以开启日均成本
    iPocket
    iPocket
    OP
    May 28
    144
    @Tongwin 开发新的软件后都会送兑换码的
    lepig
    lepig
    May 29
    145
    @iPocket #97

    感谢老板 bGVwaWdAcXEuY29t
    windowlife
    146
    d2luZG93bGlmZUBxcS5jb20=‌
    谢谢
    qhy2ch
    qhy2ch
    Jun 15
    147
    @iPocket #95 感谢大佬,邮箱:bGJienlmMDIyNkBnbWFpbC5jb20=
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3097 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 11:44 · PVG 19:44 · LAX 03:44 · JFK 06:44
    ♥ Do have faith in what you're doing.