Fix remote player SDK types and signing prefix; test remote commands
This commit is contained in:
@@ -162,11 +162,11 @@ widget_info = dict(CFBundleDevelopmentRegion="ru", CFBundleDisplayName="MusicBri
|
||||
NSExtension=dict(NSExtensionPointIdentifier="com.apple.widgetkit-extension"))
|
||||
(ROOT / "MusicBridgeWidgets" / "Info.plist").write_bytes(plistlib.dumps(widget_info, sort_keys=False))
|
||||
shared_group_name = "$(AppIdentifierPrefix)ru.yukinoki.musicbridge.remote-control"
|
||||
info["MusicBridgeSharedKeychainGroup"] = shared_group_name
|
||||
info["MusicBridgeSharedKeychainGroup"] = "ru.yukinoki.musicbridge.remote-control"
|
||||
(ROOT / "MusicBridge" / "Info.plist").write_bytes(plistlib.dumps(info, sort_keys=False))
|
||||
remote_info = {k: v for k, v in widget_info.items() if k != "NSExtension"}
|
||||
remote_info.update(EXAppExtensionAttributes=dict(EXExtensionPointIdentifier="com.apple.nowplaying.remote-media"),
|
||||
MusicBridgeSharedKeychainGroup=shared_group_name,
|
||||
MusicBridgeSharedKeychainGroup=info["MusicBridgeSharedKeychainGroup"],
|
||||
NSLocalNetworkUsageDescription=info["NSLocalNetworkUsageDescription"],
|
||||
NSAppTransportSecurity=info["NSAppTransportSecurity"])
|
||||
(ROOT / "MusicBridgeRemote" / "Info.plist").write_bytes(plistlib.dumps(remote_info, sort_keys=False))
|
||||
|
||||
+20
-1
@@ -47,6 +47,25 @@ with zipfile.ZipFile(path) as archive:
|
||||
platforms.append(struct.unpack_from("<I", binary, offset + 8)[0])
|
||||
offset += size
|
||||
assert platforms == [2], "Widget is not built for iOS devices"
|
||||
remote_path = prefix + "Extensions/MusicBridgeRemote.appex/"
|
||||
remote = plistlib.loads(archive.read(remote_path + "Info.plist"))
|
||||
assert remote["CFBundleIdentifier"] == info["CFBundleIdentifier"] + ".remote"
|
||||
assert remote["CFBundleShortVersionString"] == info["CFBundleShortVersionString"]
|
||||
assert remote["CFBundleVersion"] == info["CFBundleVersion"]
|
||||
assert remote["MinimumOSVersion"] == "27.0"
|
||||
assert remote["EXAppExtensionAttributes"]["EXExtensionPointIdentifier"] == "com.apple.nowplaying.remote-media"
|
||||
assert remote["MusicBridgeSharedKeychainGroup"] == info["MusicBridgeSharedKeychainGroup"] == "ru.yukinoki.musicbridge.remote-control"
|
||||
binary = archive.read(remote_path + remote["CFBundleExecutable"])
|
||||
assert struct.unpack_from("<II", binary) == (0xFEEDFACF, 0x0100000C)
|
||||
offset, platforms = 32, []
|
||||
for _ in range(struct.unpack_from("<I", binary, 16)[0]):
|
||||
command, size = struct.unpack_from("<II", binary, offset)
|
||||
assert size >= 8 and offset + size <= len(binary)
|
||||
if command == 0x32:
|
||||
platforms.append(struct.unpack_from("<I", binary, offset + 8)[0])
|
||||
offset += size
|
||||
assert platforms == [2], "Remote extension is not built for iOS devices"
|
||||
print(f"PASS: {path.name}: valid IPA, iPhoneOS ARM64, iOS 17+, ru.yukinoki.musicbridge.")
|
||||
print("PASS: embedded WidgetKit extension, matching version, ARM64 iPhoneOS and Live Activities support.")
|
||||
print("Requires local signing with Sideloadly before installation on an iPhone.")
|
||||
print("PASS: embedded iOS 27 NowPlaying ExtensionKit extension and matching shared Keychain metadata.")
|
||||
print("Requires signing all extensions and shared Keychain entitlements before installation.")
|
||||
|
||||
Reference in New Issue
Block a user