惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
博客园 - 叶小钗
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
TaoSecurity Blog
TaoSecurity Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
爱范儿
爱范儿
宝玉的分享
宝玉的分享
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
量子位
N
News and Events Feed by Topic
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Recent Commits to openclaw:main
Recent Commits to openclaw:main
SecWiki News
SecWiki News
MyScale Blog
MyScale Blog
AI
AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 【当耐特】
Security Archives - TechRepublic
Security Archives - TechRepublic
F
Fortinet All Blogs
V2EX - 技术
V2EX - 技术
T
Troy Hunt's Blog
有赞技术团队
有赞技术团队
W
WeLiveSecurity
Project Zero
Project Zero
T
Tor Project blog
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
IT之家
IT之家
The Hacker News
The Hacker News
腾讯CDC
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
C
Cisco Blogs
博客园 - 聂微东
Webroot Blog
Webroot Blog
Forbes - Security
Forbes - Security
M
MIT News - Artificial intelligence
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
About on SuperTechFans

移动开发

上海做 iOS App 出海的独立开发者,你们用哪家代账? - V2EX 真实相亲 app 构想 在 app 里面添加即时通讯的功能 能过平台审核吗 - V2EX 新年下定决心重构将近 10 年的 APP - V2EX Markdown 原生渲染(表格滚动&LaTeX 公式支持) - V2EX 超古老 iOS 项目 xcode 26 打包遇到 409 错误 - V2EX 大家使用 Expo eas build 耗时多久? - V2EX 我用 AI 写了一个免费的听歌软件 - V2EX 写了本关于 React Native 的书 - V2EX 关于安卓 ipv6 的路由设置问题,为什么输入路由查询没 ipv6 还能正常访问 ipv6 的地址 - V2EX 求助 ios 开发睡眠应用,如何识别声音是打鼾还是脚步声还是梦话呢? - V2EX 独立开发周记 85 : 2024 年终总结 - V2EX 如果做一些工具类的轻应用,是选小程序,还是 H5? - V2EX 关于 Android 开发无障碍游戏外挂 - V2EX 开发的 APP 接口总是会被封,怎么处理? - V2EX 关于抓包 - V2EX instagram 安卓端如何抓包? - V2EX 有老哥接触过杰峰云吗,有没有什么更好的替换平台,杰峰云的文档也太烂了 - V2EX 开发一款地图类 app, uniapp 能胜任吗? - V2EX 老项目, Android Java 、iOS OC,想封装一个前端中的后端,用 Rust 还是 go? - V2EX 为什么很多 app 页面由于网络原因未加载出来,连个返回键也不给? - V2EX 想找人用 rn 开发一套半原生论坛 App 得多少钱? - V2EX 咨询下小程序开发开发环境和生产环境 - V2EX mac mini 2018 i3 32g 还是 mini m1 16g - V2EX 请教下大佬们移动端跨平台开发的数据同步方案 - V2EX 目前在规划开发一个 app,想问下多语言文案这块,有没有比较方便的解决方式 - V2EX 做 app 开发的朋友们,有 flutter 的 app 壳吗? 可以 webview 打开网站,可以推送消息这样的。 - V2EX 有没有能自动同步微信,支付宝和银行卡的钱包软件? - V2EX 开发 SwiftUI 可以看看这个库 - Water - V2EX App 测试包需要屏蔽统计分析吗 - V2EX 感觉 Xcode 使用体验太难受了 - V2EX 国内上架一个 app 还需要软件著作证明?麻了 - V2EX 开发了一个 Android App,如何兼顾国内国外的网络访问? - V2EX 苹果内购会出现扣费不到账的情况 - V2EX 现在新开发 iOS 应用还需要兼容 iOS14 吗? - V2EX 关于苹果开发者账号的疑问 - V2EX Azuki 的黄金滑板是怎么实现 scan-to-own 的? - V2EX iOS 有哪些多渠道打包方案 - V2EX T Chat 第九期「 李泽磊 - 我在百度做阅读器 」今晚 8 点开播 - V2EX 求助,有无办法可以通过 Python 脚本录制手机屏幕 - V2EX 移动端 自动补全 autocomplete 有更好的方案吗 - V2EX 想做客户端的小游戏(例如飞行棋、桌球),用 CocosCreator 还是 Flutter Flame? - V2EX 同一个健康码(二维码)如何同时支持微信和支付宝? - V2EX 关于安卓 PDA 项目开发,应该用哪种前端技术? T Chat 第三期「卡比 - 我在 B 站做架构」5 月 26 日晚 8 点正式开播 T Chat 第二期「王振辉- 我在闲鱼做 Flutter」本周四晚 8 点正式开播! app 如何实现分享消息到任意的企业微信(跨企业分享) 关于 hybrid APP 的技术选型问题 2022 年了, React Native 和 Flutter、uni-app 怎么选? Bugly 现在还有维护么 请问大家在移动开发中如何应对大量字体的排版问题 - V2EX
iOS - 审核问题记录 - V2EX
ioserlsj · 2024-05-01 · via 移动开发

IOSAuditRecords

iOS - 审核问题记录,所有的问题都可以在 issues 上交流

Github: https://github.com/lishangjing-spec/IOSAuditRecords

规则跟进渠道


审核问题

Guideline 4.3 - Design - Spam

Tag:功能重复,产品在市场过于多  Your app primarily features dating features. As such, it duplicates the content and functionality of many other similar apps currently available on the App Store.  While these app features may be useful, informative or entertaining, we simply have enough of these types of apps on the App Store, and they are considered a form of spam.  苹果反馈: 您的应用程序主要具有约会功能。因此,它复制了 App Store 上目前可用的许多其他类似应用程序的内容和功能。 虽然这些应用程序功能可能有用、信息丰富或有趣,但我们在应用商店上有足够多的此类应用程序,它们被视为一种垃圾邮件。

处理方式: 完善产品,体现产品价值后在进行发布


Guideline 2.3.3 - Performance - Accurate Metadata

Tag:应用截图

2.3.3 Screenshots should show the app in use, and not merely the title art, login page, or splash screen. They may also include text and image overlays (e.g. to demonstrate input mechanisms, such as an animated touch point or Apple Pencil) and show extended functionality on device, such as Touch Bar.

Issue Description

Some or all of the provided screenshots do not sufficiently show the app in use. Screenshots should highlight the app's core concept to help users understand the app’s functionality and value. 

Follow these requirements when adding or updating screenshots:

- Marketing or promotional materials that do not reflect the UI of the app are not appropriate for screenshots.
- The majority of the screenshots should highlight the app's main features and functionality.
- Confirm that the app looks and behaves identically in all languages and on all supported devices.
- Make sure that the screenshots show the app in use on the correct device. For example, iPhone screenshots should be taken on iPhone, not on iPad.

Next Steps

The iPad Pro (2nd Gen) and iPad Pro (6th Gen) screenshots show an iPhone image that has been modified or stretched to appear to be an iPad image. Upload new screenshots that accurately reflect the app in use on each of the supported devices.

苹果反馈:

  1. 应用截图,应该体现 App 功能,不能是简单的首页、登录注册等界面的截图
  2. 截图不能拉伸,使用正确分辨率的设备或模拟器进行截图

存在的问题:

  1. 我提供的截图过于简单
  2. 我使用了小屏幕的截图,调整了分辨率进行了提交,因为当时模拟器因为一些问题导致无法运行

处理方式:

  1. 丰富截图内容
  2. 通过模拟器运行正确的设备进行截图

处理结果:通过审核


Guideline 2.1 - Performance - App Completeness

Tag:内购、无法从苹果服务器获取商品信息、response.products.count == 0

We found that your in-app purchase products exhibited one or more bugs which create a poor user experience. Specifically, there was no further action produced when we attempted to make a purchase. Please review the details and resources below and complete the next steps.

Review device details: 

- Device type: iPhone 12 
- OS version: iOS 17.4.1

Next Steps

When validating receipts on your server, your server needs to be able to handle a production-signed app getting its receipts from Apple’s test environment. The recommended approach is for your production server to always validate receipts against the production App Store first. If validation fails with the error code "Sandbox receipt used in production," you should validate against the test environment instead.

Resources

- Learn how to set up and test in-app purchase products in the sandbox environment.
- For more information on receipt validation, see the In-App Purchase FAQ. 
- If your app makes a SKReceiptRefreshRequest call and fails, do not retry the call. Assume the user does not have access. Continue by making the addPayment call.
- If your app makes a SKReceiptRefreshRequest call to restore previously purchased in-app purchases, make sure the app calls restoreCompletedTransactions when the user selects the "Restore" button.

Support

- Reply to this message in your preferred language if you need assistance. If you need additional support, use the Contact Us module.
- Consult with fellow developers and Apple engineers on the Apple Developer Forums.
- Help improve the review process or identify a need for clarity in our policies by suggesting guideline changes.

苹果反馈: 在点击内购商品的时候,没有错误提示,没有下一步的操作,无法完成内购行为

自行检查:

  1. 在苹果的反馈截图中,有错误提示:“无法获取产品信息, 请重试”
  2. 这个错误信息是在苹果 API 回调中触发 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
  3. 检查所有的内购配置:
    1. Xcode 与证书配置中 In-App Purchases 开关是打开状态
    2. 协议、税务和银行业务也填写了信息
    3. App 也与内购项目进行了绑定

经过排查后,我认为程序上没有存在问题,可以把问题抛回给苹果,审核人员也是人,也并非不会犯错

回复中所有的涉及的截图不方便展示,根据自身项目进行截图替换文件名

回复内容: 您好,在您提供的截图中,我看到了错误信息的返回,并非没有任何下一步的处理,截图文件 “Screenshot-0331-171650.png” 中显示“无法获取产品信息, 请重试”,这个错误信息是因为在苹果 API 回调方法

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

回调中 response.products.count 的数量为 0 ,也就是说,我并没有从苹果 API 的回调中获取内购列表信息

这个项目是我首次提交的项目,与内购一同在审核中,内购项目也处于“正在等待审核”的状态,请确认您的审核环境,或是缓存等问题,同时请帮我确认我的内购项目的审核状态。

同时,在您反馈的截图中,我发现一个点,我并未在您触发内购的截图中观察到网络环境,无论是 wifi 还是蜂窝。

在这之前,我也检查了所有的配置:

  1. Xcode 与证书配置中 In-App Purchases 开关是打开状态(提供了截图“WX20240401-111418.png”)
  2. 协议、税务和银行业务也填写了信息
  3. App 也与内购项目进行了绑定(提供了截图“WX20240401-101243.png”)

我也提供了我在 TestFlight 中的测试视频,请查看附件("test1.mp4") 以及相同系统环境下的测试视频:请查看附件("test2.mp4")

请您检查并确认后,再次进行测试,感谢

处理结果:通过审核


Guideline 5.1.1 - Legal - Data Collection and Storage

Tag:内购、Storage

We noticed that your app requires users to register with personal information to purchase in-app purchase products that are not account based. 

Apps cannot require user registration prior to allowing access to app content and features that are not associated specifically to the user. User registration that requires the sharing of personal information must be optional or tied to account-specific functionality.

Next Steps

To resolve this issue, please revise your app to not require users to register before purchasing in-app purchase products that are not account based. You may explain to the user that registering will enable them to access the purchased content from any of their supported devices and provide them a way to register at any time, if they wish to later extend access to additional devices.

Please note that although App Review Guideline 3.1.2 requires an app to make subscription content available to all the supported devices owned by a single user, it is not appropriate to force user registration to meet this requirement; such user registration must be optional.

Resources 

- Watch a video from App Review with tips for doing more for users with less data. 
- See guideline 5.1.1(v) - Account Sign-In to learn more about our requirements for apps with account-based content and features.


大致意思,App 需要支持不登录就能支付内购 解决方案:与后端配合做一个游客模式,同时这个游客也有自己的 token 进行内购

如果审核之后,会关闭游客模式,可以不考虑后续游客内购内容如何与后续登录的实际账号进行关联 如果你们不关闭,可以多考虑这些优化

结果:通过审核


Guideline 2.5.4 - Performance - Software Requirements

Tag:UIBackgroundModes 、画中画


Guideline 2.5.4 - Performance - Software Requirements

The app declares support for audio in the UIBackgroundModes key in your Info.plist, but we are unable to play any audible content when the app is running in the background.

Background audio is intended for use by apps that provide audible content to the user while in the background, such as music player, music creation, or streaming audio apps. 

Next Steps

If the app has a feature that requires persistent audio, reply to this message and let us know how to locate this feature. If the app does not have a feature that requires persistent audio, it would be appropriate to remove the "audio" setting from the UIBackgroundModes key.

Resources 

- Learn more about software requirements in guideline 2.5.4.
- Review documentation for the UIBackgroundModes key.

项目中开启了 UIBackgroundModes 但是审核人员并么有发现对应功能,无论是后台播放音乐还是画中画

在我的项目中,我用到了画中画功能,所以我将其开启了

从苹果的反馈 If the app has a feature that requires persistent audio, reply to this message and let us know how to locate this feature ,苹果审核人员并没有找到项目中画中画的功能,所以这种情况我们录制 app 中,触发画中画功能的视频给苹果就可以通过。

解决方式:录制功能视频提交至苹果,并反馈(备注、回复)中进行详细描述

当用户点击 “xxx” 时,我们会弹出一个教程视频,引导用户如何开启 xxx 功能、xxxx 等行为。为了方便用户在手机桌面一边观看视频一边进行操作,所以我们需要 UIBackgroundModes 来进行视频播放,这样用户可以在观看教程的同时,进行 xxx 行为。我们录制了一段演示视频,说明具体的应用场景,演示视频的链接: https://xxx.mp4

来源: https://blog.51cto.com/u_16099186/9399269

结果:通过审核


邮件警告

第三方 SDK 隐私清单和签名( 5 月 1 号后上传的 app 都需要增加隐私描述)

Hello,

We noticed one or more issues with a recent submission for App Store review for the following app:

Although submission for App Store review was successful, you may want to correct the following issues in your next submission for App Store review. Once you've corrected the issues, upload a new binary to App Store Connect.

ITMS-91053: Missing API declaration - Your app’s code in the “PlugIns/XXXIntent.appex/XXXIntent” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryUserDefaults. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.

ITMS-91053: Missing API declaration - Your app’s code in the “PlugIns/XXXIntent.appex/XXXIntent” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryDiskSpace. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.

ITMS-91053: Missing API declaration - Your app’s code in the “XXX” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryFileTimestamp. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.

ITMS-91053: Missing API declaration - Your app’s code in the “XXX” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategorySystemBootTime. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.

ITMS-91053: Missing API declaration - Your app’s code in the “XXX” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryDiskSpace. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.

ITMS-91053: Missing API declaration - Your app’s code in the “XXX” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryUserDefaults. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.

Apple Developer Relations

规则更新时间:2023 年 12 月 7 日
主要内容:开发者在 5 月 1 号后上传的 app 都需要增加隐私描述
官方文档 1
NSPrivacyAccessedAPITypeReasons 配置 - 官方文档 2
三方 SDK 的应对参考: https://cloud.tencent.com/document/product/269/104138
开发者的处理: https://www.jianshu.com/p/633f9778efd7

1.1 添加隐私文件

1.2 依据警告添加相应的原因说明,添加后的文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>E174.1</string>
            </array>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>35F9.1</string>
            </array>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
        </dict>
    </array>
</dict>
</plist>

关于 NSPrivacyAccessedAPITypeReasons 配置,可查看 官方文档